Node.js ORM框架-sequelize

什么是ORM

ORM(Object Relational Mapping,对象关系映射),是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,通过描述对象和数据库之间映射的元数据,把程序中的对象自动持久化到关系数据库中。它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。

什么是“持久化”

即把数据(如内存中的对象)保存的磁盘的某一文件中。

什么是持久层

持久层(Persistence Layer),即实现数据持久化应用领域的一个逻辑层面,将数据使用者和数据实体相关联。

ORM技术特点

1、提高了开发效率。ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。

2、ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

什么是Sequelize

Sequelize.js是一款针对nodejs的ORM框架。

它是一个很成熟的框架,在速度和性能上也非常有优势。而其中最关键的地方就在于,日常开发只需要管理对象的创建、查询方法的调用等即可,极少需要编写sql语句。这一个好处就是省去了复杂的sql语句维护,同时也避免了因sql而引起的不必要的bug。

它支持的数据库包括:PostgreSQL、 MySQL、MariaDB、 SQLite 和 MSSQL。

Sequelize特点

1、强大的模型定义,支持虚拟类型。

2、支持完善的数据验证,减轻前后端的验证压力。

3、Sequelize的查询非常全面和灵活

使用方式

安装库

1、安装MySQL:npm install mysql
2、安装Sequelize:npm i sequelize mysql2 -S

配置sequelize

基本语法格式

new Sequelize("表名","用户名","密码",配置)

正常使用中很少使用到所有的参数,这里提供一个常用的模板,只需要修改自己使用的值即可。

//导入sequelize模块
const Sequelize = require('sequelize');

//配置数据库连接对象(默认带有链接池)
const db = new Sequelize('info','root','root23',{
    host:'localhost',//数据库地址
    port:3306,//数据库端口
    dialect:'mysql',//数据库类型
    pool:{
        max:5,//最大连接数量
        min:0,//最小连接数
        idle:10000 //若某个线程10秒没有使用,就释放
    },
    debug:true, //显示调试信息
})
module.exports = db;

定义模型对象

在使用之前一定要先创建模型对象。就是数据库中表的名称、使用到的字段、字段类型等。

const Sequelize = require('sequelize');

const db = require('../config/dbbook');

//定义模型
const BookModel = db.define('bookinfo',{
    id:{
        type:Sequelize.INTEGER,//数据类型
        primaryKey:true//是否主键
    },
    isbn:{
        type:Sequelize.CHAR(13),
        allowNull:false//是否可以是空值
    },
    bookName:{
        type:Sequelize.STRING(200),
        allowNull: false,
        field:'name'//映射数据库中name字段
    },
    author:{
        type:Sequelize.STRING(100),
        allowNull:false
    },
    press:{
        type:Sequelize.STRING(100),
        allowNull:false
    },
    price:{
        type:Sequelize.DECIMAL(7,2),
        allowNull:false
    },
    pubDate:{
        type:Sequelize.DATE,
        allowNull:false,
        field: "pubdate"
    },
    pricture:{
        type:Sequelize.STRING(255),
    }
},{
    //使用自定义表名
    freezeTableName: true,
    //去掉默认的添加时间和更新时间
    timestamps: false,
});
module.exports=BookModel;

具体使用

1、查询所有findAll

查询用的参数普遍通用,只有部分API的有特殊参数。

let getBooks = async function(){
        let result = Book.findAll({
            raw:true
        })
        return result
    }

2、查询满足条件的(Id=2)

let getBooks = async function(){
    let result = Book.findAll({
        where:{
            id:2,//id等于10
        }
    })
    return result
}

3、增加信息create

添加只需要传入model对象即可。这里要保证model对象的属性和字段名要一致。如果不一致就会出错。

let addBook = async function(params){
        let result = Book.create({
            isbn:params.isbn,
            bookName:params.bookName,
            author:params.author,
            press:params.press,
            price:params.price,
            pubDate:params.pubDate,
            pricture:params.pricture
        })
        return result;
    }

4、删除单条信息destroy

用配置参数有条件的区别要删除的对象即可。

let delBook = async function(bid){
        let result = Book.destroy({
            where:{
                id:bid
            }
        })
        return result;
    }

5、批量删除

batchBook:async function(id_list){
        let result = Book.destroy({
            where:{
                id:{
                    [Op.in]:id_list
                }
            }
        })
    }

6、修改信息update

更新方法可以传入要更新的model对象,同时用配置参数有条件的区别要更新的对象。

let updateBook=async function(params){
        let result = Book.update({
            isbn:params.isbn,
            bookName:params.bookName,
            author:params.author,
            press:params.press,
            price:params.price,
            pubDate:params.pubDate,
            pricture: params.pricture
        },{
            where:{
                id:params.id
            }
        })
    }

将上述方法封装

const Sequelize = require('sequelize');
const Book = require('../model/bookModel');
const Op = Sequelize.Op;//导入Sequelize操作符
//定义对象,完成CRUD操作
const bookOption = {
     getBooks:async function(){
        let result = Book.findAll({
            raw:true
        })
        return result
    },
    getidBook:async function(){
        let result = Book.findAll({
            where:{
                id:2,//id等于10
            }
        })
        return result
    },
    addBook:async function(params){
        let result = Book.create({
            isbn:params.isbn,
            bookName:params.bookName,
            author:params.author,
            press:params.press,
            price:params.price,
            pubDate:params.pubDate,
            pricture:params.pricture
        })
        return result;
    },
    //删除
    delBook:async function(bid){
        let result = Book.destroy({
            where:{
                id:bid
            }
        })
        return result;
    },
    //批量删除
    batchBook:async function(id_list){
        let result = Book.destroy({
            where:{
                id:{
                    [Op.in]:id_list
                }
            }
        })
    },
    //更新图书
    updateBook:async function(params){
        let result = Book.update({
            isbn:params.isbn,
            bookName:params.bookName,
            author:params.author,
            press:params.press,
            price:params.price,
            pubDate:params.pubDate,
            pricture: params.pricture
        },{
            where:{
                id:params.id
            }
        })
    }
}
module.exports = bookOption;

实现接口完成上述操作

const express = require('express');
const router = express.Router();
//导入BookOption对象
const bookOption = require('../../db/crud/bookOption');

/*
    查询所有接口:http://localhost:8089/bookapi/books
 */
router.get('/books',(req,res)=>{
    bookOption.getBooks().then((data)=>{
        res.send(data);
    })
})

/*
    查询id=2:http://localhost:8089/bookapi/bookid
 */
router.get('/bookid',(req,res)=>{
    bookOption.getidBook().then((data)=>{
        res.send(data);
    })
})

/*
    增加图书:http://localhost:8089/bookapi/add
 */
router.post('/add',(req,res)=>{
    let params = {
        isbn:req.body.isbn,
        bookName:req.body.bookName,
        author:req.body.author,
        press:req.body.press,
        price:req.body.price,
        pubDate:req.body.pubDate,
        pricture:req.body.pricture
    }
    bookOption.addBook(params).then((data)=>{
        // console.log(data[dataValues].pricture)
        res.send({
            code:data,
            msg:'添加成功'
        })
    })
})

/*
    删除图书:http://localhost:8089/bookapi/del
 */
router.delete('/del',(req,res)=>{
    bookOption.delBook(req.body.id).then((data)=>{
        res.send({
            code:data,
            msg:'删除成功'
        })
    })
})
/*
    批量删除图书:http://localhost:8089/bookapi/batch
 */
router.delete('/batch',(req,res)=>{
    //1.获取id拼接的字符串
    let idStr = req.body.ids
    //2.将字符串分割成数组
    let id_list = idStr.split(',');

    bookOption.batchBook(id_list).then((data)=>{
        res.send({
            code:data,
            msg:'批量删除成功'
        })
    })
})
/*
   更新图书:http://localhost:8089/bookapi/updata
 */
router.put('/updata',(req,res)=>{
    let params = {
        id:req.body.id,
        isbn:req.body.isbn,
        bookName:req.body.bookName,
        author:req.body.author,
        press:req.body.press,
        price:req.body.price,
        pubDate:req.body.pubDate,
        pricture:req.body.pricture
    }
    bookOption.updateBook(params).then((data)=>{
        res.send({
            code:data,
            msg:'更新成功'
        })
    })
})
module.exports=router;

测试结果

1、打开Postman访问:http://localhost:8089/bookapi/books
在这里插入图片描述
2、打开Postman访问:http://localhost:8089/bookapi/bookid
在这里插入图片描述3、打开Postman访问:http://localhost:8089/bookapi/add

然后输入要添加的信息
在这里插入图片描述由于我们的id是自增的所以我们添加id时添加不进去,但是不能缺少,可以给id为null作为占位符。

4、打开Postman访问:http://localhost:8089/bookapi/updata
将价格改为108
在这里插入图片描述

5、打开Postman访问:http://localhost:8089/bookapi/del

删除id为2的记录
在这里插入图片描述

6、打开Postman访问:http://localhost:8089/bookapi/batch

删除ids为14,21的记录。
在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做一只合格的前端攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值