# mysql2 库
官方地址:https://github.com/sidorares/node-mysql2
// 导入模块
const mysql = require('mysql2')
// 创建一个数据库连接
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: 'mysql666',
database: 'db_1'
})
# 1、预处理
mysql2 支持 SQL 预处理,可以提高 mysql 服务端的编译性能(减少编译次数)、防止 SQL 注入(传入的?值不会被编写解析为 SQL)。
SQL 预处理语句提前传到了 mysql 服务端,可以提高 SQL 语句的复用率、防止外界 SQL 注入到原 SQL 语句中。
// 常规查询
connection.query(
'SELECT * FROM `users` WHERE `username` = "admin" AND `password` > "admin123" or 1=1',
function (err, results, fields) {
console.log(results) // 结果集
console.log(fields) // 额外的元数据(如果有的话)
}
)
// SQL预处理✨
connection.execute(
'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
['admin', '"admin123" or 1=1'],
function (err, results, fields) {
console.log(results) // 结果集
console.log(fields) // 额外的元数据(如果有的话)
}
)
# 2、连接池
连接池通过重用以前的连接来帮助减少连接到 MySQL 服务器所花费的时间,当你完成它们时让它们保持打开而不是关闭。
简单的说就是让
connection.destroy()
智能化。
// 导入模块
const mysql = require('mysql2')
// 创建连接池,设置连接池的参数
const connectionPool = mysql.createPool({
host: 'localhost',
port: 3306,
user: 'root',
password: 'mysql666',
database: 'db_1',
connectionLimit: 5
})
# 3、Promise 支持
当然执行 connectionPool.execute()是异步执行的,原有的 cb 回调方式可能会找出回调地狱问题。
mysql2 在 connection、connectionPool 上提供了一个
.promise()
函数
const promisePool = connectionPool.promise()
// 1、promise方式
promisePool
.execute('xxxx', ['xxx', 'xxx'])
.then((res) => {
const [rows, fields] = res
})
.catch((err) => {
console.log(err)
})
// 2、await/async
try {
const [rows, fields] = await promisePool.execute('xxxx', ['xxx', 'xxx'])
} catch (err) {
console.log(err)
}
# 优雅写法
- 连接池
const mysql = require('mysql2')
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
database: 'koa-project-template',
password: 'mysql666',
connectionLimit: 5
})
// 先进行连接测试
pool.getConnection((err, connection) => {
// 获取connect
if (err) {
console.log('获取连接失败~~~')
}
// 与数据库建立连接
connection.connect((err) => {
if (err) {
console.log('数据库连接失败~~~', err)
} else {
console.log('数据库连接成功!!!')
}
})
})
const connection = pool.promise()
module.exports = connection
- 预处理、Promise 支持
// service/user.service.js
const connection = require('../app/mysql2.js')
class userService {
async create(user) {
const { username, password } = user
const statement = `INSERT INTO t_user(username, password) VALUES(?, ?)`
const [result] = await connection.execute(statement, [username, password])
return result
}
}
module.exports = new userService()