nodejs 封装mysql

mysql.js

const Pool = require('./pool');
const pool = Pool.init();

/**
 * 数据库模型
 */
class DB {
  /**
   * 构造方法
   */
  constructor(tableName) {
    this.tableName = tableName;
    this.pool = pool;
  }

  /**
   * 数据查询接口
   * @param tableName
   * @param idJson
   * @returns {Promise<any>}
   */
  fetchRow(idJson) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `SELECT * FROM ${tableName} WHERE ?`
      pool.query(sqlMod, idJson, function(error, results) {
        if (error) {
          reject(error)
        } else {
          if (results) {
            resolve(results.pop())
          } else {
            resolve(results)
          }
        }
      })
    })
  }

  /**
   * 取数据集合
   * @param idJson
   * @returns {Promise<any>}
   */
  fetchRows(idJson) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `SELECT * FROM ${tableName} WHERE ?`
      pool.query(sqlMod, idJson, function (error, results) {
        if (error) {
          reject(error)
        } else resolve(results)
      })
    })
  }

  /**
   * 数据插入接口
   * @param tableName
   * @param rowInfo
   * @returns {Promise<any>}
   */
  insert(rowInfo) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `INSERT INTO ${tableName} SET ?`
      pool.query(sqlMod, rowInfo, function(error, result) {
        if (error) reject(error)
        else resolve(result)
      })
    })
  }

  /**
   * 数据修改接口
   * @param tableName
   * @param idJson
   * @param rowInfo
   * @returns {Promise<any>}
   */
  update(idJson, rowInfo) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `UPDATE ${tableName} SET ? WHERE ?`
      pool.query(sqlMod, [rowInfo, idJson], function (error, result) {
        if (error) reject(error)
        else resolve(result)
      })
    })
  }

  /**
   * 数据删除接口
   * @param tableName
   * @param idJson
   * @returns {Promise<any>}
   */
  remove(idJson) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `DELETE FROM ${tableName} WHERE ?`
      pool.query(sqlMod, idJson, function (error, result) {
        if (error) reject(error)
        else resolve(result)
      })
    })
  }

  /**
   * 统计
   * @param idJson
   * @returns {Promise<any>}
   */
  count(idJson) {
    const { tableName, pool } = this
    return new Promise((resolve, reject) => {
      const sqlMod = `SELECT COUNT(*) as count FROM ${tableName} WHERE ?`
      pool.query(sqlMod, idJson, function (error, result) {
        if (error) reject(error)
        else resolve(result.pop())
      })
    })
  }

  /**
   * 自定义查询
   * @param sql
   * @returns {Promise<any>}
   */
  queryStr(sqlMod) {
    const { pool } = this
    return new Promise((resolve, reject) => {
      pool.query(sqlMod, function (error, result) {
        if (error) {
          reject(error)
        } else {
          resolve(result)
        }
      })
    })
  }

  /**
   * 复合查询
   * @param tableName
   * @param whereJson
   * @param orderByJson
   * @param limitArr
   * @param selectStr
   * @returns {Promise<any>}
   */
  fetchAll(tableName, selectStr, whereJson, orderByJson = '', limitArr = '') {
    const andWhere = whereJson['and']
    const orWhere = whereJson['or']
    const betArr = whereJson['between']
    const andArr = []
    const orArr = []

    for(const key in andWhere) {
      const snap = typeof andWhere[key] === 'string' ? '\"' : ''
      andArr.push(`\`${key}\` = ${snap}${andWhere[key]}${snap}`)
    }
    for(const key in orWhere) {
      const snap = typeof andWhere[key] === 'string' ? '\"' : ''
      orArr.push(`\`${key}\` = ${snap}${orWhere[key]}${snap}`)
    }

    const andStr = andArr.join(' and ')
    const orStr = orArr.join(' or ')
    const betStr = betArr ? `AND ${betArr[0]} BETWEEN ${betArr[1]} AND ${betArr[2]}` : ''

    const orderStr = orderByJson['type'] ? `order by ${orderByJson['key']} ${orderByJson['type']}` : ''
    const limitStr = limitArr.length > 0 ? `limit ${limitArr.join(',')}` : ''
    const sqlMod = `SELECT ${selectStr} FROM ${tableName} WHERE ${andStr} ${orStr} ${betStr} ${orderStr} ${limitStr}`

    return new Promise((resolve, reject) => {
      pool.query(sqlMod, function (error, results) {
        if (error) {
          reject(error)
        } else resolve(results)
      })
    })
  }
}

module.exports = DB

上面引用的pool.js

const mysql = require('mysql')
const config = require('../config/mysql')

class Pool {
  constructor() {
    this.pool = this.init()
  }

  init() {
    return mysql.createPool(config)
  }
}

module.exports = new Pool(config)

以上是在线运行项目,特意分享,网上大多都是2015年的文章,且没有新的方法,可以查看官方文档 mysql - npm

用pool.query 不用自己再去query 封装一层,去先建connect, 再查,再释放。

如要不相信可以下我的项目,自己部署跑一下,项目地址 新上线对应的后台接口Api Resetful 平台 wapman-admin https://github.com/xiejunping/wapman-admin

如果使用想一起参与学习与使用,请在下方加群 或加我微信号
18163680885

如果运行报错,随时可以在群里提问 QQ群 607631721

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

JDBC为什么要使用PreparedStatement而不是Statement

PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 Callab...

29010
来自专栏Hongten

Hibernate逆向工程原理_java版本

之前在一篇"Hibernate 逆向工程生成POJO类和映射文件"文章中,一位朋友提出了这样的问题:

941
来自专栏工科狗和生物喵

【计算机本科补全计划】Mysql 学习小计(2)

正文之前 昨天下午写了篇 Mysql学习小计,结果出乎意料的受欢迎?变相刺激了我多写点 Mysql?好吧,如尔所愿。我晚上反正还不知道学点啥,就把今天看的那个菜...

36111
来自专栏坚毅的PHP

mysql数据迁移hbase问题

无法直接dump,写了java多线程程序做迁移 问题1:Operation not allowed after ResultSet closed 裸jdbc语句...

3915
来自专栏琯琯博客

Yii2 学习笔记之数据库篇

4197
来自专栏张善友的专栏

SQL SERVER 2008 Hierarchyid数据类型

以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServe...

24110
来自专栏Ryan Miao

sqlite - java 初学

进来准备使用一种embedded database,即嵌入式数据库,方便随项目本地存储。目前学习打算是sqlite和H2。 document:http://ww...

3269
来自专栏java一日一条

JDBC为什么要使用PreparedStatement而不是Statement

PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(...

842
来自专栏Android点滴积累

Java操作Sqlite数据库-jdbc连接

Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.ba...

2687
来自专栏Java帮帮-微信公众号-技术文章全总结

JDBC基础入门(2)

其他关于C3P0的详细内容, 可参考C3P0主页. HikariCP HikariCP是另一款高性能/”零开销”/高品质的数据库连接池,据测试,其性能优于C3P...

2767

扫码关注云+社区

领取腾讯云代金券