前言
马上服务外包决赛了,好久没有写东西了,大作业太多了,全是扯淡。
上一个创新创业管理项目交付了,昨天突然看见Criteria类如下
Criteria是一种比hql更面向对象的查询方式。
然后想到之前项目里自己采用的方法,惨不忍睹,今天重构一下连接数据库的想法。
实现思路
希望实现的目标:
// 新建与数据库表对应的实体类对象
let award = new AwardPojo()
// add方法添加需要筛选的条件
award.add({
award_name: '服务外包大赛'
})
// search方法根据add方法中的筛选条件查询数据,以Promise方式返回
award.search().then(res => {
console.log(res)
award.order()
})
- 构建父类
const isEmptyObj = require('./utils').isEmptyObj
const db = require('mysql')
const config = require('./config')
let pools = db.createPool({
user: config.db.user,
port: config.db.port,
password: config.db.password,
database: config.db.db,
host: config.db.host,
connectionLimit: 20
})
function DBInit(tb, _columns) {
if (tb) this.tableName = tb
if (_columns) this.columns = JSON.parse(JSON.stringify(_columns))
this.filter = {}
}
/**
*
* @param {添加筛选条件} _filter
*/
DBInit.prototype.add = function (_filter) {
for (let k in _filter) {
let v = _filter[k]
this.filter[k] = v
}
}
/**
* 查询数据库表
* @param {开始行数} start
* @param {结束函数} end
*/
DBInit.prototype.search = function (start, end) {
let sql = `select * from ${this.tableName}`
if (!isEmptyObj(this.filter)) {
let fq = `where `
for (let k in this.filter) {
let v = this.filter[k]
fq += `${k}='${v}' and `
}
fq = fq.slice(0, fq.length - 4)
sql += ` ${fq}`
}
if (start && end) {
sql += `limit ${start}, ${end}`
}
return new Promise((resolve, reject) =>{
pools.getConnection((err, connection) => {
let pojos = null
if (err) {
console.log(err)
reject(pojos)
}
connection.query(sql, (err, results) => {
connection.release()
if (err) {
console.log(err)
reject(pojos)
}
else {
resolve(results)
}
})
})
})
}
module.exports = DBInit
- 对于每张表构建不同的实体类继承自父类即可
const DBInit = require('../DBHelper')
function AwardPojo() {
let awardPOJO = {
award_id: '',
award_time: '',
award_name: '',
award_identity: '',
award_level: ''
}
DBInit.call(this, 'award', awardPOJO)
}
AwardPojo.prototype = new DBInit()
AwardPojo.prototype.constructor = AwardPojo
AwardPojo.prototype.order = function() {
console.log('order')
}
let award = new AwardPojo()
award.add({
award_name: '服务外包大赛'
})
award.search().then(res => {
console.log(res)
award.order()
})
结束
主要用到的知识点只有一个组合继承了,参考js原型链和面向对象的继承。
用mysql库的时候一定要调用release方法关闭链接!
网友评论