Node.js中使用MySQL
一 安装MySQL
在Node.js中使用MySQL,需要先安装MySQL模块
npm install mysql
cnpm install mysql //使用淘宝镜像安装
安装完成之后,可以在www.npmjs.com查看文档说明。
二 在Node.js中的基本使用
以下是使用连接池方式连接MySQL数据库
let mysql = require('mysql')
var pool = mysql.createPool({
connectionLimit: 100, //最大连接数
host: '127.0.0.1', //数据库地址
user: 'root', //用户名
password: '******', //密码
database: 'db_name', //数据库名称
multipleStatements: true //是否允许返回多个数据集
});
//监听release事件
pool.on('release', function (connection) {
console.log('释放连接池:' + connection.threadId);
console.log('---------------------' + moment().format("YYYY-MM-DD HH:mm:ss") + '----------------------');
});
//封装查询方法
//参数说明:
//sql,即sql语句,可以使用?占位符,
//sqlparam,sql中?占位符的值,防止sql注入,数组类型
//cb,即callback,回调函数
exports.getList_data = function (sql, sqlparam, cb) {
//连接数据库
pool.getConnection(function (err, connection) {
//执行sql
connection.query(sql, sqlparam, function (err, result, fields) {
//释放连接,释放连接时会出发release事件,可用于监听sql的执行情况
connection.release();
if (err) {
console.log(err);
}
cb(result);
})
});
}
注意,Node.js中的MySQL模块,增删改查操作都使用query方法执行,result中包含返回的各类数据
查询时返回Json数组格式的数据集。
增删改时返回一个对象,对象中包含了sql的执行状况及受影响行数。
三 存储过程的使用
以上边封装的mysql查询方法为例,以下是一个调用存储过程的例子
index.post('/get_list', (req, res) => {
let b = req.body
let sql = ` call get_student(?,?);` //调用 存储过程,存储过程的参数使用占位符占位
let sqlparam = [b.name, b.sex]
db.getList_data(sql, sqlparam, cb => {
console.log(cb[0])
console.log(cb[1]);
res.send(cb)
})
})
存储过程示例
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_student`(
in s_name VARCHAR(20),
in s_sex int
)
begin
-- like 使用关键函数,使用 concat 拼接为字符串
select * from student where name like concat('%',s_name,'%') and sex=s_sex;
select count(*) as total from student where name like concat('%',s_name,'%') and sex=s_sex;
end
执行结果中,result[0]为第一条sql返回的数据集,result[1]为第二条sql返回的数据集,业务复杂时以此类推。
本来这里的存储过程使用了 out 参数用于接收第二条sql查询的数据总数,结果在实际使用中,发现无法读取到 out 返回的值。
究其原因,sql中的输出参数需要先在sql中定义一个变量,而Node.js中无法直接为mysql创建变量。
以下写法创建的变量 total 实际是在mysql中创建的变量,无法被Node.js读取到。即使创建了如下的变量,在sql的执行结果中也无法读取到。
let sql = ` call get_student(?,?,@total);`
故此放弃了这种写法,直接写了两条语句,MySQL模块支持返回多个数据集,因此从数据集中读取即可,只是没有 out 参数方便。
注意,mysql配置中 multipleStatements 属性的值为 true 时,才会返回多个数据集的结果。