Mybatis plus的自动填充与乐观锁的实例详解(springboot)

网友投稿 338 2022-11-13


Mybatis plus的自动填充与乐观锁的实例详解(springboot)

自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,如插入时间、更新时间。Mybatis-plus的自动填充功能可以帮助我们快速实现。

1.表中加入create_time,update_time字段

2.实体类注解填充字段

@TableField(fill= FieldFill.INSERT)

private Date createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)

private Date updateTime;

/**

* 默认不处理

/

DEFAULT,

/*

* 插入填充字段

/

INSERT,

/*

* 更新填充字段

/

UPDATE,

/*

* 插入和更新填充字段

*/

INSERT_UPDATE

3.自定义实现类MyMetaObjectHandler

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

/**

*

* 使用Mybatis-plus执行insert操作这个方法执行

*/

@Override

public void insertFill(MetaObject metaObject) {

this.setFieldValByName("createTime",new Date(),metaObject);

this.setFieldValByName("updateTime",new Date(),metaObject);

}

/**

*

* 使用Mybatis-plus执行update操作这个方法执行

*/

@Override

public void updateFill(MetaObject metaObject) {

this.setFieldValByName("updateTime",new Date(),metaObject);

}

}

setFieldValByName中有三个参数,第一个是字段名,第二个是要填充的数据,第三个参数写成metaObject就可以。

测试插入:

测试修改:

发现插入数据的时候会自动将这两个数据填充当前时间,更新的时候会只讲更新时间更改为当前时间。

乐观锁

当项目中出现并发操作时,会出现丢失更新问题,即A与B都查询到money字段为100,A修改money+900,改为1000。这时B也提交修改,money+50,改为150。A的修改就丢失了。

解决这种情况有两种方法:悲观锁和乐观锁,悲观锁就是只能一个一个操作,A操作的时候B只能等着,等A提交完成了B才能查询。

Mybatis-plus自带乐观锁:创建一个version字段,当A与B可以同时操作,当A提交的时候会看当前版本号与查询时候的版本号是否一致,一致才能提交成功,否则提交失败,提交成功会把当前版本号+1。

1.ZitjyNE数据库中加入version字段,并在实体类中加入version属性。

加上 @Version注解

@Version

private Integer version;

2.编写配置类引入乐观锁插件

@Configuration

@MapperScan("com.zyw.mpdemo.mapper")

public class MpConfig {

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor() {

return new OptimisticLockerInterceptor();

}

}

3.编写测试

用两个对象查询同一个id,做不同的修改,然后依次提交。

@Override

public void test(Account account) {

Account account1 = accountMapper.seZitjyNElectById(1326188266440888321L);

Account account2 = accountMahttp://pper.selectById(1326188266440888321L);

acchttp://ount1.setMoney(account.getMoney());

account2.setMoney(account.getMoney()+100);

accountMapper.updateById(account1);

accountMapper.updateById(account2);

}

第一次成功,第二次提交失败,因为第二次提交的时候的版本号与查询到的不一致。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:测试用例表格(测试用例表格中如何将测试结果内容批量删除)
下一篇:嵌入式软件接口设计(嵌入式软件设计基础)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~