Node操作MySQL数据库
- 列表项目
安装mysql模块
mysql模块是托管与npm上的第三方模块,它提供了在Node.js项目中连接和操作MySQL数据库的能力。
想要在项目中使用它,需要先运行如下命令,将mysql安装为项目的依赖包:
npm install mysql
- 配置mysql模块
在使用mysql模块操作MySQL数据库之前,必须先对mysql模块进行必要的配置,主要格式如下:
//导入mysql模块
const mysql = require('mysql')
const connection = mysql.createConnection({
})
//建立连接
connection.connect();
在建立连接时,可以设置以下选项:
host:连接到的数据库的主机名。(默认值:localhost)
port:要连接的端口号。(默认:3306)
user:需要认证的MySQL用户。
password:MySQL用户的密码。
database:用于此连接的数据库名称(可选)。
- 使用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注入。
连接池技术
上面使用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,
}