node連接MySQL數(shù)據(jù)庫(kù)的3種方式總結(jié)
以下我們將說(shuō)明node連接數(shù)據(jù)庫(kù)的三種方式,并進(jìn)行利弊說(shuō)明,以挑選出最適合項(xiàng)目的連接方式。
1.使用mysql包的提供的接口進(jìn)行連接
例如:
connection.query('SELECT * FROM users WHERE id = ?', ['123'], function(err, rows) {
if (err) {
// error
} else {
for (let row in rows) {
processRow(row);
}
}
});
這種方法較為底層,且每次操作數(shù)據(jù)庫(kù)都需要新建數(shù)據(jù)庫(kù)連接,若數(shù)據(jù)庫(kù)操作需求多,對(duì)服務(wù)器消耗較大,因此,可以使用第二種連接方式。
2.建立數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè);釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接來(lái)避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。
通俗的理解就是: 數(shù)據(jù)庫(kù)連接池是程序啟動(dòng)時(shí)建立足夠數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象,并將這些連接對(duì)象組成一個(gè)池,由程序動(dòng)態(tài)的對(duì)池中的連接對(duì)象進(jìn)行申請(qǐng)、使用和釋放。
優(yōu)點(diǎn)
1.避免應(yīng)用程序頻繁的連接、斷開(kāi)數(shù)據(jù)庫(kù)
2.提供數(shù)據(jù)庫(kù)連接對(duì)象的使用頻率。
創(chuàng)建方式
1.創(chuàng)建連接池
mysql.createPool(config)
host:數(shù)據(jù)庫(kù)服務(wù)器的地址
port: 端口號(hào)
user:連接數(shù)據(jù)庫(kù)的用戶名
password:連接數(shù)據(jù)庫(kù)的密碼
database:數(shù)據(jù)庫(kù)名
connectionLimit:用于指定連接池中最大的鏈接數(shù),默認(rèn)屬性值為10.
multipleStatements :是否允許執(zhí)行多條sql語(yǔ)句,默認(rèn)值為false
2.從連接池獲取一個(gè)連接
連接池名.getConnection(function(err,connection){
執(zhí)行的代碼
})
//參數(shù)err:錯(cuò)誤對(duì)象。連接失敗后的錯(cuò)誤信息
//參數(shù)connection:連接對(duì)象。若連接失敗,它就是undefined3.釋放連接對(duì)象(將連接對(duì)象放回連接池): connection.release()
4.從連接池中移除連接對(duì)象: connection.destory()
5.關(guān)閉該連接池: 連接池名.end();
3.數(shù)據(jù)庫(kù)訪問(wèn)中的ORM——sequelize模塊 ORM
考慮到數(shù)據(jù)庫(kù)表是一個(gè)二維表,包含多行多列,每一行可以用一個(gè)JavaScript對(duì)象表示。這就是傳說(shuō)中的ORM技術(shù):Object-Relational Mapping(對(duì)象關(guān)系映射),把關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射到對(duì)象上。
ORM的特點(diǎn):
- 可以提高開(kāi)發(fā)的效率
- 不用直接寫(xiě)SQL語(yǔ)句 sequelize
基于promise的關(guān)系型數(shù)據(jù)庫(kù)ORM框架,這個(gè)庫(kù)完全采用JavaScript開(kāi)發(fā)并且能夠用在Node.JS環(huán)境中,易于使用,支持多SQL方言(dialect)。它當(dāng)前支持MySQL、MariaDB、SQLite、PostgreSQL、Sql Server 數(shù)據(jù)庫(kù)。
sequelize的特點(diǎn):
強(qiáng)大的模型定義,支持虛擬類型。
支持完善的數(shù)據(jù)驗(yàn)證,減輕前后端的驗(yàn)證壓力。
Sequelize的查詢非常全面和靈活。
sequelize的使用
- 安裝sequelize:npm install sequelize 必須先安裝mysql的驅(qū)動(dòng)模塊(npm install mysql)
- 連接數(shù)據(jù)庫(kù):創(chuàng)建sequelize的對(duì)象
//導(dǎo)入mysql模塊
const mysql = require('mysql2');
//導(dǎo)入sequelize模塊
const Sequelize = require('sequelize');
//創(chuàng)建sequelize對(duì)象,參數(shù)分別為:數(shù)據(jù)庫(kù)名稱,數(shù)據(jù)庫(kù)類型,密碼,配置
var MySequelize = new Sequelize('spj','root','929TJ813',{
host:'localhost',
port:3306,
dialect:'mysql', //數(shù)據(jù)庫(kù)類型
pool:{ //數(shù)據(jù)庫(kù)連接池
max:20, //最大連接對(duì)象的個(gè)數(shù)
min:5, //最小連接對(duì)象的個(gè)數(shù)
idle:1000 //最長(zhǎng)等待時(shí)間,單位為毫秒
}
})
module.exports = MySequelize ; //導(dǎo)出創(chuàng)建的sequelize對(duì)象
創(chuàng)建數(shù)據(jù)模型:數(shù)據(jù)模型是一個(gè)類,對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中一張表
const Sequelize =require('sequelize')
const MySequesize = require('../config/dbconfig'); //導(dǎo)入創(chuàng)建的sequelize對(duì)象
//創(chuàng)建StudentModel模型,該模型對(duì)應(yīng)的表名是student
var StudentModel = MySequesize.define('users',{
sid:{
type:Sequelize.INTEGER, //表示屬性的數(shù)據(jù)類型
field:'s_id', //屬性對(duì)應(yīng)的列名,若不定義field則表中的列名(sid)就是屬性名
primaryKey:true, //表示主鍵
autoIncrement:true //表示主鍵自增
},
sname:{
type:Sequelize.STRING(50),
field: 's_name',
allowNull:false, //表示當(dāng)前列是否允許為空,false表示該列不能為空
//unique:true //表示該列的值必須唯一
},
sgender:{
type:Sequelize.STRING(4),
field:'s_gender',
allowNull: false
},
sbirthday:{
type:Sequelize.DATE,
field:'s_birthday',
allowNull:false
},
saddress:{
type:Sequelize.STRING(100),
field:'s_address',
allowNull:false
},
sage:{
type:Sequelize.INTEGER,
field:'s_age',
allowNull:false
}
},{
freezeTableName:true, //true表示使用給定的表名,false表示模型名后加s作為表名
timestamps:false //true表示給模型加上時(shí)間戳屬性(createAt、updateAt),false表示不帶時(shí)間戳屬性
})
//同步數(shù)據(jù)庫(kù),force的值為false,表若存在則先刪除后創(chuàng)建,force的值為true表示表若存在則不創(chuàng)建
var users = StudentModel.sync({force:false});
module.exports = StudentModel; //導(dǎo)出模型
使用sequelize實(shí)現(xiàn)增刪改查 。
const StudentModel = require('../../db/model/StudentModel');
const Sequelize = require('sequelize')
//插入數(shù)據(jù)
StudentModel.create({
sname:'關(guān)羽',
sgender:'男',
sbirthday:'1998-12-28',
saddress:'陜西寶雞'
}).then(result=>{
console.log("插入成功!",result);
}).catch(err=>{
console.log("插入失??!",err);
})
//查詢數(shù)據(jù)
StudentModel.findAll({
raw:true //查詢出來(lái)只有需要的數(shù)據(jù),沒(méi)有別的內(nèi)容
}).then(data=>{
console.log(data);
})
//刪除記錄
StudentModel.destroy({
where:{
sid:2
}
}).then(result=>{
console.log("刪除成功!",result)
}).catch(err=>{
console.log("刪除失敗!",err);
})
//更新記錄
StudentModel.findOne({
where:{
sid:3
}
}).then(users=>{
users.update({
sname:'張飛',
sgender:'男'
}).then(result=>{
console.log("更新成功!",result)
}).catch(err=>{
console.log("更新失??!",err);
})
}).catch(error=>{
console.log("查無(wú)此人!",error);
})
//查詢部分字段
StudentModel.findAll({
attributes:['sname','saddress'],
raw:true
}).then(result=>{
console.log(result);
}).catch(err=>{
console.log(err);
})
//聚合函數(shù)
StudentModel.findAll({
attributes:[[Sequelize.fn('COUNT',Sequelize.col('s_id')),"記錄總數(shù)"]], //col里面必須放的是列名
raw:true
}).then(result=>{
console.log(result)
})
使用sequelize實(shí)現(xiàn)模糊查詢等內(nèi)容。
const StudentModel = require('../../db/model/StudentModel');
const Op = require('sequelize').Op; //引入sequelize模塊的Op操作符
//模糊查詢
StudentModel.findAll({
where:{
sname:{
[Op.like]:'張%'
}
},
raw:true
}).then(result=>{
console.log(result);
})
//between:查詢年齡在12到18之間的人的信息
StudentModel.findAll({
where:{
sage:{
[Op.between]:[12,18]
}
},
raw:true
}).then(result=>{
console.log(result);
})
//in:查詢地址是'陜西西安‘和'陜西商洛‘的記錄
StudentModel.findAll({
where:{
saddress:{
[Op.in]:['陜西西安','陜西商洛']
}
},
order:[
['sage','desc'] //查詢結(jié)果按照sage的降序排列
],
raw:true
}).then(result=>{
console.log(result);
})
//and和or:查詢性別為'男‘,并且地址是‘陜西寶雞'的記錄
StudentModel.findAll({
where:{
[Op.and]:[ //把a(bǔ)nd改為or即為或時(shí)間
{
sgender:{
[Op.eq]:'男'
}
},
{
saddress:{
[Op.eq]:'陜西寶雞'
}
}
]
},
raw:true
}).then(result=>{
console.log(result);
})
//limit和offset:分頁(yè)查詢
StudentModel.findAll({
limit:3, //查詢的記錄數(shù)
offset:1, //從索引值為幾的記錄開(kāi)始查詢(查詢的起始位置),所有數(shù)據(jù)的索引值從0開(kāi)始
raw:true
}).then(result=>{
console.log(result);
})
參考鏈接:http://www.dhdzp.com/article/258390.htm
總結(jié)
到此這篇關(guān)于node連接MySQL數(shù)據(jù)庫(kù)的3種方式的文章就介紹到這了,更多相關(guān)node連接MySQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Node.js中使用Swagger自動(dòng)生成API接口文檔
這篇文章主要給大家介紹了如何在Node.js項(xiàng)目中使用 Swagger 來(lái)自動(dòng)生成 API接口文檔,使用生成方式有很多種,本文基于swagger-jsdoc+swagger-ui-express快速實(shí)現(xiàn),文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
node 文件上傳接口的轉(zhuǎn)發(fā)的實(shí)現(xiàn)
這篇文章主要介紹了node 文件上傳接口的轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法
這篇文章主要介紹了Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Node.js中的process.nextTick使用實(shí)例
這篇文章主要介紹了Node.js中的process.nextTick使用實(shí)例,nextTick函數(shù)有什么用、怎么用、和setTimeout有什么區(qū)別呢,本文就講解了這些知識(shí),需要的朋友可以參考下2015-06-06
利用yarn實(shí)現(xiàn)一個(gè)webpack+react種子
其實(shí)以前就寫(xiě)過(guò)如何使用React-router和Webpack快速構(gòu)建一個(gè)react程序。后來(lái)發(fā)現(xiàn)版本太老,于是乎最近又重新組織了下結(jié)構(gòu),使用最近發(fā)布的yarn作為包管理工具,介紹下基本安裝步驟,有需要的朋友們下面來(lái)一起看看吧。2016-10-10
electron安裝報(bào)錯(cuò)終極解決辦法詳細(xì)講解
當(dāng)使用npm安裝electron時(shí),有時(shí)候會(huì)遇到各種各樣的錯(cuò)誤,如網(wǎng)絡(luò)錯(cuò)誤、權(quán)限錯(cuò)誤等等,這篇文章主要給大家介紹了關(guān)于electron安裝報(bào)錯(cuò)終極解決辦法的相關(guān)資料,需要的朋友可以參考下2024-09-09
NodeJs Express框架實(shí)現(xiàn)服務(wù)器接口詳解
最近學(xué)習(xí)了基于前后端分離的開(kāi)發(fā)模式,我前端使用Vue框架,后端使用nodejs開(kāi)發(fā)API接口,下面這篇文章主要給大家介紹了關(guān)于nodejs使用Express框架寫(xiě)后端接口的相關(guān)資料,需要的朋友可以參考下2022-08-08

