1. 简介
在node.js中,被广泛使用的mysql数据库,为方便使用,实现了多个别名方法,用来减少sql语句的书写以及符合node.js异步回调的编程风格,但是使用这些别名方法时,难免会出现语句的错误或者需要自定义sql语句的情况,那么如何在node.js中封装mysql,简化语句书写, 防止sql注入,提高代码可读性和可维护性呢?那么这篇文章就是写来解决这个问题的。
2. 安装依赖
在开始写代码前,我们先要明确需要安装哪些npm包。
2.1 mysql
mysql是连接mysql数据库的node.js驱动,是node.js中最受欢迎的mysql数据库驱动程序。
npm install mysql --save
3.封装mysql处理语句
我们来封装一个mysql处理语句的类,这样可以创建不同的对象,每一个对象都对应一个连接。
3.1 创建db类
我们创建一个db.js文件,用于封装mysql处理语句的代码:
const mysql = require('mysql');
const config = require('../config/config');
class DB {
constructor() {
// 1. 创建连接
this.connection = mysql.createConnection({
host: config.host,
user: config.user,
password: config.password,
database: config.database
});
// 2. 连接
this.connection.connect(function(error) {
if (error) {
console.log('mysql连接失败:' + error.stack);
return;
}
console.log('mysql连接成功,id:' + connection.threadId);
});
}
query(sql, values, callback) {
// 防止sql注入
this.connection.query(sql, values, function(error, results, fields) {
// 请求异常
if (error) {
console.log('error:' + error.stack);
callback(error.stack);
return;
}
// 请求正常
callback(null, results);
});
}
// 关闭连接
end() {
this.connection.end();
}
}
module.exports = DB;
3.2 使用db类
接下来我们来演示一下db类的使用方法。
3.2.1 增加一条数据
假设我们要往user表中增加一条数据:
const DB = require('./db');
const db = new DB();
const user = {
name: 'Lena',
age: 20,
gender: 'female'
};
let sql = `INSERT INTO user (name,age,gender) VALUES(?,?,?)`;
let values = [user.name, user.age, user.gender];
db.query(sql, values, function(error, results) {
if (error) {
console.log(error.stack);
return;
}
console.log(`成功插入 ${results.affectedRows} 条数据`);
});
db.end();
3.2.2 删除一条数据
假设我们要从user表中删除一条数据:
const DB = require('./db');
const db = new DB();
let sql = `DELETE FROM user WHERE id = ?`;
let values = [1]; // 如果不知道id,可以通过查询语句获取
db.query(sql, values, function(error, results) {
if (error) {
console.log(error.stack);
return;
}
console.log(`成功删除 ${results.affectedRows} 条数据`);
});
db.end();
3.2.3 修改一条数据
假设我们要修改user表中一条数据:
const DB = require('./db');
const db = new DB();
const user = {
name: 'Cathy',
age: 18,
gender: 'female'
};
let sql = `UPDATE user SET name=?,age=?,gender=? WHERE id = ?`;
let values = [user.name, user.age, user.gender, 1]; // 如果不知道id,可以通过查询语句获取
db.query(sql, values, function(error, results) {
if (error) {
console.log(error.stack);
return;
}
console.log(`成功修改 ${results.affectedRows} 条数据`);
});
db.end();
3.2.4 获取数据列表
假设我们要从user表中获取数据列表:
const DB = require('./db');
const db = new DB();
let sql = `SELECT * FROM user WHERE id > ?`;
let values = [0]; // 从id>0开始
db.query(sql, values, function(error, results) {
if (error) {
console.log(error.stack);
return;
}
console.log(`总共查询到 ${results.length } 条数据`);
});
db.end();
4. 总结
通过上面的代码封装,我们可以很方便地对mysql进行操作,而且也很容易扩展。但是要注意在使用Mysql的操作时,为了提高代码的安全性,需要防止sql注入,如果不了解防注入的知识,可以先去学习一下。