2023年11月26日发(作者:)
MP的update操作
⽂章⽬录
说明:
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、⾃动填充
现实⽣活中有⼀些字段需要⾃动化完成,⽐如创建时间、修改时间这些。
⽅式⼀:数据库级别
1. 在表中新增字段 create_time,update_time
2. 实体类同步(即User中增加两个属性)
在idea中刷新数据库,会发现所有数据都加上了两个属性值
3. 更新测试
重新运⾏⼀下更新测试,刷新得到结果:
⽅式⼆:代码级别
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@");
//3.
执⾏更新操作
userMapper.updateById(user);
}
结果:(version值已发⽣变化)
/*
测试乐观锁失败
*/
@Test
public void testOptimisticLocker2(){
//1.
查询信息
User user = userMapper.selectById(1L);
user.setName("⼩红111");
user.setEmail("xiaohong@");
//
模拟另⼀个线程执⾏操作
User user2 = userMapper.selectById(1L);
user2.setName("⼩红222");
user2.setEmail("xiaohong@");
userMapper.updateById(user2);
//3.
执⾏更新操作
userMapper.updateById(user);
}
结果:


发布评论