这篇内容我们将具体了解一下如何在Node.js如何连接MySQL,并对数据库进行操作。
mysql2相比mysqls的优势
mysql2的性能更高,支持
PreparedStatement
,多次查询性能更高,书写SQL更简单;自带Promise包装器,可以直接
使用async/await语法
;和大部分的mysqls库兼容。
连接数据库
首先,如果想使用mysql2,先安装,使用 npm 进行下载
npm i mysql2
连接数据库使用:
mysql.createConnection(option)
。其中 option 为连接数据库的配置项。如下为部分配置项:
- host:主机地址 (默认:localhost)
- user:用户名
- password:密码
- port:端口号 (默认:3306)
- database:数据库名
- charset:连接字符集(默认:‘UTF8_GENERAL_CI’,注意字符集的字母都要大写)
- connectTimeout :连接超时(单位:毫秒)
- 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)
- sql:表示具体的SQL语句,可以使用 PreparedStatement 防止SQL注入。
- params: 表示参数,使用方法如下例。
- 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()
之间的区别:
- query是在node装SQL语句,而 execute 则是利用MySQL 的 PreparedStatement 机制来预编译SQL语句
- execute 的优势是数据库原生支持的预编译机制,性能更高
- query 的优势是更灵活,例如可以用??代替表名、字段、索引名;用?代替数据
连接池
通过重新使用以前的连接,连接池保持打开状态,而不是在完成连接后关闭,有助于减少连接到MySQL服务器的时间。具体的语法格式:
mysql.createPool()
。其中的参数和
createConnection()
中的参数基本相同,但是多了几个对连接池的设定:
- waitForConnections:表示连接超额是否等待
- connectionLimit:表示
- 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()
的方式创建数据库操作
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()
的方式创建数据库操作
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()
的方式创建数据库操作
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() 等的使用方法不变。