一、ORM框架概述
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
这种方案存在以下不足:
持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,ibatis,speedframework。
ORM的方法论基于三个核心原则:
简单:以最基本的形式建模数据。
传达性:数据库结构被任何人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。
二、引入sequelize
安装egg-sequelize
1# 下载依赖,安装egg-sequelize和mysql272npm install --save egg-sequelize mysql2
在egg项目中配置egg-sequelize
1// config/plugin.js2exports.sequelize = {3enable:true,4package: 'egg-sequelize'5}
1// config/config.default.js 2config.sequelize = { 3dialect: 'mysql', 4database: 'army',//数据库名 5host: 'localhost', 6port: '3306', 7username: 'root',//用户名 8password: '',//密码 9operatorsAliases:false,10}
1// 根目录 app.js,没有创建一个app.js2module.exports = app => {3app.beforeStart(asyncfunction () {4// await app.model.sync({ force: true }); // 开发环境使用,会删除数据表5await app.model.sync({});//会永久保存数据6 });7};
三、创建数据模型
数据模型
这种模式可以通过控制器和服务进行访问app.model.Clazz或者ctx.model.Clazz,比如我们写app/controller/Clazz.js:
// app/model/clazz.jsmodule.exports = app => {
const {
STRING
} = app.Sequelize;//数据库字段类型,一对多 const Clazz = app.model.define('clazz', {//sequelize会自动创建主键name: STRING,//数据库字段名称与字段类型 })
returnClazz;//返回班级}
1// app/model/students.js 2module.exports = app => { 3 const { 4 STRING 5} = app.Sequelize; 6 7const Students = app.model.define('students', { 8 name: STRING, 9 })1011Students.associate =function () {12app.model.Students.belongsTo(app.model.Clazz, {//设置外键13foreignKey: 'clazz_id',//关联的外键14as: 'clazz'//将关联的数据显示到该字段上15 })16 }1718return Students;19}
四、操作数据
Controller获取数据
1// app/controller/clazz.js 2'use strict'; 3 4const Controller = require('egg').Controller; 5 6class ClazzController extends Controller { 7//查询班级列表 8 async index() { 9const clazzList = awaitthis.app.model.Clazz.findAll();//查询数据库中Clazz.10awaitthis.ctx.render('clazz_list', {11clazzList: clazzList//将记录标题'Hello World'插入'posts'表12//查询条件和结果自定义13 })14 }1516//添加班级的页面17 async insertClazz(){ 18awaitthis.ctx.render('create_clazz.html')19 }2021//在数据库中添加班级22 async create() {23const body =this.ctx.request.body;24const clazz = {25 name:body.name26 }27awaitthis.app.model.Clazz.create(clazz);//把添加得班级存入到数据库中。28this.ctx.redirect("/clazz")//重镜像,添加数据之后自动跳转/Clazz页面29 }3031//通过id在数据库中删除班级32 async destroy() {33const id =this.ctx.request.body.clazz_id;34const student = awaitthis.app.model.Clazz.findOne({35 where: {36 id: id37 }38 });39 student.destroy();40this.ctx.redirect("/clazz")41 }42}4344module.exports = ClazzController;
1// app/controller/students.js 2'use strict'; 3 4const Controller = require('egg').Controller; 5 6class StudentsController extends Controller { 7// 联查学生信息 8 async index() { 9const studentList = awaitthis.app.model.Students.findAll({10include:[{//联查班级的数据11model:this.app.model.Clazz,12as:'clazz'13 }]14 });15awaitthis.ctx.render('student_list.html', {16 studentList: studentList17 })18 }1920//添加学生的页面21 async insertStudent() {22const clazzList = awaitthis.app.model.Clazz.findAll();23awaitthis.ctx.render('create_student.html', {24 clazzList25 })26 }2728// 在数据库中添加学生29 async create(){30const body =this.ctx.request.body;31const student = {32 name:body.name,33 clazz_id:body.clazz_id34 }35awaitthis.app.model.Students.create(student);36this.ctx.redirect("/students")37 }3839// 通过id删除学生信息40 async destroy(){41const id =this.ctx.request.body.student_id;42//findOne指的是查找指定表的单条数据,返回一个对象43const student = awaitthis.app.model.Students.findOne({44//where()条件查询45 where:{46 id:id47 }48 });49 student.destroy();50this.ctx.redirect("/students")51 }52}5354module.exports = StudentsController;