今天又是学习 backend
的一天,也许这就是不务正业全面发展的前端开发🫠。
什么是驱动程序
自己总结的话,驱动程序就是设备和操作系统的内存打交道的一个工具。就好比各位重度网瘾患者游戏爱好者所购买的外设,是必须要安装驱动程序才能方便自己更好地沉迷游玩。
ok 现在分享点正经知识 Wiki 传送门:「驱动程序」
MySQL 的 Node.js 驱动程序
在 Node.js
中连接和操作 MySQL 数据库需要使用 MySQL 驱动程序。有几个可用的 MySQL 驱动程序,其中最常用的是 mysql2
和 mysql
。
话不多说,直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const mysql = require("mysql2/promise")
const pool = mysql.createPool({
host: "localhost",
user: "root",
password: "your password",
database: "companydb",
multipleStatements: true // 允许多个执行 sql
})
async function test(name) {
const sql = `SELECT * FROM employee WHERE \`name\` like concat('%', ?, '%');`
const [result] = await pool.execute(sql, [name]) // 依次指定 ? 位置的变量
console.log('result', result)
}
test("王")
此段代码中,有几点想谈一下
mysql2
mysql2 和 mysql 最大的区别就是 mysql2 很好地支持了 Promise
语法,所以开发者不用再搞那些头痛的回调函数了,并且 mysql2 支持流式查询,这意味着可以处理大量的查询结果而不需要将它们全部加载到内存中。这对于处理大型数据集非常有用。
连接池
连接池的出现,实际上就是避免多次不必要的数据库连接而导致服务器资源的浪费,所以将连接放在池中并再次使用,这样就不必建立新的连接。
SQL 注入
关于 SQL 注入,应该是每个互联网人都应该懂的知识。先买个关子,看上方的示例代码,为什么在 SQL 语句中不直接进行模板字符串的拼接而要通过 concat 进行拼接呢?
打个比方,用户通过一个输入框进行一个 SQL 的查询操作,正常的查询一般没啥问题,但别有用心的人万一输入一个 ;DELETE FROM Table WHERE id = 1
,使用模板字符串时,计算机会将这段字符串自动拼接到我们预先写好的 SQL 语句中,然后你会发现用户可以随心所欲操作数据库了!OMG 毫无疑问这是灾难性的。所以为了避免这种情况,使用 execute
(而非 )方法,并且使用 query
?
占位符值进行变量的替换。在底层代码中,mysql2
很好地在内部为我们通过变量的方式进行填充,并且会对 SQL 语句进行预编译,结构固定无法改动,所以很好地防范了 SQL 注入的攻击。