在Node.js中如何使用mysql2

  • Post author:
  • Post category:mysql


这篇内容我们将具体了解一下如何在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() 等的使用方法不变。



版权声明:本文为qq_45040919原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。