• 使用express连接MySQL数据库编写基础的增、删、改、查、分页等接口


    使用express连接MySQL数据库编写基础的增、删、改、查、分页接口

    安装express-generator生成器

    cnpm install -g express-generator
    
    • 1

    通过生成器创建项目

    express peifang-server
    
    • 1

    切换至serverAPI目录

    cd peifang-server
    
    • 1

    下载所需依赖

    cnpm install 
    
    • 1

    运行项目

    npm start
    
    • 1

    访问项目:在浏览器地址栏输入127.0.0.1:3000

    单方事故都发给

    开始编写接口

    1. 在项目中安装MySQL

    cnpm install -S mysql
    在这里插入图片描述

    2. 在项目的根目录下新建config/index.js文件,用来存放数据库的相关配置信息

    const sqlconfig = {
      host: 'localhost',  // 连接地址
      user: 'root',    //用户名
      password: 'root',  //密码
      port:  3306 ,   //端口号
      database: 'peifang'   //数据库名
    }
    module.exports = sqlconfig
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 在项目的根目录下新建db/index.js文件夹,用来编写连接数据库的相关方法

    const mysql = require('mysql')
    const sqlconfig = require('../config/index.js')
    const e = require("express");
    /**
     * 连接数据库的两种简单方式:
     * 1. 使用mysql.createConnection连接数据库。
     * 2. 使用连接池 pool.createPool()。
     */
    
    // 方式1 使用mysql.createConnection连接数据库
    let mySql = (sql, data) => {
      return new Promise((resolve, reject) => {
        //连接数据库
        let conn = mysql.createConnection(sqlconfig)
        conn.query(sql, data, (err, result) => {
          console.log(err, result, '执行SQL语句');
          // 错误信息
          if (err) {
            // 当连接不再使用时,用conn对象的release方法将其归还到连接池中
            conn.release()
            reject(err);
          } else {
            resolve(result)
          }
        })
      })
    }
    
    // 方式2 使用连接池 pool.createPool()
    let pool = mysql.createPool(sqlconfig)
    // 封装执行数据库
    pool.getConnection((err, conn) => {
      return new Promise((resolve, reject) => {
        if (err) {
          // 当连接不再使用时,用conn对象的release方法将其归还到连接池中
          conn.release()
          reject(err)
        } else {
          resolve(conn)
        }
      })
    })
    
    // 方式3 使用mysql.createConnection连接数据库并进行基础封装
    const conn = mysql.createConnection(sqlconfig)
    conn.connect(err => {
      if (err) {
        console.log("连接失败")
      } else {
        console.log("连接成功,当前连接线程ID"+conn.threadId);
      }
    })
    module.exports = {
      mySql,
      pool,
      conn,
    }
    
    • 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
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    4. 创建数据库及对应的数据表

    • part数据表(成分表)
      在这里插入图片描述
    • scheme数据表(配方表)
      在这里插入图片描述
    • scheme_detail数据表(配方详情表)
      在这里插入图片描述
    • history数据表(历史价格表)
      在这里插入图片描述

    5. 设置数据表中创建时间字段自动填入

    ALTER TABLE peifang.history MODIFY COLUMN `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
    ALTER TABLE peifang.scheme MODIFY COLUMN `createTime` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
    ALTER TABLE peifang.part MODIFY COLUMN `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
    
    • 1
    • 2
    • 3

    6. 在router目录下新建history.js、part.js、scheme.js、scheme_detail.js文件,并在app.js文件中进行相关路由引入,具体如下所示。

    var partRouter = require('./routes/part');
    var schemeRouter = require('./routes/scheme');
    var schemeDetailRouter = require('./routes/scheme_detail');
    var historyRouter = require('./routes/history');
    
    app.use('/part', partRouter);
    app.use('/scheme', schemeRouter);
    app.use('/schemeDetail', schemeDetailRouter);
    app.use('/history', historyRouter);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7. 编写数据表的单条数据新增、批量数据新增、删、单条数据修改、批量数据修改、全部查询、分页查询等接口

    1. 查询所有
    router.get("/list", (req, res) => {
      const sql = "SELECT * FROM part";
      conn.query(sql,function(err,result){
        if(err){
          res.send({
            status: 400,
            msg: '查询语句执行异常'
          })
        }
        res.json({
          status: 200,
          msg: '查询成功',
          list: result
        })
      })
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 分页查询
    router.get("/listByPage", (req, res) => {
      const size = Number(req.query.size)
      const page = Number(req.query.page)
      const start = (page - 1) * size;
      // 从第start开始取,一共取size个数据
      const sql = `SELECT * FROM part LIMIT ${start}, ${size}`;
      const countSql = 'SELECT count(id) as total FROM part'
      conn.query(sql, (err, data) => {
        if(err){
          res.send({
            status: 400,
            msg: '查询语句执行异常'
          })
        }
        conn.query(countSql, (error, count) => {
          if(err){
            res.send({
              status: 400,
              msg: '查询语句执行异常'
            })
          }
          console.log(count, 'count')
          res.json({
            status: 200,
            msg: '查询成功',
            list: data,
            total: count[0].total
          })
        })
      })
    })
    
    
    • 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
    1. 根据id查询详情
    router.get("/partInfo/:id", (req, res) => {
      const id = String(req.params.id)
      const sql = `SELECT * FROM part WHERE id = '${id}'`
      conn.query(sql, (error, data) => {
        if (error) {
          res.json({
            status: 404,
            msg: err.message
          });
        } else {
          res.json({
            status: 200,
            msg: '查询成功',
            list: data
          })
        }
      })
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 新增
    router.post("/addPart", (req, res) => {
      const { name , price, MJProportion, proteinProportion, calciumProportion, phosphorusProportion} = req.body
      const querySql = `SELECT * FROM part WHERE name = '${name}'`
      conn.query(querySql, (err, data) => {
        console.log(err, data)
        if (data.length > 0) {
          res.send({
            status: 400,
            msg: '当前成分已存在!'
          })
        } else {
          // 构建sql语句
          const sql = 'INSERT INTO part set ?'
          const params = {
            name: name,
            price: price,
            mj_proportion: MJProportion,
            protein_proportion: proteinProportion,
            calcium_proportion: calciumProportion,
            phosphorus_proportion: phosphorusProportion
          }
          // 执行sql语句
          conn.query(sql, params, (err1, data1) => {
            // 判断sql是否执行失败
            if (err1) {
              res.send({
                status: 400,
                msg: err1.message
              })
            } else if (data1.affectedRows !== 1){
              // 判断数据是否插入成功 看affectedRows的值是否为1,不为1则写入失败
              res.send({
                status: 400,
                msg: '数据写入失败'
              })
            } else {
              // 否则写入成功 返回客户端
              res.send({
                status: 200,
                msg: '新增成功'
              })
            }
          })
        }
      })
    })
    
    • 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
    1. 删除
    router.delete("/deletePartById/:id", (req, res) => {
      const id = String(req.params.id)
      const sql = `delete from part where id = '${id}'`
      conn.query(sql, (err, data) => {
        if (err) {
          res.send({
            status: 400,
            msg: '查询语句执行异常'
          })
        } else if (data.affectedRows !== 1) {
          // affectedRows不为1则执行失败
          res.send({
            status: 400,
            msg: '数据删除失败'
          })
        } else {
          res.json({
            status: 200,
            msg: '数据删除成功',
          })
        }
      })
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    1. 修改
    router.put("/updatePart/:id", (req, res) => {
      const id = String(req.params.id)
      const { price, MJProportion, proteinProportion, calciumProportion, phosphorusProportion } = req.body
      const params = {
        price: price,
        mj_proportion: MJProportion,
        protein_proportion: proteinProportion,
        calcium_proportion: calciumProportion,
        phosphorus_proportion: phosphorusProportion,
      }
      // 方法一:
      // const sql = 'update user set ? where id = ?'
      // db.query(sql, [params, id], (err, data) => {
      
      // 方法二:
      const sql = `update part set ? where id = '${id}'`
      conn.query(sql, params, (err,  data) => {
        if (err) {
          res.send({
            status: 400,
            msg: err.message
          })
        } else if (data.affectedRows !== 1){
          res.send({
            status: 400,
            msg: '修改失败!'
          })
        } else {
          res.json({
            status: 200,
            msg: '修改成功!'
          })
        }
      })
    })
    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
    1. 批量插入
    router.post("/addScheme",(req,res) => {
      const {name, description, list} = req.body
      const sql = `select * from scheme where name = '${name}'`
      pool.query(sql, (err, result) => {
        if (err) {
          res.send({
            status: 400,
            msg: err.message
          })
        } else if (result.length > 0) {
          res.json({
            status: 400,
            msg: '当前配方已存在!',
            data: result
          })
        } else {
          const insertSql = `INSERT INTO scheme set ?`
          pool.query(insertSql, {name, description}, (err1, result1) => {
            if (err1) {
              res.json({
                status: 404,
                msg: err.message
              });
            } else if (result1.affectedRows !== 1){
              res.send({
                status: 400,
                msg: '数据写入失败'
              })
            } else {
              // 批量插入
              const insertSQL = "INSERT INTO scheme_detail(scheme_id, part_id, part_weight, part_price) VALUES ?"
              const schemeList = []
              list.forEach(item => {
                schemeList.push([
                  result1.insertId,
                  item.part_id,
                  item.part_weight,
                  item.part_price,
                ])
              })
              pool.query(insertSQL, [schemeList], (err2, data2) => {
                if (err2) {
                  res.json({
                    status: 404,
                    msg: err2.message
                  });
                }
                res.json({
                  status: 200,
                  msg: '新增成功!',
                  data: data2
                })
              })
            }
          })
        }
      })
    })
    
    • 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
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    1. 批量更新
    router.put("/updateScheme/:id", (req, res) => {
      const id = String(req.params.id)
      const {name, description, list} = req.body
      const sql = `update scheme set ? where id = '${id}'`
      pool.query(sql, { name, description }, (err, data) => {
        if (err) {
          res.send({
            status: 400,
            msg: err.message
          })
        } else if (data.affectedRows !== 1){
          res.send({
            status: 400,
            msg: '修改失败!'
          })
        } else {
          // 批量更新方案一:循环数据逐条进行更新或插入
          // 批量更新方案二:将原有的数据全部清除,再重新全部插入
          // 批量更新方案三:通过SQL直接修改
          const insertSQL = "replace into scheme_detail (id, scheme_id, part_id, part_weight, part_price) values ?;"
          const insertSQL1 = "INSERT INTO scheme_detail (id, scheme_id, part_id, part_weight, part_price) VALUES ? " +
            "ON DUPLICATE KEY UPDATE id=values(id),scheme_id=values(scheme_id),part_weight=values(part_weight),part_price=values(part_price);"
          const schemeList = []
          list.forEach(item => {
            schemeList.push([
              item.id,
              id,
              item.part_id,
              item.part_weight,
              item.part_price,
            ])
          })
          pool.query(insertSQL1, [schemeList], (err2, data2) => {
            if (err2) {
              res.json({
                status: 404,
                msg: err2.message
              });
            }
            res.json({
              status: 200,
              msg: '修改成功!',
              data: data2
            })
          })
        }
      })
    })
    
    • 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

    项目源码地址

    参考地址

    参考地址1

  • 相关阅读:
    攻防演习防御体系构建之第二篇之应对攻击的常用策略
    jxTMS设计思想之业务框架
    关于架构极客大学java进阶训练营
    数字峰会人气火爆,城链科技引发新一轮商业变革
    RPC - gRPC简单的demo - 学习/实践
    stable diffusion在建筑行业应用
    蓝桥杯单片机第六届省赛题详细讲解(温度记录器)
    Java-内部类
    [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
    SQLServer2019安装(Windows)
  • 原文地址:https://blog.csdn.net/weixin_39893889/article/details/134462708