# 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()
更新于 : 8/7/2024, 2:16:31 PM