写在前面
大家好,我是一溪风月🌳,一名前端程序员,上篇文章我们学习了MySQL的查询操作,但是我们对SQL的操作仅仅是在客户端中进行的,但是在实际的项目中我们需要使用我们的Node服务来查询数据库,之后使用接口的方式将这个数据返回给前端页面,然后前端进行数据的展示,这篇文章我们将学习如何使用Node来连接MySQL并且进行查询,好了,让我们开始吧~
一.认识mysql2
在学习MySQL相关操作的时候我们所有的SQL语句都是在GUI工具中通过SQL语句来获取的,但是在真实开发中我们肯定是通过代码来获取完成所有操作的,那么我们如何才能在Node中进行SQL语句的执行哪?这里我们可以借助这两个库:
- mysql:最早的Node连接mysql的驱动。
- mysql2:在mysql的基础上进行了很多的优化和改进。
目前相对来说社区更加偏向于mysql2,mysql2兼容mysql的API,并且提供了一些附加功能
- 更快/更好的性能;
- Prepared Statement(预编译语句)防止SQL注入;
- 支持Promise,所以我们可以使用async和await语法。
二.使用mysql2
首先我们需要安装一个mysql2
npm install mysql2
mysql2的使用基本分为两个步骤:
- 第一步:创建连接(通过createConnection),并且获取连接对象
- 第二步:执行SQL语句即可(通过query)
是不是感觉还挺简单的,跟把大象放冰箱一样简单~
创建连接:
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: 'root',
database: 'coderhub'
})
执行 SQL:
const mysql = require('mysql2')
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: 'root',
database: 'coderhub'
})
const statement = 'SELECT * FROM `products`;'
connection.query(statement, (err, results, fileds) => {
console.log(err)
console.log(results)
console.log(fileds)
connection.destroy() // 关闭连接
})
然后我们就会查询到数据库中的数据
三.Prepared Statement
Prepared Statement(预编译语句):
- 提高性能:将创建的语句模块发送给MySQL,然后MySQL编译(解析、优化、转换)语句模块,并且存储它但是不执行,之后我们在真正执行时会给?提供实际的参数才会执行;就算多次执行,也只会编译一次,所以性能是更高的;
- 防止SQL注入:之后传入的值不会像模块引擎那样就编译,那么一些SQL注入的内容不会被执行;or 1 = 1不会被执行;
const statement = 'SELECT * FROM `products` WHERE price > ? AND brand = ?;'
connection.execute(statement,[1000,'华为'],(err,results)=>{
console.log(results);
})
四.Connection Pools
前面我们是创建了一个连接(connection),但是如果我们有多个请求的话,该连接很有可能正在被占用,那么我们是否需要每次一个请求都去创建一个新的连接呢?
- 事实上,mysql2给我们提供了连接池(connection pools)。
- 连接池可以在需要的时候自动创建连接,并且创建的连接不会被销毁,会放到连接池中,后续可以继续使用。
- 我们可以在创建连接池的时候设置LIMIT,也就是最大创建个数。
const mysql = require('mysql2')
const pool = mysql.createPool({
host: 'localhost',
port: 3306,
user: 'root',
password: 'root',
database: 'coderhub',
connectionLimit: 5,
})
const statement = 'SELECT * FROM `products` WHERE price > ? AND brand = ?;'
pool.execute(statement, [1000, '华为'], (err, results) => {
console.log(results)
})
然后我们执行一下代码,发现依然能够正常使用
五.Promise方式
目前在JavaScript开发中我们更习惯Promise和await、async的方式,mysql2同样是支持的
const mysql = require('mysql2')
const pool = mysql.createPool({
host: 'localhost',
port: 3306,
user: 'root',
password: 'root',
database: 'coderhub',
connectionLimit: 5,
})
const statement = 'SELECT * FROM `products` WHERE price > ? AND brand = ?;'
pool.promise().execute(statement, [1000, '华为']).then(([results, fileds]) => {
console.log(results)
})
六.总结
这篇文章到这里结束了🚎 这篇文章我们学习了如何使用mysql2来进行连接MYSQL执行相关的操作来进行数据的增删改查操作,在学习完这些之后我们就可以进行简单项目的开发了~