1. 列表项目

安装mysql模块
mysql模块是托管与npm上的第三方模块,它提供了在Node.js项目中连接和操作MySQL数据库的能力。
想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:

npm install mysql
  1. 配置mysql模块
    在使用mysql模块操作MySQL数据库之前,必须先对mysql模块进行必要的配置,主要格式如下:
 //导入mysql模块
    const mysql = require('mysql')
    const connection = mysql.createConnection({
    
    })
    //建立连接
    connection.connect();
在建立连接时,可以设置以下选项:

host:连接到的数据库的主机名。(默认值:localhost)
port:要连接的端口号。(默认:3306)
user:需要认证的MySQL用户。
password:MySQL用户的密码。
database:用于此连接的数据库名称(可选)。

  1. 使用mysql模块操作MySQL数据库
    可以在对象(如connection、pool)上调用query()方法,格式如下:
    .query('SQL语句', function (error, results, fields) {});

error:发生的错误;
results:结果;
fields:字段,包含关于返回结果字段的信息(可选)。

//在使用占位符值时出现
.query(sqlString, values, function (error, results, fields){})

sqlString:SQL语句,包含占位符?
values:如果只有一个替换字符(?),且值不是null、undefined或数组,它可以直接作为.query的第二个参数传递;
callback:回调函数
注意:使用占位符可以过滤传入的值,防止SQL注入。

  1. 连接池技术
    上面使用mysql.createConnection()的方法有一个缺陷,就是每操作一张表就要建立一次连接对象,如果一个项目中有很多表,那就要和数据库创建很多次连接,再断开,效率很低,也容易出现问题。所以我们接下来就要学习数据库连接池技术。

    var pool = mysql.createPool(options);
    options 参数是一个对象,该对象中有很多属性配置,该对象的作用是用于指定该连接池中连接统一使用的各种选项。
    常见的选项如下:

connectionLimit:用于指定连接池中最大的链接数,默认属性值为10
queueLimit:用于指定允许挂起的最大连接数,如果挂起的连接数超过该数值,就会立即抛出一个错误,默认属性值为0.代表不允许被挂起的最大连接数。
multipleStatements :是否允许执行多条sql语句,默认值为false
host:数据库服务器的地址
user:连接数据库的用户名
password:连接数据库的密码
database:数据库名

const allConfig = require("../config")
const config = allConfig.database
const mysql = require("mysql")

const pool = mysql.createPool({
  host     :  config.HOST,
  user     : config.USERNAME,
  password : config.PASSWORD,
  database : config.DATABASE
})

调用end()方法终止连接

connection.end(function(err) {
      // The connection is terminated now
});

当完成使用池,必须结束所有的连接,否则Node.js事件循环将保持活动,直到连接被MySQL服务器关闭。如果要结束池中的所有连接,可以使用池中的end方法:如果在发送COM_QUIT包之前发生了一个致命的错误,一个err参数将被提供给回调函数,但是无论如何连接将被终止。end方法接受一个可选的回调函数,可以使用它来知道所有连接何时结束。

调用destroy()方法

connection.destroy();

从连接池中获取一个连接

pool.getConnection(function(err, connection) {
   //代码
})

err:该参数是指操作失败时的错误对象。
connection:该值为一个对象,代表获取到的连接对象。当连接失败时,该值为undefined。
释放连接对象(放回到连接池)

connection.release();

从连接池中移除连接对象
关闭连接并将其从池中删除,该池将在下一次需要连接时创建一个新连接

connection.destory();

关闭该连接池

pool.end();

对mysql 模块进行封装

const allConfig = require("../config")
const config = allConfig.database
const mysql = require("mysql")

const pool = mysql.createPool({
  host     :  config.HOST,
  user     : config.USERNAME,
  password : config.PASSWORD,
  database : config.DATABASE
})

let query = function( sql, values ) {

  return new Promise(( resolve, reject ) => {
    pool.getConnection(function(err, connection) {
      if (err) {
        resolve( err )
      } else {
        connection.query(sql, values, ( err, rows) => {

          if ( err ) {
            reject( err )
          } else {
            resolve( rows );
          }
          connection.release()
        })
      }
    })
  })

}

let createTable = function( sql ) {
  return query( sql, [] )
}


let findDataById = function( table,  id ) {
  let  _sql =  "SELECT * FROM ?? WHERE id = ? "
  return query( _sql, [ table, id] )
}


let findDataByPage = function( table, keys, start, end ) {
  let  _sql =  "SELECT ?? FROM ??  LIMIT ? , ?"
  return query( _sql, [keys,  table,  start, end ] )
}


let insertData = function( table, values ) {
  let _sql = "INSERT INTO ?? SET ?"
  return query( _sql, [ table, values ] )
}


let updateData = function( table, values, id ) {
  let _sql = "UPDATE ?? SET ? WHERE id = ?"
  return query( _sql, [ table, values, id ] )
}


let deleteDataById = function( table, id ) {
  let _sql = "DELETE FROM ?? WHERE id = ?"
  return query( _sql, [ table, id ] )
}


let count = function( table ) {
  let  _sql =  "SELECT COUNT(*) AS total_count FROM ?? "
  return query( _sql, [ table ] )
}

let findDataByCondition = function( table, paramMap) {
  let _condi = " where 1=1 ";
  let _param = new Array();
  _param.push(table);
  if(paramMap){
    for (let [key, value] of paramMap) {
      _condi += " and "+key+"= ? ";
      _param.push(value);
    }
  }
  let  _sql =  "SELECT * FROM ?? " + _condi;
  return query( _sql, _param )
}

let deleteDataByCondition = function( table, paramMap) {
  let _condi = " where 1=1 ";
  let _param = new Array();
  _param.push(table);
  if(paramMap){
    for (let [key, value] of paramMap) {
      _condi += " and "+key+"= ? ";
      _param.push(value);
    }
  }
  let  _sql =  "DELETE  FROM ?? " + _condi;
  return query( _sql, _param )
}
module.exports = {
  query,
  createTable,
  findDataById,
  findDataByPage,
  deleteDataById,
  insertData,
  updateData,
  count,
  findDataByCondition,
  deleteDataByCondition,
}

标签: none

添加新评论