2020最新版在线教育实战项目SpringBoot+SpringCloud+SpringSecurity+Redis…
准备
后端技术
springboot
springcloud
mybatisPlus
spring security
redis
maven
easy excel
jwt
oauth2
前端技术
vue
element-ui
axios
node.js
其他技术
阿里云oss
阿里云视频点播服务
阿里云短信服务
微信支付和denglu
docker
git
Jenkins
MybatisPlus
入门demo
- 创建数据库
- 创建spring项目 spring initializr
- 引入依赖
注意:
mp自动生成id值(19位),无需设置id值
主键策略
分表的情况
假设id分布为:
表1:1~10000
表2:10001~20000
表3:20001~30000
UUID:每次生成一个随机的唯一的值
redis实现:redis(单线程的)的原子操作INCR和INCRBY来实现
mp策略:snowflake算法(41bit毫秒,10bit机器id,其中5个数据中心,5个机器ID,12bit毫秒内的流水号,最后一个符号位,永远是0)
@TableId(type = IdType.AUTO)
private Long id;
- AUTO:自动增长
- ID_WORKER:mp自带策略,数字类型
- ID_WORKER_STR:mp自带策略,String类型
- INPUT:手动输入
- NONE:无策略
- UUID
自动填充
- 表增加两个字段 create_time(datetime)和update_time(datetime)
alter table user
add create_time datetime null comment '创建时间';
alter table user
add update_time datetime null comment '修改时间';
- 修改实体类
private Date createTime;
private Date updateTime;
- 手动设置时间
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
userMapper.insert(user);
- 可以用mp的方式(自动填充)实现3
- 在实习类的自动填充属性上加注解
- 编写源对象处理器MyMetaObjectHandler,实现元对象处理器接口MetaObjectHandler
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 用mp实现添加操作,这个方法执行
* @param metaObject 元数据
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
/**
* 用mp实现修改操作,这个方法执行
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁
如果不考虑事务隔离性,则会产生读问题:脏读、不可重复读、幻读,写问题:丢失更新问题。
乐观锁实现原理:
增加字段 version
修改成功 版本号+1
实现:
- 实体类添加version字段,并添加@Version注解
public class User {
@Version
private Integer version;
alter table user
add version int null comment '版本号';
- 元对象处理器添加version的insert默认值
this.setFieldValByName("version",1,metaObject);
- 插件
@Configuration
@MapperScan("com.bookstore.demo1.mapper")
public class MyConfig {
/**
* 乐观锁插件
* @return 返回乐观锁
*/
@Bean
public OptimisticLockerInnerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInnerInterceptor();
}
}
- 要先查找后修改,否则version不会增加
User user = userService.selectById(7);
user.