各位好久不见,这一章主要讲的是数据持久化,那么,如何持久化,大家都会觉得,存入数据库的数据,所以为了方便大家学会创建数据库,给大家带来了MySQL的教学,不会的小伙伴,欢迎和我一起学习数据库。这一章节,会显得代码有点多,有点长,希望大家多敲代码,加深理解。
一、数据持久化
1、应用程序的数据通常存储在数据库中。
2、我们使用MySQL数据库实现数据的持久化。
3、为了更方便的操作mysql,我们使用sequelize(ORM框架)管理数据层的代码。
二、ORM(对象关系映射)
1、将数据从对象的形式,转换成表格的形式。
2、sequelize是一个基于node的orm框架。
3、通过egg-sequelize,可以直接使用sequelize提供的方法操作数据库,而不需要动手写SQL语句。
三、安装sequelize
1、下载egg-sequelize:npm install --save egg-sequelize mysql2
2、在plugin.js文件中引入插件
module.exports = {
sequelize:{
enable:true,
package:'egg-sequelize'
}
}
3、在config.default.js文件中配置数据库连接
config.sequelize = {
dialect:'mysql',
database:'demo',
host:'localhost',
port:3306,
username:'root',
password:'123456'
}
4、在app/model文件中创建数据模型
在app下的model文件夹下创建clazz.js文件
module.exports = app => {
const {
STRING
} = app.Sequelize
//默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转为负数
const Clazz = app.model.define('clazz', {
name: STRING
})
return Clazz
}
5、添加app.js文件,初始化数据库
module.exports = app => {
app.beforeStart(async function () {
//await app.model.sync({force:true});//开发环境使用,会删除数据
//sync 方法会根据模型去创建表
await app.model.sync({})
})
}
ps:这个为什么会在表名后加个s呢,因为数据库会给我们自动加上s,所以不管你取什么名字,都会在后面加上s。
三、数据类型
MySQL数据类型与sequelize数据类型对应如下
1、STRING => varchar(255)
2、INTEGER => int
3、DOUBLE => double
4、DATE => datetime
5、TEXT => text
四、数据操作
在controller中实现数据的增删改查
说明:在真实的项目中,controller和操作数据的逻辑要分离,以便于项目的扩展与维护
this.app.model.Clazz.findAll();//查询数据
this.app.model.Clazz.findAll({where:{id:1}}) //通过where设置查询条件
this.app.model.Clazz.create({name:"xx"}) //添加数据
this.app.model.Clazz.update({name:"xx"},{where:{id:1}}) //通过条件修改数据
this.app.model.Clazz.destory({where:{id:1}}) //通过条件删除数据
五、实际操作(为了方便不做异常处理)
来举个例子实际操作一下
题目:制作学生成绩管理功能,数据存储在mysql中,要求如下:
1、实现班级列表的查看、添加、删除功能
2、实现学生列表的查看、添加、删除功能
3、学生字段包括,id、姓名、成绩、班级名称
- 首先,路由里面写上两个egg给我们封装好的接口形式,增删改查,样样都有,我们需要一个班级的,一个学生的
router.resources('clazz', '/clazz', controller.clazz)
router.resources('students', '/students', controller.students)
-
接下来,我们就要去画vue的页面了,第一个要把班级列表画出来
添加班级
编辑
删除
学生管理
- 画好页面写好逻辑,就要看后台是如何操作的了
const Controller = require('egg').Controller; //Controller类
class clazzController extends Controller {
//班级列表
async index() {
let name = this.ctx.request.query.name
if (name) {
let clazzList = await this.app.model.Clazz.findAll({
where: {
name
}
})
this.ctx.body = clazzList
} else {
let clazzList = await this.app.model.Clazz.findAll()
this.ctx.body = clazzList
}
}
//新增班级
async create() {
let name = this.ctx.request.body.data.name
await this.app.model.Clazz.create({
name
})
this.ctx.body = "添加成功"
}
//删除班级
async destroy() {
let id = this.ctx.params.id
await this.app.model.Clazz.destroy({
where: {
id: id
}
})
this.ctx.body = "删除成功"
}
//更新班级
async update() {
let id = this.ctx.params.id
let name = this.ctx.request.body.data.name
await this.app.model.Clazz.update({
name: name
}, {
where: {
id: id
}
})
this.ctx.body = '修改成功'
}
}
module.exports = clazzController
解析:我知道很多刚接触这种的小伙伴一时间没办法理解,这里目前只是一个表的增删改查,如果涉及到后面多表联查,多个表之间建立联系,就会复杂起来,但是没关系,我们一个一个消化,搞懂一个才能去搞懂下一个。
班级的建表逻辑就是id,是自动生成的,主要是存储name(班级名称),vue页面的逻辑还是非常简单的,查询,列表,删除,修改,新增。后台的逻辑,新增的时候去获取前台传来的name的值,并存入数据库,获取班级列表这里,稍微有点不一样了,获取输入的name,根据名称是查询列表,但是有一点,如果name传的是空的值,我们就查询全部就行了,这里要做一个简单的判断就行了。删除根据id删除,至于这个更新,同学们容易犯的错误,这里不是post了,是put了,就像是删除是delete一样,千万别写错了,根据id去更新,把新输入的name更新掉。
- 讲完简单的班级列表,我们需要在班级里面加上学生的信息,这里就比较难了。首先要去写一个student数据模型,去建一个学生表,以及这个联查函数。
module.exports = app => {
const {
STRING,
DOUBLE
} = app.Sequelize;
const Student = app.model.define('student', {
name: STRING,
achievement: DOUBLE
})
Student.associate = function () { //所属哪个班级,指向班级主键
app.model.Student.belongsTo(app.model.Clazz, {
foreignKey: 'clazz_id',
as: 'clazz'
})
}
return Student
}
之后的学生的增删改查,都是一样的,这里就放上全部的代码了,唯一要注意的就是这个clazz_id是作为连接两个表的桥梁的。
const Controller = require('egg').Controller; //Controller类
class studentController extends Controller {
//学生列表
async index() {
let studentList = await this.app.model.Student.findAll()
this.ctx.body = studentList
}
//新增学生
async create() {
let name = this.ctx.request.body.data.name
let achievement = this.ctx.request.body.data.achievement
let clazz_id = this.ctx.request.body.data.clazz_id
await this.app.model.Student.create({
name,
achievement,
clazz_id
})
this.ctx.body = '添加成功'
}
//删除班级
async destroy() {
let id = this.ctx.params.id
await this.app.model.Student.destroy({
where: {
id: id
}
})
this.ctx.body = "删除成功"
}
//更新班级
async update() {
let id = this.ctx.params.id
let name = this.ctx.request.body.data.name
let achievement = this.ctx.request.body.data.achievement
let clazz_id = this.ctx.request.body.data.clazz_id
await this.app.model.Student.update({
name,
achievement,
clazz_id
}, {
where: {
id: id
}
})
this.ctx.body = '修改成功'
}
}
module.exports = studentController
请求数据
注销
添加班级
编辑
删除
添加学生
编辑
删除
那么本文到这里也就结束了,此代码,有些地方可能会存在bug没有考虑到,所以博主,会上传git,大家可以去看看最新完整的代码进行查询,感谢你们的观看。顺便,博主推荐一首歌《爱的回归线》,没错,看过《爱情公寓》的小伙伴一定是非常熟悉的歌,我想也许我要像婉瑜给展播的心里那样,虽然我不是很想结束,但是新的生活总要开始,那一段开心的时光,会变成回忆,但是未来的人生还要自己去开启。现在看来,我已经不想逃了,重新开始人生,比救赎更重要吧。以及我想对这几天也经历过我一样经历的好朋友说,我们虽然都是失败者,但是失败并不意味着自己人生的结束,我们都值得变得更好,振作一点。
传送门:
1、第一章 Egg框架概述:https://www.jianshu.com/p/bfdaecb5a18c
2、第二章 路由与控制器:https://www.jianshu.com/p/62edeb088d76
3、第三章 插件:https://www.jianshu.com/p/e8d39f446f46
4、第四章 用户登录状态(上) :https://www.jianshu.com/p/a43759eab484
5、第五章 用户登录状态(下) :https://www.jianshu.com/p/06937d8d1241
6、第六章 中间件:https://www.jianshu.com/p/e369798c0e42