我们将在下面解释node连接数据库的三种方式,并说明利弊,以选择最适合项目的连接方式。
1.使用mysql连接包提供的接口
例如:
connection.query('SELECT * FROM users WHERE id = ?', ['123'], function(err, rows) {
if (err) {
// error } else {
for (let row in rows) {
processRow(row); } } });
该方法相对较低,每个操作数据库都需要一个新的数据库连接。如果数据库需要更多的操作,服务器消耗更大,则可以使用第二种连接方法。
2.建立数据库连接池
数据库连接池负责数据库连接的分配、管理和释放,允许应用程序重复使用现有的数据库连接,而不是重建一个;释放空闲时间超过最大空闲时间的数据库连接,以避免因未释放数据库连接而导致的数据库连接遗漏。 一般的理解是: 数据库连接池是在程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,通过程序动态应用、使用和释放池中的连接对象。
优点
1.避免频繁连接和断开应用程序数据库
2.提供数据库连接对象的使用频率。
创建方式
1.创建连接池
mysql.createPool(config) host:数据库服务器的地址 port: 端口号 user:连接数据库的用户名 password:连接数据库的密码 database:数据库名 connectionLimit:默认属性值用于指定连接池中最大的链接数10. multipleStatements :是否允许多项执行sql语句,默认值为false
2.从连接池获得连接
连接池名.getConnection(function(err,connection){
执行的代码 }) //参数err:错误的对象。连接失败后的错误信息 //参数connection:连接对象。如果连接失败,则为undefined
3.释放连接对象(将连接对象放回连接池): connection.release() 4.从连接池中移除连接对象: connection.destory() 5.关闭连接池: 连接池名.end();
3.数据库访问ORM——sequelize模块
ORM
-
ORM的特点:
- 可提高开发效率 不用直接写SQL语句
sequelize
-
sequelize的特点:
- 强大的模型定义支持虚拟类型。 支持完善的数据验证,减轻前后端验证压力。 Sequelize查询非常全面灵活。
sequelize的使用
- 安装sequelize:npm install sequelize 必须先安装mysql的驱动模块(npm install mysql)
- 连接数据库:创建sequelize的对象
span class="token comment">//导入mysql模块
const mysql = require('mysql2');
//导入sequelize模块
const Sequelize = require('sequelize');
//创建sequelize对象,参数分别为:数据库名称,数据库类型,密码,配置
var MySequelize = new Sequelize('spj','root','929TJ813',{
host:'localhost',
port:3306,
dialect:'mysql', //数据库类型
pool:{
//数据库连接池
max:20, //最大连接对象的个数
min:5, //最小连接对象的个数
idle:1000 //最长等待时间,单位为毫秒
}
})
module.exports = MySequelize ; //导出创建的sequelize对象
- 创建数据模型:数据模型是一个类,对应的是数据库中一张表
const Sequelize =require('sequelize')
const MySequesize = require('../config/dbconfig'); //导入创建的sequelize对象
//创建StudentModel模型,该模型对应的表名是student
var StudentModel = MySequesize.define('users',{
sid:{
type:Sequelize.INTEGER, //表示属性的数据类型
field:'s_id', //属性对应的列名,若不定义field则表中的列名(sid)就是属性名
primaryKey:true, //表示主键
autoIncrement:true //表示主键自增
},
sname:{
type:Sequelize.STRING(50),
field: 's_name',
allowNull:false, //表示当前列是否允许为空,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表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性
})
//同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
var users = StudentModel.sync({
force:false});
module.exports = StudentModel; //导出模型
- 使用sequelize实现增删改查 。
const StudentModel = require('../../db/model/StudentModel');
const Sequelize = require('sequelize')
//插入数据
StudentModel.create({
sname:'关羽',
sgender:'男',
sbirthday:'1998-12-28',
saddress:'陕西宝鸡'
}).then(result=>{
console.log("插入成功!",result);
}).catch(err=>{
console.log("插入失败!",err);
})
//查询数据
StudentModel.findAll({
raw:true //查询出来只有需要的数据,没有别的内容
}).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("查无此人!",error);
})
//查询部分字段
StudentModel.findAll({
attributes:['sname','saddress'],
raw:true
}).then(result=>{
console.log(result);
}).catch(err=>{
console.log(err);
})
//聚合函数
StudentModel.findAll({
attributes:[[Sequelize.fn('COUNT',Sequelize.col('s_id')),"记录总数"]], //col里面必须放的是列名
raw:true
}).then(result=>{
console.log(result)
})
- 使用sequelize实现模糊查询等内容。
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'] //查询结果按照sage的降序排列
],
raw:true
}).then(result=>{
console.log(result);
})
//and和or:查询性别为’男‘,并且地址是‘陕西宝鸡’的记录
StudentModel.findAll({
where:{
[Op.and]:[ //把and改为or即为或时间
{
sgender:{
[Op.eq]:'男'
}
},
{
saddress:{
[Op.eq]:'陕西宝鸡'
}
}
]
},
raw:true
}).then(result=>{
console.log(result);
})
//limit和offset:分页查询
StudentModel.findAll({
limit:3, //查询的记录数
offset:1, //从索引值为几的记录开始查询(查询的起始位置),所有数据的索引值从0开始
raw:true
}).then(result=>{
console.log(result);
})
参考链接:https://blog.csdn.net/TangJing_/article/details/121602581?spm=1001.2014.3001.5506