我爱编程

Node.js关于数据库的一些想法

2018-05-26  本文已影响0人  Alander

前言

马上服务外包决赛了,好久没有写东西了,大作业太多了,全是扯淡。
上一个创新创业管理项目交付了,昨天突然看见Criteria类如下

Criteria是一种比hql更面向对象的查询方式。

然后想到之前项目里自己采用的方法,惨不忍睹,今天重构一下连接数据库的想法。

实现思路

希望实现的目标:

// 新建与数据库表对应的实体类对象
let award = new AwardPojo() 
// add方法添加需要筛选的条件
award.add({
    award_name: '服务外包大赛'
})  
// search方法根据add方法中的筛选条件查询数据,以Promise方式返回
award.search().then(res => {
    console.log(res)
    award.order()
})
  1. 构建父类
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
  1. 对于每张表构建不同的实体类继承自父类即可
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方法关闭链接!

上一篇 下一篇

猜你喜欢

热点阅读