• Express框架连接MySQL及ORM框架


    一、Express框架连接MySQL数据

    1、安装MySQL模块

    npm install mysql
    
    • 1

    请添加图片描述

    2、创建一个配置文件:用于连接MySQL数据库

    创建配置文件Sql.js:

    var dbmysql ={
        host:'127.0.0.1',
        port:3306,
        user:'root',
        password:'qazzaq123',
        database:'mvc'
    }
    module.exports = dbmysql;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    连接数据库crud.js

    var express = require('express')
    var mysql = require('mysql')
    
    var dbmysql = require('../config/Sql')
    
    
    var router = express.Router()
    
    //http://localhost:3000/posts/db
    router.get('/db',(req, res) => {
        //1、连接数据库,获取数据库的连接对象
        let conn = mysql.createConnection(dbmysql);
        console.log(conn)
        //2、d调用数据库连接对象的query方法进行查询
        conn.query('select * from edu',function (err,results,fields){
            if(err){
                throw err
            }
            console.log(results) //输出查询结果
            res.send(results)
        })
        //3、关闭数据库的连接
        conn.end((err)=>{
            if(err){
                console.log(err)
                return
            }
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3、在前端页面中使用表单来收集数据

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <style>
        div{
            width: 500px;
            margin: 50px auto;
        }
    </style>
    <body>
        <div>
            <form id="reg">
                <label for="">
                    学号:<input type="text" name="s_id">
                </label>
                <br><br>
                <label for="">
                 姓名:<input type="text" name="s_name">
                </label>
                <br><br>
                <label for="">
                    年龄:<input type="number" name="s_age">
                </label>
                <br><br>
                <label for="">
                  性别:<input type="text" name="s_gender">
                </label>
                <br><br>
                <button type="button" id="btn_ok">提交</button>
            </form>
            <br><br>
            <span id="msg"></span>
        </div>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    4、通过jQuery的方法向服务器发起异步请求,将数据提交给服务器

    5、服务器接收到前端的请求数据后,将数据写入数据库,同时给前端发送响应信息

    5.1、增加数据:

    Ajax异步请求代码:

      <script>
                $(function(){
                    $('#btn_ok').bind('click',function(){
                        //向服务器发起ajax请求
                        $.ajax({
                           url:'http://localhost:3000/post/add',
                            type:'post',
                            datatype:'json',
                            data:$('#reg').serialize(),  //表单序列化
                            success:function(result){
                                $('#msg').html(result.info)
                            },
                            error:function(err){
                                console.log(err)
                            }
                        })
                    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    服务器后端代码:

    var express = require('express')
    var mysql = require('mysql')
    
    var dbmysql = require('../config/Sql')
    
    
    var router = express.Router()
    //  http://localhost:3000/posts/adds
    
    router.post('/adds',(req, res) => {
        //1.接收客户端的请求数据
        let sid  = req.body.s_id
        let sname = req.body.s_name
        let age = req.body.s_age
        let gender = req.body.s_gender
        //2、将数据封装成对象
        let data = {sid,sname,age,gender}
    
        //3、创建数据库的连接对象
        let conn = mysql.createConnection(dbmysql);
    
        //4、将数据插入到数据库中
        conn.query('insert into edu set ?',data,function (err,result){
            if (err){
                console.log(err)
                res.send({
                    code:1001,
                    info:'数据插入失败'
                })
            }else{
                res.send({
                    code:1002,
                    info:'数据插入成功'
                })
            }
    
        })
        //5、关闭数据库连接
        conn.end((err)=>{
            if(err){
                console.log(err)
                return
            }
        })
    
    })
    
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述
    5.2、查询操作:

    (1)、服务器后端代码:

    var express = require('express')
    var mysql = require('mysql')
    
    var dbmysql = require('../config/Sql')
    
    
    var router = express.Router()
    
    //http://localhost:3000/posts/db
    router.get('/db',(req, res) => {
        //1、连接数据库,获取数据库的连接对象
        let conn = mysql.createConnection(dbmysql);
        console.log(conn)
        //2、d调用数据库连接对象的query方法进行查询
        conn.query('select * from edu',function (err,results,fields){
            if(err){
                throw err
            }
            console.log(results) //输出查询结果
            res.send(results)
        })
        //3、关闭数据库的连接
        conn.end((err)=>{
            if(err){
                console.log(err)
                return
            }
        })
    })
     module.exports =router;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    (2)、使用Apipost测试查询查询结果
    在这里插入图片描述
    5.3、删除操作:

        <script src="../js/jquery-3.4.1.js"></script>
        <script>
         $(function(){
            $('#btn_del').bind('click',function(){
                $.ajax({
                    url:'http://localhost:3000/crud/remove',
                    type:'delete',
                    dataType:'json',
                    data:{s_id:$('#sid').val()},
                    success:function(result){
                        $('#msg').html(result.info)
                    },
                    error:function(err){
                        console.log(err)
                    }
                })
            })
         })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    服务器后端代码:

    var express = require('express')
    var mysql = require('mysql')
    
    var dbmysql = require('../config/Sql')
    
    
    var router = express.Router()
    
    //http://localhost:3000/posts/remove
    router.delete('/remove',(req, res) => {
        // 1. 获取客户端的请求数据
        let sid = req.body.s_id
        // 2. 获取数据库的连接
        let conn = mysql.createConnection(dbmysql);
        // 3.执行删除
        conn.query('delete from edu where sid=?',sid,function (err,result){
            if (err){
                console.log(err)
                res.send({
                    code: 1001,
                    info: '删除失败'
                })
            }else{
                res.send({
                    code: 1002,
                    info: '删除成功'
                })
            }
        })
        conn.end((err)=>{
            console.log(err)
            return
        })
    })
    
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    运行结果:

    在这里插入图片描述
    5.4、修改操作
    Ajax异步请求代码:

            $('#btn_update').bind('click',function(){
                $.ajax(
                    {
                    url:'http://localhost:3000/crud/modify',
                    type:'put',
                    dataType:'json',
                    data:$('#reg').serialize(),//表单序列化
                    success:function(result){
                        $('#msg').html(result.info)
                    },
                    error:function(err){
                        console.log(err)
                    }
                })
            })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    var express = require('express')
    var mysql = require('mysql')
    
    var dbmysql = require('../config/Sql')
    
    
    var router = express.Router()
    
    router.put('/modify',(req, res) => {
    // 1.就是客户端的请求数据
        let sid = req.body.s_id
        let sname = req.body.s_name
        let age = req.body.s_age
        let gender = req.body.s_gender
    
        // 2.创建数据库的连接对象
        let conn = mysql.createConnection(dbconfig);
    
        // 3.将数据插入到数据库中
        conn.query("update edu set sname=?,age=?,gender=? where sid=?",[sname,age,gender,sid],function (err,result){
            if (err){
                console.log(err)
                res.send({
                    code:1001,
                    info:'数据更新失败'
                })
            }else{
                res.send({
                    code: 1002,
                    info: '数据更新成功'
                })
            }
        })
        //4.关闭数据库连接
        conn.end((err)=>{
            if (err){
                console.log(err)
                return
            }
        })
    })
    
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    修改前数据内容:
    在这里插入图片描述
    修改后:
    在这里插入图片描述

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

    1、什么是ORM框架

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

    2、对象关系映射:

    类 — 表

    类的属性 — 表的列

    类的对象 — 表的行

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

    3、ORM框架:Sequelize

    3.1、什么是Squelize

    基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),。它当前支持MySQL、MariaDB、SQLite、PostgreSQL、Sql Server 数据库。

    3.2、Sequelize的特点:

    强大的模型定义,支持虚拟类型。
    支持完善的数据验证,减轻前后端的验证压力。
    Sequelize的查询非常全面和灵活

    3.3、具体使用

    (1)、安装模块

    npm install mysql2
    npm install sequelize
    
    • 1
    • 2

    安装mysql2:
    请添加图片描述
    安装sequelize:
    请添加图片描述

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

    配置sequelize(dbconfig.js):

    //1、导入squelize模块
    const Sequelize = require('sequelize')
    //2、配置数据库连接对象
    const sqllize =new Sequelize('mvc','root','qazzaq123',{
        host:'localhost',
        post:3306,
        dialect:'mysql',
        pool:{  //数据库连接池
            max:10,
            min:3,
            idle:10000
        }
    })
    
    //3、导出数据库的配置对象
    module.exports = sqllize
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    //1、导入sequelize模块
    const Sequelize = require('sequelize')
    
    //2、导入配置文件
    
    const sqllize = require('../seq')
    
    //3、创建数据模型
    
    const Student = sqllize.define('edu',{
        Id:{
            type:Sequelize.STRING, //数据类型
            primaryKey:true,  //主键
            field:'sid'
        },
        Name:{
            type:Sequelize.STRING,
            field:'sname',
            allowNull:false //表示该列不能为空(false)
    
        },
        age:{
            type:Sequelize.INTEGER,
            field:'age',
            allowNull:false
        },
        gender:{
            type:Sequelize.STRING,
            field:'gender',
            allowNull:false //表示该列不能为空(false)
        }
    },{
        freezeTableName:true,
        timestamps:false
    })
    
    module.exports = Student
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

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

    a、查询所有数据:

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    //测试Sequelize模块
    // http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
            raw:true //不显示时间戳
        }).then(function (result){
            res.send(result)
        })
    })
    module.exports = router
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用Apipost进行测试:

    在这里插入图片描述

    可以看到在Apipost中进行测试后显示出了所有数据(这里只截图了一部分数据)。

    b、查询某一个数据:

    const express = require('express')
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    // http://localhost:3000/sequelize/one
    router.get('/one',(req, res) => {
        Student.findOne({
            where:{
                Id: 's_1002'
            }
        }).then((data)=>{
            res.send(data)
        })
    })
    module.exports = router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    查询结果:
    在这里插入图片描述

    三、Sequelize的查询

    1、查询部分字段

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
            attributes:['sid','sname'],//查询部分字段
             raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2、通过sequelize.fn()方法进行聚合查询

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    
    //测试Sequelize模块
    //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)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    3、查询操作符的使用:需要导入Sequelize模块的Op子模块

    3.1、模糊查询:

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
    where:{
    sname:{
         [Op.like]:'li%'}
    },
    raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    3.2、in查询:

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/etu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
    where:{
    age:{
      [Op.in]:[15,23]
         },
    raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    3.3、查询结果排序:order

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
    where:{
    age:{
          order:[
         ['age','desc']
                 ],
    raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4、and 和 or 查询

    and查询:

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
    where:{
    [Op.and]:[
    {
         sname:{
            [Op.like]:'li%'
         } 
      },
      {
           age:{
           [Op.eq]:23
            }
       }
            ]
    
     },raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    5、limit 和 offse

    const express = require('express')
    
    const router = express.Router()
    
    const Student = require('../config/model/stu')
    
    const sequelize = require('sequelize')
    
    const Op = sequelize.Op
    
    //测试Sequelize模块
    //http://localhost:3000/sequelize/seq
    router.get('/seq',(req,res) => {
        Student.findAll({
        limit:5,
        offset:4,
    raw:true //不显示时间戳
    }).then(function (result){
            res.send(result)
        })
    })
    module.exports=router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

  • 相关阅读:
    MySQL速成——第一天--基础入门
    自定义Lua解析器管理器-------演化脚本V0.5
    面试题:深拷贝、浅拷贝、引用拷贝的区别
    监控识别未佩戴安全帽
    ERP、CRM、SRM、PLM、HRM、OA……都是啥意思
    蓝桥杯 国赛 答疑
    【图像分类】2021-CvT
    运维开发详解
    【ESP32】7.按键实验(中断)
    Web前端开发技术课程大作业_ 关于美食的HTML网页设计——HTML+CSS+JavaScript在线美食订餐网站html模板源码30个页面_
  • 原文地址:https://blog.csdn.net/thwr1881/article/details/126035130