ORM框架 swquelize
ORM(对象关系映射)
实现面向对象技术和关系型数据库之间的映射
是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术,通过描述对象和数据库之间映射的元数据,吧程序中的对象自动化持久到关系数据库中。
持久化:主要应用是将内存中的数据存储到关系型数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等
ORM技术特点:
1、提高了开发效率。ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射, 所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
2、ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。
Sequelize
基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环 境中,易于使用,支持多SQL方言(dialect),。它当前支持MySQL、MariaDB、SQLite、PostgreSQL、 Sql Server 数据库。
Sequelize特点:
-
强大的模型定义,支持虚拟类型。
-
支持完善的数据验证,减轻前后端的验证压力。
-
Sequelize的查询非常全面和灵活
步骤
1.使用express创建项目
Express orm_demo
2.进入项目,安装包
cd orm_demo
npm install
npm start
打开http://localhost:3000
3.安装小插件(非必须)
npm install nodemon
npm install cors
4.安装mysql(必须)
npm install mysql
5.安装sequelize
npm i sequelize mysql2 -S
6.配置sequelize的文件
//1.引入sequelize模块
var Sequelize = require('sequelize')
//2.初始化数据库连接对象,支持连接池的:四个参数分别是:数据库名称,用户名,密码,配置
var sequelize = new Sequelize('decorate','root','jry20001115',{
host:'localhost',//数据库地址
dialect:'mysql',//指定连接的数据库类型 mysql|sqlite|postgres|mssql
pool:{
max:5,
min:0,
idle:10000//如果一个线程没有被使用的话,就释放线程
}
})
//3.暴露数据库连接对象
module.exports = sequelize;
7.创建模型
//1.引入持久化模块 sequelize
var Sequelize = require('sequelize');
//2.引入配置文件dbconfig
var sequelize = require('../config/dbconfig')
//3.创建模型,调用sequelize的define('数据表名','表的列名以及列的类型等参数')
var Admin = sequelize.define('admin',{
id: {
type: Sequelize.INTEGER, //表示列的数据类型
autoIncrement : true, //是否自增,默认为自增
primaryKey: true //该列是否是主键
},
username:{
type:Sequelize.STRING,
allowNull:false//该列是否允许为null
},
password:{
type:Sequelize.STRING,
allowNull:false//该列是否允许为null
},
name:{
type:Sequelize.STRING,
},
role:{
type:Sequelize.STRING,
},
last_login:{
type:Sequelize.DATE
},
created_at:{
type:Sequelize.DATE
},
updated_at:{
type:Sequelize.DATE
},
},{
freezeTableName:true,//true:表示表的名称和model的名称相同 为Admin,false:表示表的名称为Admins,如果表名本就是负数形式则不发生变化
timestamps:false//表示是否要加入附属的列(updateAt,createAt)
})
//将实例(类)同步到数据库中
/*sync函数的作用是在数据库中创建表,并返回一个promise对象
* 参数force的值为true:若数据库中存在同名的表,则把原来的表删除,再建立新的表
参数force的值为true:若表已经存在,就不需要再建立新表了
*/
var admin = Admin.sync({force: false})
8.实现CRUD
增加管理员:
//1.添加用户信息
exports.addAdmin = function(username,password,name,role,last_login,created_at,updated_at){
return Admin.create({//是sequelize模块提供的,用于向表中插入记录
username:username,
password:password,
name:name,
role:role,
last_login:last_login,
created_at:created_at,
updated_at:updated_at
}).then(function(result){
console.log('插入成功:'+result)
}).catch(function(err){
console.log('插入失败:'+err)
})
}
测试代码
var admin = require('./model/Admin')
admin.addAdmin('刘备','123456','刘老三','1',new Date(),new Date(),new Date());
2.删除管理员
//2.删除管理员信息
exports.delAdmin = function(id){
//根据ID删除管理员信息
return Admin.destroy({
where:{id:id}
}).then(function(result){
console.log('删除成功!')
}).catch(err=>{
console.log('删除失败'+err)
})
}
测试代码
admin.delAdmin(2)
3.更新记录
//3.更新管理员信息
exports.updateAdmin = function(id){
//1.根据ID找到要更新的记录
return Admin.findOne({
where:{id:id}
}).then(function(u){
//参数u是要更新的那条记录(即对象)
return u.update({
username:'诸葛亮',
password:'z123456'
}).then(function(result){
//result更新成功之后,返回的数据
console.log('更新成功')
}).catch(function(err){
console.log('更新失败'+err)
})
})
}
测试代码
admin.updateAdmin(1)
4.查询所有
//4.查询所有
exports.getAdmin = function(){
return Admin.findAll({
raw:true//我们得到的必须是原始记录
}).then(function(result){
console.log('查询成功'+result)
}).catch(function(err){
console.log(err)
})
}
测试代码:
admin.getAdmin()
聚合查询
//5.sequelize中聚合查询的使用
exports.findAdmin = function(){
return Admin.findAll({
raw:true,
attributes:[
[
sequelize.fn('count',sequelize.col('id')),'记录总数'
],
[
sequelize.fn('avg',sequelize.col('role')),'平均值'
]
]
}).then(function(result){
console.log(result)
}).catch(function(err){
console.log(err)
})
}
模糊查询
//6.模糊查询
exports.likeFind = function(){
return Admin.findAll({
raw:true,
where:{
// username:{
// //用户名为拉开头的
// [Op.like]:'拉%'
// }
// role:{
// //输出1~3之间的人
// [Op.between]:[1,3]
// }
role:{
//输出role为1或者3的
[Op.in]:[1,3]
}
}
}).then(function(result){
console.log('查询成功'+result)
}).catch(function(err){
console.log(err)
})
}
对查询结果进行排序
exports.orderFind = function(){
return Admin.findAll({
raw:true,
order:[
//查询结果降序排列
['role','desc']
]
}).then(function(result){
console.log('查询成功'+result)
}).catch(function(err){
console.log(err)
})
}
分页查询
//分页查询
exports.limitFind = function(){
return Admin.findAll({
raw:true,
limit:3,//查询的记录数,一共查询几条记录
offset:3//查询的偏移量即起始位置
}).then(function(result){
console.log('查询成功'+result)
}).catch(function(err){
console.log(err)
})
}
自定义SQL语句的查询
//自定义查询语句的SQL1
// exports.queryAdmin = function(){
// return sequelize.query('select * from admin',{
// type:Sequelize.QueryTypes.SELECT
// }).then(function(result){
// console.log('查询成功'+JSON.stringify(result))
// }).catch(function(err){
// console.log(err)
// })
// }
//自定义查询语句的SQL2
exports.queryAdmin = function(){
let sql = 'select * from admin where username like "拉%" and role = 2'
return sequelize.query(sql,{
type:Sequelize.QueryTypes.SELECT
}).then(function(result){
console.log('查询成功'+JSON.stringify(result))
}).catch(function(err){
console.log(err)
})
}