在Node.js中如何使用mysql2

这篇内容我们将具体了解一下如何在Node.js如何连接MySQL,并对数据库进行操作。

mysql2相比mysqls的优势

mysql2的性能更高,支持PreparedStatement,多次查询性能更高,书写SQL更简单;自带Promise包装器,可以直接使用async/await语法;和大部分的mysqls库兼容。

连接数据库

首先,如果想使用mysql2,先安装,使用 npm 进行下载

npm i mysql2

连接数据库使用:mysql.createConnection(option)。其中 option 为连接数据库的配置项。如下为部分配置项:

  1. host:主机地址 (默认:localhost)
  2. user:用户名
  3. password:密码
  4. port:端口号 (默认:3306)
  5. database:数据库名
  6. charset:连接字符集(默认:‘UTF8_GENERAL_CI’,注意字符集的字母都要大写)
  7. connectTimeout :连接超时(单位:毫秒)
  8. multipleStatements:是否许一个query中有多个MySQL语句( 默认: false)

以上是部分配置项,我们使用语句创建一个连接:

const mysql = require('mysql2');
let connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
})

通过 query() 方法执行SQL语句

连接数据库之后,可以使用query()方法对数据库进行增删改查操作。具体的语法格式:connection.query(sql,params,callback)

  1. sql:表示具体的SQL语句,可以使用 PreparedStatement 防止SQL注入。
  2. params: 表示参数,使用方法如下例。
  3. callback:是一个回调函数,表示执行完成之后,返回结果。有三个参数(err, results, fields),分别表示错误信息,结果,表的字段信息。
//接上面的连接语句
connection.query(
    'select * from admin where', [],
    function(err, results, fields) {
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            return;
        }
        console.log(results);
        console.log(fields);
    }
)

也可以通过组装SQL语句,可以用??代替表名、字段、索引名;用?代替数据。具体实例如下所示:

connection.query(
    'select * from ?? where AdminID = ?', [admin, 1], 
    function(err, results, fields) {
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            return;
        }
        console.log(results);
    }
)

通过 execute() 方法执行SQL语句

execute()方法也是用于执行SQL语句的

connection.execute(
    'select * from admin where AdminID = ?', [2], 
    function(err, results, fields) {
        if (err) {
            console.log('[SELECT ERROR] - ', err.message);
            return;
        }
        console.log(results);
        // console.log(fields);
    }
)

execute()query()之间的区别:

  1. query是在node装SQL语句,而 execute 则是利用MySQL 的 PreparedStatement 机制来预编译SQL语句
  2. execute 的优势是数据库原生支持的预编译机制,性能更高
  3. query 的优势是更灵活,例如可以用??代替表名、字段、索引名;用?代替数据

连接池

通过重新使用以前的连接,连接池保持打开状态,而不是在完成连接后关闭,有助于减少连接到MySQL服务器的时间。具体的语法格式:mysql.createPool()。其中的参数和createConnection()中的参数基本相同,但是多了几个对连接池的设定:

  1. waitForConnections:表示连接超额是否等待
  2. connectionLimit:表示
  3. queueLimit:表示可以等待的连接的个数一次创建的最大连接数
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'test',
    password: "123456",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});

在创建完连接池之后,可以使用和createConnection()连接相同的方式使用池(使用pool.query()和pool.execute()。也可以通过连接池手动获取连接进行数据库操作。

pool.getConnection(function(err, conn) {
    conn.query(
            'select * from admin where AdminID =1', [1], // 'select * from admin' []
            function(err, results, fields) {
                if (err) {
                    console.log('[SELECT ERROR] - ', err.message);
                    return;
                }
                console.log(results);
            }
        )
    pool.releaseConnection(conn);//释放连接
})

使用 Promise

在之前通过query()execute()操作数据库时都是通过回调函数的形式获取放返回的数据。而我们可以使用Promise将异步转化为同步,以同步的方式来完成对数据库的操作。而在使用 Promise 时,又分为两种方式,一种是通过 async\await 来实现,一种是通过 promise() 函数来实现。个人认为 promise() 这种方式更加简单

通过async\await 和createConnection()的方式创建数据库操作
const mysql = require('mysql2/promise');
async function pro_createConnection() {
    let connection = await mysql.createConnection({
        host: "localhost",
        user: "root",
        password: "123456",
        database: "student",
        multipleStatements: true
    });

    let [results] = await connection.execute(
        'select * from admin where AdminID = ?', [1]
    )
    console.log(results);
}
pro_createConnection();
通过async\await 和createPool()的方式创建数据库操作
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});
async function pro_createPool() {

    let [results] = await pool.execute(
        'select * from admin where AdminID = ?', [1]
    )
    console.log(results);
}
pro_createPool
通过 promise() 函数和createConnection()的方式创建数据库操作
const mysql = require('mysql2');
let connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    multipleStatements: true
});
connection.promise().query('select * from admin where AdminID = ?', [1])
    .then(([rows, fields]) => {
        console.log(rows);
    })
    .catch(console.log)
    .then(() => connection.end());

通过 promise() 函数 和 createPool() 的方式创建数据库操作

const pool = mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "student",
    waitForConnections: true, //连接超额是否等待
    connectionLimit: 10, //一次创建的最大连接数
    queueLimit: 0 //可以等待的连接的个数
});
pool.promise().query('select * from admin where AdminID = ?', [1])
    .then(([rows, fields]) => {
        console.log(rows);
    })
    .catch(console.log)

在使用 Promise 完成数据库操作时,除了上述实例中需要添加的部分,其余部分,如创建连接和连接池,query() 和 execute() 等的使用方法不变。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值