网站内容更新策略(文中示例代码介绍(二十五):非空判断字段策略)
优采云 发布时间: 2021-10-26 17:12网站内容更新策略(文中示例代码介绍(二十五):非空判断字段策略)
本文文章主要介绍Mybatis-Plus字段策略和数据库自动更新时间的一些问题。文章中介绍的示例代码非常详细。对大家的学习或工作有一定的参考学习价值。有需要的朋友和小编一起学习吧
字段策略0:“忽略判断”,1:“非NULL判断”),2:“非空判断”
问题描述:
当字段策略为0“忽略判断”时,如果实体和数据库有需要自动更新的字段,比如update_time,update_time会在一条记录更新时自动刷新。理论上,我们在业务控制的时候不需要设置update_time。是的,使用数据库特性是好的,但是在这种字段策略下,业务逻辑必须更新字段(update_time 不是主动设置的)。这时候因为忽略了判断,数据库(这里是MySql)不会更新update_time,即使这个字段在数据库中定义如下:update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE。在此字段策略下,该字段将设置为空。执行特定语句时,插入 table(....,update_time) values(...,null) )。
解决方案
实现MetaObjectHandler的insertFill()方法和updateFill()方法
@Component public class MyMetaObjectHandler extends MetaObjectHandler { //新增填充 @Override public void insertFill(MetaObject metaObject){ // 获取当前时间,自动更新以下数据库字段 setFieldValByName("updateTime", new Date(), metaObject); } //更新填充 @Override public void updateFill(MetaObject metaObj ct) { // 获取当前时间,自动更新以下数据库字段 setFieldValByName("updateTime", new Date(), metaObject); } }
添加一个新的Component,继承MetaObjectHandler,覆盖insertFill()和updateFill()方法,自定义插入和更新规则,在基类中继承这两个方法为空。
注意这个方法只有在使用Mybatis-plus包时才有效。使用自己定义的服务不会生效。这是一个坑,所以我不推荐这种方法。
设置字段策略为2“非空判断”
这时候无论是insert还是update语句,都只会完成对已经设置好的具体value属性的操作。例如:表中除了update_time,还有一个user_name字段。我们在代码中设置了这个字段的值。然后insert时执行的语句是:insert into table (user_name) valuse(userName),但是不对不要设置value字段做任何操作,这样时间相关的字段就可以直接交给数据库。
字段策略“非空判断”的一个问题
假设有一个Entity User,这个Entity属性没有默认值,我们新建一个实例,User user = new User(),然后什么都不做,调用UserService.insert(),那么就会有问题,Mybatis-plus不知道你要插入哪个值,因为没有显示setter。这是一个需要注意的问题。
以上就是Mybatis-Plus字段策略和数据库自动更新时间的一些问题的详细内容。更多详情请关注其他相关html中文网站文章!