一、node操作mysql数据库
1) 安装mysql 模块
npm i mysql
node操作数据库需要四个步骤:
// 1 配置连接参数,创建连接
let connection = mysql.createConnection({
host:"localhost",
user:"root",
password:"",
database:"ujiuye"
})
// 2 调用 connect() 尝试连接数据库
connection.connect((err)=>{
if(err){
console.log( "连接失败:"+ err.stack );
return;
}
console.log("连接成功"+ connection.threadId );
})
// 3 执行CRUD 操作
// 查询操作
connection.query("select * from 班级",[],(err,results,fields)=>{
// console.log( results);
for(let item of results){
console.log(`班号:${item.班号},班主任:${item.班主任},班长:${item.班长}`);
}
})
// 4 关闭数据库连接,释放资源
connection.end();
2)注意, select 操作,成功后返回一个查询结果组成的json。
connection.query("select * from 班级",[],(err,results,fields)=>{
// console.log( results);
for(let item of results){
console.log(`班号:${item.班号},班主任:${item.班主任},班长:${item.班长}`);
}
})
3) 插入,修改、删除等操作结果 会返回一个对象:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 18,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
注意,如果参数错误,sql语句可能会成功执行,不会报错,但实际没有实现用户想要的删除效果。因此最好判断 对象中的affectedRows 如果大于0,才能确定确实执行了删除操作。
二、mysql执行数据操作的封装类db.js
1) 封装类的骨架
let mysql = require("mysql");
class Db{
constructor(){
}
// 返回一个链接对象,以备query()使用
initConn(){
}
// 执行数据库的CRUD操作
query(){
}
// 关闭连接,释放资源
close(){
}
}
let db = new Db();
module.exports = db;
2) 将外部配置属性作为模块导入
let mysql = require("mysql");
let dbconfig = require("./dbconfig");
class Db{
constructor({host="localhost",user="root",password="",prot=3306,database=""}){
this.options={
host,
user,
password,
database
}
}
// 返回一个链接对象,以备query()使用
initConn(){
}
// 执行数据库的CRUD操作
query(){
}
// 关闭连接,释放资源
close(){
}
}
let db = new Db(dbconfig);
module.exports = db;
3) 实现query( )方法,因为外部使用时想使用async...await ,因此 query()需要返回一个promise对象
let mysql = require("mysql");
let dbconfig = require("./dbconfig");
class Db{
constructor({host="localhost",user="root",password="",prot=3306,database=""}){
this.options={
host,
user,
password,
database
}
}
// 返回一个链接对象,以备query()使用
initConn(){
}
// 执行数据库的CRUD操作
query(){
this.connection = await this.initConn();
return new Promise((resolve,reject)=>{
this.connection.query(sql,arr,(err,result)=>{
if(!err){
resolve( result)
}else{
reject(err);
}
})
})
}
// 关闭连接,释放资源
close(){
}
}
let db = new Db(dbconfig);
module.exports = db;
4) query方法需要 connection对象, 而 connect() 又是一个异步,因此再次封装到promise中
let mysql = require("mysql");
let dbconfig = require("./dbconfig");
class Db{
constructor({host="localhost",user="root",password="",prot=3306,database=""}){
this.options={
host,
user,
password,
database
}
}
// 返回一个链接对象,以备query()使用
initConn(){
let conn = mysql.createConnection( this.options );
return new Promise((resolve,reject)=>{
conn.connect((err)=>{
if(!err){
resolve( conn )
}else{
reject(err)
}
})
})
}
// 执行数据库的CRUD操作
query(){
this.connection = await this.initConn();
return new Promise((resolve,reject)=>{
this.connection.query(sql,arr,(err,result)=>{
if(!err){
resolve( result)
}else{
reject(err);
}
})
})
}
// 关闭连接,释放资源
close(){
}
}
let db = new Db(dbconfig);
module.exports = db;
5) 实现close()方法。最终的代码:
let mysql = require("mysql");
let dbconfig = require("./dbconfig");
class Db{
constructor({host="localhost",user="root",password="",prot=3306,database=""}){
this.options={
host,
user,
password,
database
};
this.connection = null;
}
// 返回一个链接对象,以备query()使用
initConn(){
let conn = mysql.createConnection( this.options );
return new Promise((resolve,reject)=>{
conn.connect((err)=>{
if(!err){
resolve( conn )
}else{
reject(err)
}
})
})
}
// 执行数据库的CRUD操作
async query(sql,arr=[]){
this.connection = await this.initConn();
return new Promise((resolve,reject)=>{
this.connection.query(sql,arr,(err,result)=>{
if(!err){
resolve( result)
}else{
reject(err);
}
})
})
}
// 关闭连接,释放资源
close(){
this.connection.end();
}
}
let db = new Db(dbconfig);
module.exports = db;