永远不要手撸SQL
SQL要手写吗?当然不是,我们可以根据功能进行各种封装,比如先封装一个添加 model 用的SQL。
添加语句
insert into tableName (字段名称) values (值)
可惜,不支持 set 的方式
然后我们可以依据 meta 和 model 来拼接这个SQL。
/**
* 实现添加数据的功能。拼接 insert 的 SQL语句
* @param { MySQLHelp } help 访问数据库的实例
* @param { Object } meta 表、字段
* @param { Object } model 数据
* @param { connection } cn 如果使用事务的话,需要传递开启事务时创建的连接对象
* @returns 添加记录的ID
* * meta 结构:
* * * tableName: '', 表名
* * * cols:{colName: '类型'}, josn 字段需要标记
* * model 结构:
* * * colName: value
*/
export default function addData(help, meta, model, cn = null) {
// 拼接添加用的SQL语句,
// 提交SQL语句
// console.log('addData,开始运行 :')
const myPromise = new Promise((resolve, reject) => {
// 记录字段名称
const colNames = []
// 记录字段对应的值
const colValues = []
// 记录字段对应的占位符合
const cols = []
// 变量对象,记录 key和 value
for (const key in model) {
colNames.push(key)
// 判断类型
if (typeof model[key] === 'object') {
colValues.push(JSON.stringify(model[key], null, 2))
} else {
colValues.push(model[key])
}
cols.push('?')
}
const sql = `INSERT INTO ${meta.tableName}
( ${colNames.join(',')} ) VALUES ( ${cols.join(',')} )`
// console.log('insertSQL:', sql)
help.query(sql, colValues, cn)
.then((res) => {
// 成功了,返回给调用者
resolve(res.insertId)
})
.catch((err) => {
reject(err)
})
})
return myPromise
}
这样我们就有了一个把 model 填入webSQL 的函数。
因为MySQL的字段类型可以是json,而前端的model又有可能会有子对象,那么在拼串的时候,判断了一下属性,如果是 Object,那么序列化一下。
添加结果如下:

使用方式
首先引入js,创建实例
// 测试webSQL的 add
import webSQL from '../../packages/nf-ws-indexeddb/help.js'
import addModel from '../../packages/nf-ws-indexeddb/data-add.js'
const info = {
dbName: 'test_websqldb',
ver: '1',
size: 2,
description: '测试一下新的封装方式'
}
const help = new webSQL(info)
然后定义meta和model
const meta = {
tableName: 't_table'
}
const model = {
a: '1111',
b: {
b1: 'b1',
b2: 'b2'
}
}
- 单独执行
addModel(help, meta, model).then((res) => {
console.log('添加完毕', res)
}).catch((err) => {
console.log('添加出现异常:', err)
})
- 事务执行
help.begin().then((cn) => {
model.a = '2222'
addModel(help, meta, model, cn).then((res) => {
console.log('添加完毕', res)
}).catch((err) => {
console.log('添加出现异常:', err)
})
model.a = '3333'
addModel(help, meta, model, cn).then((res) => {
console.log('添加完毕', res)
}).catch((err) => {
console.log('添加出现异常:', err)
})
})
执行结果:

组合还是继承?
上面那种写法是组合的方式,在基础的help上面组合了一个add的方法,help作为参数传入。
试着写了一下继承的方式,感觉怪怪的,算了不用了。
当然也可能是我实力不够,无法驾驭吧。
想好了,再说。。。
网友评论