基于Node+MySQL实现CURD功能
作 者:Taylor
B站ID:Rong姐姐很可爱
时 间:2019年9月14日 下午17:30
1.场景
在使用node进行日常开发学习中,难免会进行数据库相关的增删改查功能,对于初学者而言,常见的数据库便是Mysql数据库,因此以下便是详细述说如何用Mysql2模块,在node语言的基础上完成CURD功能;
2.CRUD功能
在开发中几乎每天都要接触到数据库的CURD功能,所谓的CURD功能,即:C(create:数据创建)、U(update:数据更新)、R(read:数据读取)、D(delete:数据删除)四种功能,当然进阶还有所谓的多种查询、批量添加、批量数据更新等功能;
3.实现流程
-
数据库连接配置
// 不论是jdbc连接数据库,开始mysql2模块来连接数据库,都需要知道数据库的基本用户信息 const dbconfig={ // 主机IP地址 host:'127.0.0.1', port:3306, database:'test', user:'root', password:'123456', //以上为必须配置,还可以加一些额外的配置 waitForConnections:true, // 数据库连接限制 connectionLimit:10 }
-
引入mysql2=模块
// 也可以直接用mysql模块,只是myql2模块比较新 const mysql=require('mysql2');
-
创建连接
const connection=mysql.createConnection({ // 主机IP地址 host:'127.0.0.1', port:3306, database:'test', user:'root', password:'123456', //以上为必须配置,还可以加一些额外的配置 waitForConnections:true, // 数据库连接限制 connectionLimit:10 }) // 使用connection前,一定要打开连接 connection.connect(); // 使用connection后,一定要及时关闭连接; connection.end();
-
数据库操作
// 创建连接 const connection=mysql.createConnection(dbconfig); // 开连接, connection.connect(); // 定义sql,这里可以根据sql来具体区分执行什么操作 const sql='insert into table (..,..,..,) values (?,?,?)'; // 执行quer语句 connnection.query(sql,[参数数组],(err,result)=>{ if(err){ // 操作失败 } // 操作成功,result为结果 // 因为是回调方法,所以需要在回调方法执行完,在关闭 connection.end(); }); // 当然关于connection连接的关闭,也可以采用then语句 connnection.query(sql,[参数数组],(err,result)=>{ if(err){ // 操作失败 } // 操作成功,result为结果 }).then((connection)=>{ // 这里是等前面顺利执行完,在来执行 connection.end(); });
4.CRUD封装
通过前面数据库操作,可以很明显的体会到,可以根据定义sql语句的不用,具体来实现数据的增删改查甚至谁是批量查询、插入等高阶操作;
/**
* 定义方法来封装
* sql:需要操作的sql语句,自定义
* connection: 通过mysql2模块创建数据库连接
* params:执行sql语句需要使用到的参数,以数组的形式
*/
function dbUtils(sql,params,connection){
// 开连接
connection.connect();
// 具体调用,执行sql
connection.query(sql,params,(err,result)=>{
if(err){
// 操作失败
}
// 操作成功,可在执行完操作成功后的操作后,在关闭连接
....
connection.end();
});
}
// 使用的时候,直接调用就可以了;
5.CRUD进一步封装
可以看到上面的封装其实效果并不好,因为quer()方法执行的时候,是通过回调的方式,如果说需要在外部通过使用query()的返回值,根据返回值进一步操作的话,就明显的感觉上面的封装带来的弊端,因此可以用Promise对象来解决回调方法返回值的问题;
/**
* 进一步来封装
* sql:需要操作的sql语句,自定义
* connection: 通过mysql2模块创建数据库连接
* params:执行sql语句需要使用到的参数,以数组的形式
*/
function dbUtils(sql,params,connection){
const tempResult = new Promise((resolve,reject)=>{
// 开连接
connection.connect();
// 执行sql
connection.query(sql,params,(err,result)=>{
// 利用resolve、reject来处理result和err,向外抛,且二者自带return功能
if(err){
reject(err);
}
// 成功
resolve(result);
})
});
// 关闭连接
connection.end();
// 返回结果
return tempResult;
}
// 使用的时候,如果是reject(err)往外跑异常,则需要捕获
try{
const result=dbUtils(sql,params,connection);
if(result!==undefined){
// 执行成功,进行其他操作
}
}catch(err){
// 出错
}
// 就这样异步执行的回调函数就可以利用Promise对象转换为同步执行
6.进一步了解Priomise对象
Promise对象提供两个常见的resolve()、reject()方法 ;可以reject()方法来处理异常,向外抛出,用resolve()来处理正常操作对应的结果,当然,Promise()对象也提供了原型链的操作,用then()来处理获取resolve()方法返回的值,用catch()来捕获reject()方法抛出来的异常;
// 例如,定义一个Promise对象
let pormise=new Promise((resovle,reject)=>{
resovle(43);
});
promise.then(value=>{
console.log(value); //输出43
});
let promiseReject=new Promise((reject)=>{
reject(44);
})
promiseReject.then(value=>{
console.log(value); // 输出undefined
});
promiseReject.catch(err=>{
console.log(err); // 输出44
})
// 当然,Promise也支持链式写法
new Promise((resolve,reject)=>{
const result= function(value){
// 假设value有值
if(value%2===0){
resovle(1)
}
reject(0)
}
}).then(resolveValue=>{
// 获取resolve向外抛出来的数值;
console.log(resolveValue);// 输出1
}).catch(rejectValue=>{
// 捕获reject抛出的数值;
console.log(rejectValue);// 输出0
});