第十二节:Node通过mysql2连接MySQL数据库
一. 简介
1. 常用的库
mysql:最早的Node连接MySQL的数据库驱动;
mysql2:在mysql的基础之上,进行了很多的优化、改进; 【推荐使用】
2. mysql2简介
(1). mysql2兼容mysql的API,并且提供了一些附加功能
(2). 更快/更好的性能;
(3). Prepared Statement(预编译语句):
✓ 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
✓ 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行;
(4). 支持Promise,所以我们可以使用async和await语法
二. 基本使用
1. 基本用法
(1). 通过指令进行安装: 【npm install mysql2】
(2). 通过query方法进行查询
const mysql = require("mysql2");
//创建一个连接
const connection = mysql.createConnection({
host: "47.xx.xx.xx",
port: 3306,
database: "CoreFrameDB",
user: "root",
password: "xxxx",
});
// 1.基本查询
{
const statement = "SELECT * FROM `T_SysUser`;";
// DDL/DML/DQL/DCL
connection.query(statement, (err, values, fields) => {
if (err) {
console.log("查询失败:", err);
return;
}
console.log(values); // 查看结果
// console.log(fields); //字段相关信息
});
}
2. 预处理语句
(1).用途
A. 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行也只会编译一次,所以性能是更高的;
B. 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行
(2). 使用
通过调用excute方法,传入参数即可。
{
const statement =
"SELECT * FROM `T_SysUser` WHERE userSex = ? AND delFlag = ?;";
// 这里的【1,0】 就是上面sql中?位置的传值
connection.execute(statement, [1, 0], (err, values) => {
console.log(values); //返回查询结果
});
}
三. 连接池
mysql2给我们提供了连接池(connection pools);
连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用;
我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数
const mysql = require("mysql2");
// 1.创建一个连接池
const connectionPool = mysql.createPool({
host: "47.xx.xxx.xxx",
port: 3306,
database: "CoreFrameDB",
user: "root",
password: "xxx",
connectionLimit: 5,
});
// 2.执行一个SQL语句: 预处理语句
const statement =
"SELECT * FROM `T_SysUser` WHERE userSex = ? AND delFlag = ?;";
// 这里的【1,0】 就是上面sql中?位置的传值
connectionPool.execute(statement, [1, 0], (err, values) => {
console.log(values); //返回查询结果
});
四. promise写法
代码分享:
const mysql = require("mysql2");
const connectionPool = mysql.createPool({
host: "47.xx.xx.88",
port: 3306,
database: "CoreFrameDB",
user: "root",
password: "xxx",
connectionLimit: 5,
});
// 1. Promise写法
{
const statement =
"SELECT * FROM `T_SysUser` WHERE userSex = ? AND delFlag = ?;";
connectionPool
.promise()
.execute(statement, [1, 0])
.then(res => {
// console.log(res); //返回是一个数组,这个数组内部又包含两个数组,第一个数组是查询内容,第二个数组是字段名
// 所以通常对数组进行解构
let [values, fileds] = res;
console.log(values);
})
.catch(err => {
console.log(err);
});
}
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。