1 MySQL模塊
1.1 mysql模塊概述
官方不提供任何數據庫的訪問模塊,使用NPM下載第三方模塊來實現MySQL數據庫的訪問
npm install mysql
//目錄模塊保存在當前目錄下的node_modules子目錄
數據庫操作比較耗時,Node.js解釋器不會等待SQL語句執行完成,而是指定一個"SQL操作執行完成後執行的回調函數",然後直接執行後續代碼
1.2 普通數據庫連接
//引入mysql模塊
const mysql = require( ‘mysql’ );
//普通連接,options參數是一個對象,聲明屬性:
var conn = mysql.createConnection( options );
var conn = mysql.createConnection({
host:'127.0.0.1', //服務器域名/IP地址;
port:'3306', //端口號;
user:'root', //用戶名;
password:'', //密碼;
database:'tedu' //數據庫名;
//charset:連接所用字符集
});
//執行連接
conn.connect();
connection.query(sql, callback);//sql表示要執行的SQL語句,callback回調函數用於獲取SQL語句執行結果
connection.query('select * from emp', (err, result)=>{
if (err) throw err;
console.log(result);
});
//執行完所有sql語句後,關閉連接
conn.end();
1.3 數據庫連接池
爲提高數據庫訪問效率,可以一次性創建多個數據庫連接,保存在一個"連接池"中,隨用隨取。
//創建連接池,除主機端口用戶名密碼數據庫名之外還要設置連接池的大小
var pool = mysql.createPool({
host:'127.0.0.1',
port: '3306',
user: 'root',
password: '',
database: 'tedu',
connectionLimit: 20//設置連接池的數量
});
使用連接池的兩種方法:
1.從連接池獲取鏈接,執行SQL操作,然後釋放連接(暫不使用)
2.直接向連接池提交SQL操作,由連接池提供並釋放連接
pool.query(sql, (err, result)=>{
//處理執行結果
//無需釋放連接
//返回的result是一個對象,描述了本次操作的結果
});
1.5 SQL注入漏洞
項目中直接將用戶輸入數據使用字符串拼接方式加入提交給數據庫服務器執行的SQL語句會產生非常嚴重的安全風險——SQL注入漏洞
var sql = `SELECT * FROM user
WHERE uname='${n}' AND upwd='${p}' `;
1.6 ?佔位符
使用?佔位符填充SQL語句中的變量可以防止SQL注入漏洞:
//使用?來代替sql語句裏的值
//在poo.query()方法中加入數組對sql語句裏的?處按順序賦值
pool.query('UPDATE users SET foo=?, bar=?, baz=? WHERE id=?',
['a', 'b', 'c', userId], (err, results)=>{
//...
});
//pool.query()以對象的形式插入數據
var person={...};
pool.query('insert into emp set ?',
[person], (err, results)=>{
//...
});
1.7 返回結果
-
獲取自增ID Node.js提供方法獲取剛剛執行的INSERT語句中的自增主鍵值:
pool.query('INSERT INTO posts SET ?', {title:'test'}, (err, result)=>{ if (err) throw err; console.log(result.insertId); });
-
獲取影響的行數
Node.js提供result.affectedRows和result.changedRows屬性獲取DML語句(INSERT、DELETE、UPDATE)影響的行數
1.9 執行多條語句
創建連接時,聲明multipleStatements屬性爲true,可以同時執行多條SQL語句