1 MySQL模块
1.1 mysql模块概述
官方不提供任何数据库的访问模块,使用NPM下载第三方模块来实现MySQL数据库的访问
npm install mysql
//目录模块保存在当前目录下的node_modules子目录
数据库操作比较耗时,Node.js解释器不会等待SQL语句执行完成,而是指定一个"SQL操作执行完成后执行的回调函数",然后直接执行后续代码
1.2 普通数据库连接
//引入mysql模块
const mysql = require( ‘mysql’ );
//普通连接,options参数是一个对象,声明属性:
var conn = mysql.createConnection( options );
var conn = mysql.createConnection({
host:'127.0.0.1', //服务器域名/IP地址;
port:'3306', //端口号;
user:'root', //用户名;
password:'', //密码;
database:'tedu' //数据库名;
//charset:连接所用字符集
});
//执行连接
conn.connect();
connection.query(sql, callback);//sql表示要执行的SQL语句,callback回调函数用于获取SQL语句执行结果
connection.query('select * from emp', (err, result)=>{
if (err) throw err;
console.log(result);
});
//执行完所有sql语句后,关闭连接
conn.end();
1.3 数据库连接池
为提高数据库访问效率,可以一次性创建多个数据库连接,保存在一个"连接池"中,随用随取。
//创建连接池,除主机端口用户名密码数据库名之外还要设置连接池的大小
var pool = mysql.createPool({
host:'127.0.0.1',
port: '3306',
user: 'root',
password: '',
database: 'tedu',
connectionLimit: 20//设置连接池的数量
});
使用连接池的两种方法:
1.从连接池获取链接,执行SQL操作,然后释放连接(暂不使用)
2.直接向连接池提交SQL操作,由连接池提供并释放连接
pool.query(sql, (err, result)=>{
//处理执行结果
//无需释放连接
//返回的result是一个对象,描述了本次操作的结果
});
1.5 SQL注入漏洞
项目中直接将用户输入数据使用字符串拼接方式加入提交给数据库服务器执行的SQL语句会产生非常严重的安全风险——SQL注入漏洞
var sql = `SELECT * FROM user
WHERE uname='${n}' AND upwd='${p}' `;
1.6 ?占位符
使用?占位符填充SQL语句中的变量可以防止SQL注入漏洞:
//使用?来代替sql语句里的值
//在poo.query()方法中加入数组对sql语句里的?处按顺序赋值
pool.query('UPDATE users SET foo=?, bar=?, baz=? WHERE id=?',
['a', 'b', 'c', userId], (err, results)=>{
//...
});
//pool.query()以对象的形式插入数据
var person={...};
pool.query('insert into emp set ?',
[person], (err, results)=>{
//...
});
1.7 返回结果
-
获取自增ID Node.js提供方法获取刚刚执行的INSERT语句中的自增主键值:
pool.query('INSERT INTO posts SET ?', {title:'test'}, (err, result)=>{ if (err) throw err; console.log(result.insertId); });
-
获取影响的行数
Node.js提供result.affectedRows和result.changedRows属性获取DML语句(INSERT、DELETE、UPDATE)影响的行数
1.9 执行多条语句
创建连接时,声明multipleStatements属性为true,可以同时执行多条SQL语句