使用需求
使用nodejs操作数据库时需要拼装各种sql语句字符串,当然你也可以使用各种orm框架,但学习成本比较高,针对一般的业务,自己封装一些常用的拼装sql工具足以应付。
下面讨论一下拼装where条件语句时的情况。
直接的处理方式
通常复杂一点的查询都会有多个where条件,并且各个条件有可能传也可能不传,比如说有两个条件的情况:
function createSql(search,state) {
let sql = ''
if (search !== undefined && state === undefined) {
sql = `where mac LIKE '%${search}%'`
}else if (search === undefined && state !== undefined) {
sql = `where state=${state}`
}else if (search !== undefined && state !== undefined) {
sql = `where mac LIKE '%${search}%' and state=${state}`
}
return sql
}
两个条件写了这么长,三个条件就。。。
封装成工具函数
封装成工具函数时一定要考虑其通用性,但是也要保证输入的参数是一个最简化的个体,满足使用需求即可,参数过于复杂就会让人很困惑,也失去了封装的意义。
最重要的还是抽象能力,写程序时经常听大神说要有抽象能力,可是自己始终就是处于一知半解的状态。这种情况下,必须抽象出一些规律来,不然按照常规方式写,就把自己坑死了。
经过思考,主要难点就是where和and拼接的时机,经过抽象,其实不管多少个参数,只有三种情况:
function createSql (search,state,projectId) {
let sqlSearch = `mac LIKE '%${search}%'`
let sqlState = `state=${state}`
let sqlProject = `projectId=${projectId}`
let whereArr = [
{val: search, sql: sqlSearch},
{val: state, sql: sqlState},
{val: projectId, sql: sqlProject}
]
let sqlWhere = createSqlWhere(whereArr)
let sql = `SELECT * FROM robot ${sqlWhere?sqlWhere:''} limit 0,10;`
return sql
}
function createSqlWhere(arr) {
let sql = ''
let _arr1 = arr.map(v => v.val)
let _arr = _arr1.filter(v=> {
let bool = !!v //这里有坑,传0会被过滤掉
return bool != false
})
if (_arr.length === 1) {
arr.forEach((v) => {
if (v.val) {
sql = `where ${v.sql}`
}
})
} else if (_arr.length > 1) {
let state = true
arr.forEach((v) => {
if (v.val && state) {
sql = `where ${v.sql}`
state = false
} else if (v.val && !state) {
sql += ` and ${v.sql}`
}
})
}
return sql
}
抽象过后的三种情况:
1.参数全空
2.只有一个参数
3.有多个参数
参数全空可以不用写,直接return出去就行,所以其实就只有两种情况。
这样一个通用的工具函数就写完了,在哪里都可以开心的使用了。
此函数没有写or语句,还有个小坑,自己动手改造,才能提高哦。