八 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 时,才会返回多个数据集的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值