• 在Express框架使用ORM模型访问关系型数据库


    一、ORM模型:设计思想,主要目的是简化计算机程序访问数据库

    1、ORM:对象关系模型(对象关系映射) Object Releastion Model,将程序中的对象和数据库中关系(表格)进行映射。可以使开发者在程序中方便的对数据库进行操作(用户在程序操作对对象实际就是操作数据库的表格)

    2、ORM的映射关系:

    (1)程序中的模型(即为类) <——> 表名

    (2)模型的类型(类中定义的属性)<——> 表的列

    (3)由模型创建的对象(类的实例) <——> 表中的行

    二、在Node中ORM的实现

    1、Sequelize模块:支持ORM映射的模块,可以访问关系型数据库,可以提高node程序访问数据库的开发效率。

    2、Sequelize模块的使用:

    (1)安装MySQL模块:npm install mysql2

    (2)安装Sequelize模块:npm install sequelize

    3、Sequelize模块的使用

    (1)创建数据库的配置文件

             1️⃣ 导入

             2️⃣ 创建数据库的配置对象

    1. //1.导入Sequelize模块
    2. const Sequelize = require('sequelize');
    3. //2.使用Sequelize模块配置和数据库的连接信息
    4. const mysql_Sequelize = new Sequelize('sales','root','syy2589',{
    5. host:'localhost', //数据库服务器的IP地址或域名
    6. port:'3306', //数据库使用的端口号,MySQL数据库默认端口号3306
    7. dialect: 'mysql', //数据库的类型
    8. pool:{ //数据库连接池:可以放若干个数据库的连接对象,提高数据库访问效率
    9. max:20, //数据库连接池中连接对象的最大个数
    10. min:3, //数据库连接池中连接对象的最少个数
    11. idle:20000 //等待延迟的时间,单位:毫秒
    12. },
    13. define:{
    14. 'charset':'utf8' //处理MySQL中中文字符的问题
    15. }
    16. })
    17. // 3.导出数据库的连接对象
    18. module.exports = mysql_Sequelize;

    注:new Sequelize(数据库名,用户名,密码,(配置信息))

            3️⃣ 测试数据库是否连接成功

    1. const mysqltest = require('./mysqlconfig.js');
    2. mysqltest.authenticate() //用来测试数据库是否连接成功
    3. .then(()=>{
    4. console.log('数据库连接成功~')
    5. })
    6. .catch((err)=>{
    7. console.error(err);
    8. })

    (2)创建模型:实现模型和数据表的映射

    模型名 = sequelize.define('数据表名','模型的属性',{其他配置})

    模型名 <——> 数据表名
    模型的属性<——> 数据表列

    1. const Sequelize = require(sequelize);
    2. //1.导入数据库的配置对象
    3. const mysql_Sequelize = require('../config/mysqlconfig.js');
    4. // 2.创建模型与数据库中的表实现映射
    5. const Employee = mysql_Sequelize.define('employee',{
    6. 'e_id':{
    7. type:Sequelize.STRING,
    8. // type:Sequelize.INTEGER, 表示id的数据类型为int型
    9. autoIncrement:false, //表示id的值在表中是否自增
    10. allowNull:false, //表示id对象的值不能为空
    11. fields:'e_id',//实现模型的属性名和表的列名之间的映射关系(对应关系)
    12. },
    13. 'e_name':{
    14. type:Sequelize.STRING,
    15. autoIncrement:false,
    16. allowNull:false,
    17. fields: 'e_name',
    18. },
    19. 'sex':{
    20. type:Sequelize.STRING,
    21. autoIncrement:false,
    22. allowNull:false,
    23. fields: 'sex',
    24. },
    25. 'apartment':{
    26. type:Sequelize.STRING,
    27. autoIncrement:false,
    28. allowNull:true,
    29. fields: 'apartment',
    30. },
    31. 'phone':{
    32. type:Sequelize.STRING,
    33. autoIncrement:false,
    34. allowNull:true,
    35. fields: 'phone',
    36. },
    37. 'address':{
    38. type:Sequelize.STRING,
    39. autoIncrement:false,
    40. allowNull:true,
    41. fields: 'address',
    42. },
    43. },{
    44. freezeTableName:true, //不使用Sequelize给模型自定义的表名(自定义表名的命名规则:模型名后加s)
    45. timestamps:false //若为true,在获取数据时会自动添加两列数据(createTime、updateTime)
    46. });
    47. // 导出模型
    48. module.exports = Employee;

    (3)创建接口文件:使用模型创建数据表

             1️⃣插入记录

             模型名.create({ }).then((result)=>{}):then表示插入操作完成后的处理,result参数中保存有数据库返回的信息

    1. // http://localhost:9000/employee/addemp
    2. Emprouter.post('/addemp',(req,res)=>{
    3. console.log(req.body);
    4. Employee.create({
    5. id:req.body.id,
    6. name:req.body.name,
    7. sex:req.body.sex,
    8. apartment:req.body.apartment,
    9. phone:req.body.phone,
    10. address:req.body.address
    11. }).then((result)=>{
    12. if(result){
    13. res.json({
    14. code:1002
    15. })
    16. }
    17. })
    18. })

    (4)前端页面:使用jQuery向服务器端发起ajax请求

            1️⃣表单序列化:表单名.serizlize(),作用是将表单中所有控件的值序列化成字符串

             2️⃣删除记录

            

    模型名:destroy({

    where:{

    列名:值

    }

    }).then((result)=>{

    删除成功后的回调

    }

             3️⃣ 更新记录

    模型名.update({修改的列},{where条件}.then((result)={

    更新成功后的回调

    }).catch((e)=>{

    出现异常的回调

    })

             4️⃣ 查询记录

    模型名.findAll().then((result)=>{ //result:是一个数组,存放的是从数据库中查询的所有记录

    查询成功后的回调

    }).catch((e)=>{

    执行查询出现异常的回调

    }

    1. Emprouter.get('/findemp',(req,res)=>{
    2. if(req.url != './favicon.ico'){
    3. Employee.findAll().then((result)=>{
    4. res.send(JSON.stringify(result));
    5. })
    6. }
    7. })

            5️⃣ 模糊查询:  

            在执行带条件查询时,需要导入Sequelize模块的Op子模块,在Op子模块中存放的是所有条件查询的关键字。

    const Op = require('sequelize').Op;
    1. Emprouter.post('/findlike',(req,res)=>{
    2. // 获取前端发送的部门
    3. let apartment = req.body.apartment;
    4. // 进行模糊查询
    5. Employee.findAll({
    6. where:{
    7. apartment:{
    8. [Op.like]:apartment+'%'
    9. }
    10. }
    11. }).then((result)=>{
    12. res.json(result);
    13. }).catch((e)=>{
    14. console.log(e);
    15. res.json('查询失败~')
    16. })
    17. })

  • 相关阅读:
    关于POM声明为provided的依赖,运行程序时报错NoClassDefFoundError
    DIY 3 种分库分表分片算法,自己写的轮子才吊!
    新手QML贪吃蛇 Qt Quick
    谷歌自研芯片Tensor重磅来袭:“机器学习的里程碑”
    LeetCode栈和队列练习
    【转】数据库索引详细介绍
    深度学习系列50:苹果m1芯片加速pytorch
    python+django协同过滤算法的音乐推荐系统研究vue
    PAT乙级 1070 结绳 python
    洛谷千题详解 | P1017 [NOIP2000 提高组] 进制转换【C++、Java、Pascal、Python语言】
  • 原文地址:https://blog.csdn.net/m0_73634593/article/details/128057076