基於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
});