前言
- 需要掌握的知识点:循序渐进需要掌握以下知识
两种比较常见的商业模式
- B2C模式(在线教育就是使用的这种模式)
两个角色:管理员 和 普通用户
管理员:添加 删除 修改
普通用户: 查询 - B2B2C模式(商家到商家到用户,很多电商项目是这种模式)
京东:普通用户:可以自营的 也可以买普通商家的
在线教育最核心的模块:课程模块
项目架构
b2c模式
项目分为两个部分:
-
系统后台------管理员使用
-
讲师管理模块
-
课程分类管理模块
-
课程管理模块
(1) 视频
-
统计分析模块
-
订单管理
-
banner管理(幻灯片,轮播图)
-
权限管理
-
-
系统前台------普通用户使用
-
首页数据显示
-
讲师列表和详情
-
课程列表和课程详情
(1) 视频在线播放
-
登入和注册的功能
-
微信扫描登入
-
微信扫描支付功能
-
项目采用:前后端分类开发
后端技术
- springboot
- springcloud
- MybatisPlus
- spring security
- redis
- maven
- easyExcel
- jwt
- OAuth2
前端技术
- vue + element-ui + axios + node.js…
其他技术
- 阿里云oss
- 阿里云视频点播服务
- 阿里云短信服务
- 微信支付
- docker
- git
- jenkins
MyBatis Plus入门
对mybatis做增强,简化开发
-
创建数据库,创建数据库表,添加数据,用于mp操作。
-
创建springboot 工程。
-
引入相关依赖
springboot 和mp依赖
-
安装lombook插件(用于简化实体类)
-
创建application.properties文件并做相关配置。
-
写代码
1.spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver //驱动发生了改变,加了cj
2.spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8 //后面加了时区,这里表示东八区
3.spring.datasource.username=root
4.spring.datasource.password=123456
-
实体类上面加注解@data,运用了lombok简化了实体类,省略了get、set方法。
-
对于mapper,让它继承
baomidou
的BaseMapper
,就可以用里面的增删改查方法,就省略了xml文件。 -
springboot启动会找接口的实现类,但是我们这里的
UserMapper
没有实现类,所以要在启动类上面加入注解MapperScan
,后面加入mapper包的地址,就可以扫描到了。7.配置日志
配置了日志可以在终端查看sql语句等信息。
#mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImp
编写
addUser
方法出现的问题:id自增并没有成功
这里的id 是mp自动帮生成的一个十九位
Long
类型
自增策略
-
自动增长 AUTO INCREMENT
缺点:在分表中,对于下一张表,还需要知道上一张表的最后一 条记录,不是很方便,但功能都能实现
-
UUID 每次生成随机唯一的值
优点:不用记录上一张的值
缺点:无法排序
-
Redis生成ID
-
mp自带策略 snowflake算法
要更换id策略,则需要在id属性上面加上注解
如果id
是long
类型,则使用上面那个注解
如果id
是Stirng
类型,则需要使用下面那个注解
mp实现自动填充操作
第一步:在实体类里面进行自动填充属性添加注解
//表中字段,要驼峰命名法
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
第二步:创建类,实现接口MetaObjectHandler
// 使用mp实现添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
// 三个参数,第一个属性名,第二个时间,第三个原数据对象(metaObject),相当于对原数据封装的对象
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
// 使用mp的修改操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
最后记得加入@Component
交给Spring来管理
乐观锁
乐观锁:解决某些问题
主要解决 - 丢失更新
如果不考虑事务隔离性,产生读问题?
脏读 不可重复读 幻读
写问题:丢失更新
解决方案:
-
悲观锁
串行操作,只能等一个人更新完了,另一个人才能更新,效率很低
-
乐观锁
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
mp简单查询
-
简单查询
User user = userMapper.selectById(1409357082813071361L);
-
根据多个id查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L,2L,3L));
-
根据map进行查询(用的非常少)
public void testSelectByMap(){ HashMap<String, Object> map = new HashMap<>(); map.put("name", "jack"); map.put("age", 120); userMapper.selectByMap(map); }
mp分页查询
第一步: 配置分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
第二步:编写分页代码
直接new page对象,传入两个参数:
- 当前页和每页显示记录数
- 调用mp方法实现分页查询
逻辑删除
- 表添加逻辑删除字段,对应实体类添加属性 属性添加注解
- 配置逻辑删除插件
/**
* 逻辑删除插件
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
执行删除语句我们可以看到底层执行语句
UPDATE user SET deleted=1 WHERE id=? AND deleted=0
性能分析插件
/**
* SQL 执行性能分析插件
* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
mp实现复杂查询
使用QueryWrapper
建立查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
1.ge、gt、le、lt、isNull、isNotNull
ge:大于等于
gt
2.eq、ne
eq:等于
ne:不等于
3.between、notBetween
4.allEq
5.like、notLike、likeLeft、likeRight
6.in、notIn、inSql、notinSql、exists、notExists
7.or、and
8.嵌套or、嵌套and
9.orderBy、orderByDesc、orderByAsc
10.last
11.指定要查询的列
12.set、setSql