封装 MySQL(五)封装 select —— getModel
2021-08-14 本文已影响0人
自然框架
获取记录,看似简单,其实也可以分为很多情况。
- 根据ID获取一条记录
- 根据查询条件获取记录
- 分页获取记录
- 各种统计查询,分组统计后的记录
- 多表关联的情况
这里先封装一个最简单的情况,根据ID获取记录,因为这个虽然简单,但是也是最常见最基础的一个功能。
sql
select * from table where id = 111
严格情况来说,应该避免使用 * ,要使用具体的字段名称,所以需要设置具体的显示字段。
封装
/**
* 通过ID,获取一条记录
* @param { MySQLHelp } help 访问数据库的实例
* @param { Object } info 表、字段
* @param { number|string } id 主键值
* @returns 添加记录的ID
* * info 结构:
* * * tableName: '', 表名
* * * IdName: '', 主键字段名
* * * cols:{colName: ''}, 需要显示的字段,可以写 *
* * id :主键值
*/
function getModel(help, info, id) {
const myPromise = new Promise((resolve, reject) => {
// 获取字段名称和值的数组
const sql = `SELECT ${Object.keys(info.cols).join(',')} FROM ${info.tableName} WHERE ${info.idKey} =? `
console.log('getModel --- sql:', sql)
help.query(sql, [id])
.then((res) => {
// 添加成功
// console.log('获取一条数据:', res)
resolve(res)
})
.catch((err) => {
// 出错了
console.log('获取一条数据失败了:', err)
reject(err)
})
})
return myPromise
}
module.exports = getModel
一般默认都是id,不过这里还是做了一下设置,可以通过 idKey 设置其他的字段名称。
使用
// 实现添加服务
// 引入help
const { getModel } = require('../../packages/mysql.js')
/**
* 实现获取记录服务
* @param {object} userInfo 当前登录人的信息
* @param {object} help 访问数据库的实例
* @param {objec} serviceInfo 服务的 meta
* @param {object} model 占位用
* @param {number|string} id 记录ID
* @returns 返回一条记录
*/
const getData = (userInfo, help, serviceInfo, model, id) => {
return new Promise((resolve, reject) => {
// 加载meta
modelName = serviceInfo.model
const info = require(`../../public/model/${modelName}.json`)
getModel(help, info, id).then((model) => {
// 添加成功
resolve({ model })
}).catch((err) => {
reject(err)
})
})
}
module.exports = getData
看着似乎很眼熟,差不多嘛,为啥要多折腾出来一层,直接用不香吗?
这个就要看封装的目的了。
第一次封装(数据库驱动),目的是封装 mySQL 的基础操作,核心是拼接 SQL 语句。
第二次封装(业务驱动),目的是提供meta,获取记录,就是一条 select 的语句,但是从哪个表里面获取呢?这个就是业务需求了。
基本就是这样,更上一层就是路由层了。
占位,就是为了服务层调用的时候,可以统一参数的位置。
当然可以有其他的解决方案。
最外面还有一个路由,负责做服务分发。
未完待续。。。
源码:
https://gitee.com/naturefw/node-services
https://gitee.com/naturefw/node-services/tree/master/packages