👾Node中操作MySQL

0 阅读3分钟

写在前面


大家好,我是一溪风月🌳,一名前端程序员,上篇文章我们学习了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执行相关的操作来进行数据的增删改查操作,在学习完这些之后我们就可以进行简单项目的开发了~