说明:
1.我是看B站狂神的视频学习的,所以笔记与狂神讲的很相似
2.学习MyBatisPlus,看官方文档也很重要]
环境:
- jdk1.8
- Mybatis-Plus3.4.1
更新(update)
数据库表中数据如图
1、实现更新
1.编写测试类
(1)
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setName("小红111");
int i = userMapper.updateById(user);
System.out.println(i);
System.out.println(user);
}
运行结果:
(2)
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setName("小红");
user.setAge(20);
int i = userMapper.updateById(user);
System.out.println(i);
System.out.println(user);
}
运行结果:
总结:
两次修改的内容不同,查看sql语句可以发现,MP会自动 动态拼接sql语句。
注意:
有时候只改name,可能默认把别的属性值(比如年龄)也给改了,我还不知道是啥原因,这种情况就先通过select获取User,再修改对应属性值吧。
2、自动填充
现实生活中有一些字段需要自动化完成,比如创建时间、修改时间这些。
方式一:数据库级别
- 在表中新增字段 create_time,update_time
- 实体类同步(即User中增加两个属性)
在idea中刷新数据库,会发现所有数据都加上了两个属性值 - 更新测试
重新运行一下更新测试,刷新得到结果:
方式二:代码级别
1.在表中新增两个字段
2.完善实体类User
@TableField(fill= FieldFill.INSERT)
private Date createTime;
@TableField(fill= FieldFill.INSERT_UPDATE)
private Date updateTime;
- 枚举FieldFill有很多类型
package com.baomidou.mybatisplus.annotation;
public enum FieldFill {
DEFAULT, //啥都不管
INSERT, //新增的时候填充
UPDATE,//修改的时候填充
INSERT_UPDATE; //新增和修改的时候填充
private FieldFill() {
}
}
3.编写处理器来处理这个注解
创建类MyMetaObjectHandler,重写两个方法
import java.util.Date;
@Slf4j //日志
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/*
插入时的填充策略
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert ...");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
/*
更新时的填充策略
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update ...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4.测试
(1)新增用户
(2)修改该用户信息
3、乐观锁
通常数据库表中还有一个字段,叫乐观锁字段-version.当要更新一条记录的时候,希望这条记录没有被别人更新,此时就会用到乐观锁。
- 乐观锁:无论干什么都不去上锁,如果出现了问题,再次更新值测试
- 悲观锁:无论干什么都上锁,再去操作
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
e.g.模拟两个线程同时修改同一条数据
乐观锁:先查询,获得版本号,version = 1
--- 线程A
update user set name="小明" version=version+1
where id = 1 and version = 1
--- 线程B 抢先完成,此时version=2 A修改失败
update user set name="小明" version=version+1
where id = 1 and version = 1
实现乐观锁
1.数据库添加version字段
2.添加字段,加上注解
@Version //乐观锁注解 代表为乐观锁字段
private Integer version;
3.在配置类MybatisPlusConfig里面添加配置组件
//旧版插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
旧版插件在idea中是这样显示的,但运行起来不会出错。我这个环境用新版的配置反倒出错。(额。。。我今天试了试新版又不出错了,反正两个版本都试试呗,那个可以用哪个)
新版配置:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
4.测试
- 测试之前
/*
测试乐观锁成功
*/
@Test
public void testOptimisticLocker(){
//1.查询信息
User user = userMapper.selectById(1L);
//2.修改信息
user.setName("张小红");
user.setEmail("2084866363@qq.com");
//3.执行更新操作
userMapper.updateById(user);
}
结果:(version值已发生变化)
/*
测试乐观锁失败
*/
@Test
public void testOptimisticLocker2(){
//1.查询信息
User user = userMapper.selectById(1L);
user.setName("小红111");
user.setEmail("xiaohong@qq.com");
//模拟另一个线程执行操作
User user2 = userMapper.selectById(1L);
user2.setName("小红222");
user2.setEmail("xiaohong@qq.com");
userMapper.updateById(user2);
//3.执行更新操作
userMapper.updateById(user);
}
结果: