获取记录,看似简单,其实也可以分为很多情况。
- 根据ID获取一条记录
- 根据查询条件获取记录
- 分页获取记录
- 各种统计查询,分组统计后的记录
- 多表关联的情况
这里先封装一个最简单的情况,根据ID获取记录,因为这个虽然简单,但是也是最常见最基础的一个功能。
sql
select * from table where id = 111
严格情况来说,应该避免使用 * ,要使用具体的字段名称,不过这里是前端的 webSQL,不用过于担心性能问题。
封装
/**
* 依据主键字段,获取记录
* @param { MySQLHelp } help 访问数据库的实例
* @param { Object } meta 表、字段
* @param { number|string } id 主键字段值
* @param { connection } cn 如果使用事务的话,需要传递开启事务时创建的连接对象
* @returns 添加记录的ID
* * meta 结构:
* * * tableName: '', 表名
* * * idKey: 'id', 主键字段名称
*/
export default function getData (help, meta, id, cn = null) {
const myPromise = new Promise((resolve, reject) => {
const sql = `SELECT * FROM ${meta.tableName} WHERE ${meta.idKey}=?`
help.query(sql, [id], cn)
.then((res) => {
// 成功了,返回给调用者
resolve(res)
})
.catch((err) => {
reject(err)
})
})
return myPromise
}
一般默认都是id,不过这里还是做了一下设置,可以通过 idKey 设置其他的字段名称。
使用
// 引入help
import { getModel } from '../../../packages/websql.js'
/**
* 实现获取记录服务
* @param {object} userInfo 当前登录人的信息
* @param {object} help 访问数据库的实例
* @param {objec} info 服务的 meta
* @param {object} model 占位用
* @param {number|string} id 记录ID
* @returns 返回新添加的记录的ID
*/
export default function getData (userInfo, help, info, model, id) {
return new Promise((resolve, reject) => {
getModel(help, info, id).then((model) => {
// 添加成功
console.log('获取数据:', model)
resolve({ model })
}).catch((err) => {
reject(err) // '获取一条数据出错!'
})
})
}
看着似乎很眼熟,差不多嘛,为啥要多折腾出来一层,直接用不香吗?
这个就要看封装的目的了。
第一次封装(数据库驱动),目的是封装 webSQL 的基础操作,核心是拼接 SQL 语句。
第二次封装(业务驱动),目的是提供meta,获取记录,就是一条 select 的语句,但是从哪个表里面获取呢?这个就是业务需求了。
另外这里还需要处理一下添加人、添加时间等信息。
基本就是这样,更上一层就是服务层了。
占位,就是为了服务层调用的时候,可以统一参数的位置。
当然可以有其他的解决方案。
网友评论