【ORM框架:Sequelize的查询】

一、ORM(Object Relational Mapping,对象关系映射)

1、持久化

持久化 :将内存中的对象保存到磁盘的数据库中或其他文件中

2、对象关系映射:

类的属性表的列
类的对象表的行

在js程序中对对象的操作,就是操作了数据库表的行.

3、ORM框架:Sequelize

(1)安装模块:

npm install mysql2
npm install sequelize

(2)创建数据库连接的配置对象

创建数据库连接的配置对象:使用sequelize完成相关配置

(3)使用sequelize建立模型(类)

使用sequelize建立模型(类),该模型实现与数据表的orm映射

(4)使用模型进行crud操作(增删改查)

方法说明
模型名.findAll()查询所有
模型名.findOne()带条件查询
模型名.create()插入数据
模型名.destroy()删除数据
模型名.update()更新数据
①查询所有

seqconfig.js后端配置文件:

//1、导入sequelize模块,引入框架
const Sequelize = require('sequelize')

//2、配置数据库连接对象
const mysqlDemo = new Sequelize('xy','root','123456',{
    host:'localhost',
    port:3306,
    dialect:'mysql',//数据库方言,类型
    pool:{//数据库连接池
        max:10,
        min:3,
        idle:100000
    }
})
//3、导出数据库连接的配置对象
 module.exports = mysqlDemo

Student.js映射数据库关系表的代码如下:

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

//2、导入配置文件
const mysqlDemo =require('../seqconfig')

//3、创建数据类型(模型)
const Student = mysqlDemo.define('stu',{
    Id:{
        type:Sequelize.STRING,//数据类型
        primaryKey:true,//主键
        field:'sid'
    },
    Name:{
        type:Sequelize.STRING,
        field:'sname',
        allowNull:false//该列不能为空(false),true表示可以为空
    },
    Age:{
        type:Sequelize.INTEGER,
        field:'age',
        allowNull:false//该列不能为空(false),true表示可以为空
    },
    Gender:{
        type:Sequelize.STRING,
        field:'gender',
        allowNull:false//该列不能为空(false),true表示可以为空
     }
     },
    {
    freezeTableName:true,//true表示应用用户自己的表名,false(默认)表示sequelize定义表名(就是模型名后面加s:Students)
        timestamps:false//默认为true(会给表添加时间戳列,创建表的时间戳,更新表的时间戳两列),false表示不添加时间戳列。
   })

module.exports = Student//导出这个数据库模型(表)

sequecrud.js路由接口文件代码如下:

const express = require('express')
const sequelize = require('sequelize')
const router = express.Router()
const Student =require('../config/model/Student')

//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})
module.exports=router

app.js配置代码:

var seqRouter=require('./routes/sequecrud')
app.use('/sequelize',seqRouter);

运行结果如下:

测试结果如下(查询全部数据):
在这里插入图片描述在这里插入图片描述

②带条件查询

只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/findone
router.get('/findone',(req, res) => {
    Student.findOne({
        where:{
            Id:'S_1013'
        }
    }).then((data)=>{
        res.send(data)
    })
})

运行结果如下:
测试结果如下:
在这里插入图片描述正如下图证明可得,查询结果正确。
在这里插入图片描述

③插入数据

只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/add
router.get('/add',(req, res) => {
    Student.create({
        Id:'S_1012',
        Name:'小王',
        Age:'21',
        Gender:'男'
    }).then((data)=>{
        res.send(data)
    })
})

运行结果如下:
测试结果如下:
在这里插入图片描述
如下图查询数据库表知,插入数据成功:

在这里插入图片描述

④删除数据

只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/delete
router.get('/delete',(req, res) => {
    Student.destroy({
        where:{
            Id:'S_1012'
        }
    }).then((data)=>{
        res.send(data)
    })
})

运行结果如下:
数据已被删除如下图所示:
在这里插入图片描述

⑤更新数据

只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/update
router.get('/update',(req, res) => {
    Student.findOne({
        where:{
            Id:'s_1007'
        }
    }).then((Student)=>{
        Student.update({
           Name:'更新后',
            Age:16,
            Gender:'男'
        }).then((data)=>{
            res.send(data)
        })
    })

})

运行结果如下:

在这里插入图片描述
更新结果应如红框所示:
在这里插入图片描述测试结果:
在这里插入图片描述

(5)只查询部分字段

例如:select sname from stu;的实现方式

也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
       attributes:['sname','sid'],//查询部分字段
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

运行结果:
在这里插入图片描述

(6)使用聚合函数:count()、sum()、avg()、max()、min()

attributes:[[sequelize.fn(‘count’,sequelize.col(‘sid’)),‘记录总数’]],

也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

运行结果:
在这里插入图片描述

(7)查询操作符的使用:需要导入Sequelize模块的Op子模块

也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
       // attributes:['sname','sid'],//查询部分字段
       //  attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
        where : {
            sname: {
                [Op.like]: '李%'
            }
        },
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

查询结果应如红框所示:
在这里插入图片描述

测试结果:
在这里插入图片描述也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
       // attributes:['sname','sid'],//查询部分字段
       //  attributes:[[sequelize.fn('count',sequelize.col('sid')),'记录总数']],
        where : {
            age:{
                [Op.in]:[15,22]
              }
          },
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

查询结果应如红框所示:

在这里插入图片描述

测试结果:
在这里插入图片描述
也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

const Op =sequelize.Op
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        where : {
            age:{
                [Op.between]:[15,22]
            }
        },
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

查询结果应如红框所示:
在这里插入图片描述

测试结果:
在这里插入图片描述

(8)使用and 和 or谓词进行查询

也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

const Op =sequelize.Op
//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        where : {
            [Op.and]:[
                {
                    sname:{
                        [Op.like]:'李%'
                    }
                },
                {
                    age:{
                        [Op.eq]:22
                    }
                }
            ]
       },
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

查询结果应如红框所示:

在这里插入图片描述

测试结果:

在这里插入图片描述

(9)对查询结果进行排序:使用order子句

也只修改sequecrud.js路由接口文件关键代码,其余代码同上:

//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        order:[
            ['age','desc']
        ],
       
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

测试结果:
在这里插入图片描述

(10)使用limit进行查询

//测试Sequelize模块
//http://localhost:3000/sequelize/seq
router.get('/seq',(req, res) => {
    Student.findAll({
        limit:2,
        offset:3,
        raw:true//目的是不显示时间戳
    }).then(function(result){
        res.send(result)
    })
})

查询结果应如红框所示:
在这里插入图片描述

测试结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值