select 获取 model
同上,拼接 select
分页和查询
使用limit来分页。其他分页方式待定。
/** * 分页获取数据,可以查询 * @param { MySQLHelp } help 访问数据库的实例 * @param { Object } info 表、字段 * @param { Object } query 查询条件 * @param { Object } pager 数据 * @returns 添加记录的ID * * info 结构: * * * tableName:'', 表名 * * * cols:{colName: '类型'}, 需要显示的字段 * * query 结构(查询条件): * * * { colName: [401, 11] } 字段名称,查询方式,查询关键字 * * pager 结构: * * * pageSize: 20 // 一页显示多少条记录 * * * orderBy: { id: false } // 排序字段:字段名,false表示倒序。 * * * pageTotal: 100 // 符合查询条件的总记录数 * * * pageIndex: 1 // 显示第几页的记录,从 1 开始 */ asyncfunction getPager(help, info, query, pager) { console.log('开始分页 :') const myPromise = newPromise((resolve, reject) => { // 查询条件和查询参数 const { whereQuery, whereValue } = help._getWhereQuery(query) // 设置排序和分页 const { orderBy, limit } = help._getPager(pager) // 设置显示的字段 const showCol = Object.keys(info.cols) if (showCol.length === 0 ) {showCol.push('*')} // 拼接查询语句 const sql = `SELECT ${showCol.join(',')} FROM ${info.tableName} ${whereQuery} ${orderBy} ${limit}` console.log('select-sql:', sql, whereValue) help.query(sql, whereValue) .then((res) => { // 添加成功 resolve(res) }) .catch((err) => { // 出错了 console.log('分页获取记录失败了:', err) reject(err) }) }) return myPromise } function getCount(help, info, query) { returnnewPromise((resolve, reject) => { // 查询条件和查询参数 const { whereQuery, whereValue } = help._getWhereQuery(query) // 统计总数 const sql = `SELECT count(1) as count FROM ${info.tableName} ${whereQuery} ` console.log('count-sql:', sql, whereValue) help.query(sql, whereValue).then((re) => { resolve(re[0].count) }).catch((err) => { // 出错了 console.log('统计总记录数失败了:', err) reject(err) }) }) } module.exports = { getCount, getPager }
其他待定
以上仅仅是基础的增删改查的封装,SQL非常灵活,还有 group by、 级联查询、子查询等各种形式,这些以后再说。
因为每个功能都做成了单独的js文件,这样就可以遵守“对扩展开放对修改关闭”的开闭原则。
就是说,可以很方便的做扩展。
使用方式和测试
封装完毕,那么要如何使用呢?
MySQL使用与测试.png
使用和测试分为三个维度:是否使用事务、单条还是多条、是否await
- 单条操作,无事务;
- 添加、修改、删除获取的基础操作。
- 分页、查询等基础操作。
- 多条操作,有事务;
- 批量添加
- 主从添加
- 模拟转账
- 添加、修改、删除
- 回滚测试
- 事务的开启方式
- Promise 模式
- await 模式
- 多事务同时开始,测试干扰性
由于篇幅有限,这里先介绍基础使用方式。
基本使用方式
基于 model 的添加、修改、删除和获取 这里说的 model 是基于业务需求建立的,而不是基于表建立的。
首先引入封装的函数以及配置信息,建立实例:
// 引入help const { MySQLHelp, addModel, updateModel, deleteModel, getModel } = require('../packages/mysql.js') // 配置信息 const config = require('../public/config/mysql-test.json') // 实例 const help = new MySQLHelp(config)
然后建立实现添加、修改、删除和获取的函数:
// meta const meta = require('../public/model/10010-user.json') let newDataId = 0 // 添加数据的测试 const test_addData = (number) => { console.log('\n---- addModel ----') returnnewPromise((resolve, reject) => { // 要添加的数据 const model = { name: '测试基础添加数据-A-11', age: number } // meta.tableName = 'a' addModel(help, meta, model).then((newId) => { // 添加成功 console.log('外部添加新数据:', newId) newDataId = newId resolve() }) }) } // 修改数据的测试 const test_updateData = () => { console.log('\n---- updateModel ----') returnnewPromise((resolve, reject) => { // 要修改的数据 const model = { name: '测试基础添加数据-A-11--修改了', age: 300 } // meta.tableName = 'a' updateModel(help, meta, model, newDataId).then((count) => { // 添加成功 console.log('修改数据,影响行数:', count) resolve() }) }) } // 删除数据的测试 const test_deleteData = () => { console.log('\n---- deleteModel ----') returnnewPromise((resolve, reject) => { // meta.tableName = 'a' deleteModel(help, meta, newDataId).then((count) => { // 添加成功 console.log('删除数据,影响行数:', count) resolve() }) }) } // 获取数据的测试 const test_getData = () => { console.log('\n---- updateModel ----') returnnewPromise((resolve, reject) => { // meta.tableName = 'a' getModel(help, meta, newDataId).then((model) => { // 添加成功 console.log('获取model:', model) resolve(model) }) }) }
- addModel
传入需要的参数,然后可以得到新添加的记录的主键ID。
依次执行的测试
test_addData('51').then(() => { // 修改 return test_updateData() }).then(() => { // 获取 return test_getData() }).then(() => { // 删除 return test_deleteData() }).then(() => { help.close() })
执行结果:
运行结果