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

在这里插入图片描述

  1. 实体类同步(即User中增加两个属性)
    在idea中刷新数据库,会发现所有数据都加上了两个属性值
  2. 更新测试
    重新运行一下更新测试,刷新得到结果:
    在这里插入图片描述

方式二:代码级别

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

结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值