文章目录
- Node的MySQL驱动
- 连接MySQL数据库
- 终止与MySQL的连接
- 执行数据库的操作(CRUD):调用query方法
- 防止sql注入式攻击
- 使用连接池
Node的MySQL驱动
Node.js的原生MySQL驱动库名为mysql。
MySQL2项目是原生MySQL驱动项目的升级版本,兼容mysql并支持其主要特性,提供新的特性:
- 更快更好的性能
- 预处理语句
- 对编码和排序规则的扩展支持
- Promise包装器
- SSL与认证开关
- 自定义流
安装MySQL2驱动(库名称为mysql2):npm install mysql2
连接MySQL数据库
显示建立连接
- 导入mysql2模块
- 调用createConnection方法创建数据库的连接对象
- 调用connect方法连接数据库
- 调用query方法执行sql查询
const mysql = require('mysql2');
// 创建到数据库的连接
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: '*****',
database: 'deyun'
});
// 连接数据库
connection.connect(function (err) {
if(err) {
console.log('连接错误:'+err.stack);
return;
}
console.log('连接ID:'+connection.threadId);
})
// 查询数据
connection.query('SELECT * FROM `admin`',function(err, results) {
console.log(results); // 结果包括由MySQL服务器返回的行
});
隐式建立连接:
- 导入mysql2模块
- 调用createConnection方法创建数据库的连接对象
- 调用query方法执行sql查询
const mysql = require('mysql2');
// 创建到数据库的连接
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: '*****',
database: 'deyun'
});
// 查询数据
connection.query('SELECT * FROM `admin`',function(err, results) {
console.log(results); // 结果包括由MySQL服务器返回的行
});
设置连接选项:
- host:连接的数据库地址,默认为localhost
- port:连接地址对应的端口,默认3306
- user:用于连接的MySQL用户名
- password:用户的密码
- database:所需连接的数据库名称
- charset:连接的编码形式(默认为utf8_general_ci),决定整理排序规则。
- timezone:MySQL服务器上配置的时区(默认local)。
- dateStrings:将强制日期类型(TIMESTAMP、DATETIME或DATE)作为字符串返回。
- connectTimeout:设置连接时,返回失败前的未响应等待时间。
终止与MySQL的连接
- 调用end方法
connection.end(function (err) {
//终止连接
})
- 调用destroy方法
connection.destroy();
执行数据库的操作(CRUD):调用query方法
查询记录:
.query(sqlString,callback)
connection.query('select * from employee where id = 46',function(err,results,fields) {
if(err) throw err;
console.log('---查询结果---');
console.log('查询结果:',results);
console.log('查询结果字段:',fields);
})
var sqlString = "select * from employee where address = '桃花岛'"
connection.query(sqlString,function(err,results,fields) {
if(err) {
console.log(err);
return;
};
console.log(results);
})
-
.query(sqlString,values,callback)
:参数values对应的是sqlString中的占位符?
var sqlString = "select * from employee where address = ?";
connection.query(sqlString,['桃花岛'],function(err,results,fields) {
if(err) {
console.log(err);
return;
};
console.log(results);
})
.query(options,callback)
connection.query({
sql: 'select * from employee where address=?',
values: '桃花岛'
},(err,result) => {
if(err) {
console.log(err);
return;
}
console.log(result);
})
connection.query({
sql: 'select * from employee where gender=? and address=?',
values: ['女','桃花岛']
},(err,result) => {
if(err) {
console.log(err);
return;
}
console.log(result);
})
增加记录:
var addSql = "insert into employee(name,gender,birthday,phone,address) values(?,?,?,?,?)";
var addSql_params = ['张三丰','男','1901-12-13','12345678988','武当山'];
connection.query({
sql: addSql,
values: addSql_params
},(err, result) => {
if (err){
console.log(err);
return;
}
console.log('插入记录的id:'+result.insertId);
console.log('插入结果:'+result);
})
修改记录:
var updateSql = "update employee set birthday=?,address=? where id=?";
var updateSql_params = ['1910-10-10','西安',35];
connection.query({
sql: updateSql,
values: updateSql_params
},(err, result) => {
console.log('受影响的行数:'+result.affectedRows);
console.log('改变的行数:'+result.changedRows);
})
删除记录:
var delSql = "delete from employee where id=?";
connection.query(delSql,39,(err, result) => {
if (err){
console.log(err);
return;
}
console.log("删除的行数:"+result.affectedRows);
});
防止sql注入式攻击
- 使用占位符?
- 使用connection.escape([参数字段])对值进行转义
var sorter = 'date'; //这是一个列名
var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);
connection.query(sql, function(err, results) {
// ...
});
使用连接池
const mysql = require('mysql2');
//创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'abc123',
database: 'testmydb',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
//使用连接池
pool.query('SELECT * FROM 'bookinfo' ', function (err, results, fields) {
console.log('查询结果:',results);
});