2023年11月26日发(作者:)

MPupdate操作

⽂章⽬录

说明:

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);

}

结果: