MyBatis-Plus - 深入进阶(二)

简介: MyBatis-Plus - 深入进阶(二)

自定义sql,MybatisPlus不会忽略deleted属性,需要我们手动忽略。

自动填充

MybaitsPlus在我们插入数据或者更新数据的时候,为我们提供了自动填充功能。类似MySQL提供的默认值一样。


如果我们需要使用自动填充功能,我们需要在实体类的相应属性上加@TableField注解,并指定什么时候进行自动填充。mybatisPlus为我们提供了三种填充时机,在FieldFill枚举中。


public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入时填充字段
     */
    INSERT,
    /**
     * 更新时填充字段
     */
    UPDATE,
    /**
     * 插入和更新时填充字段
     */
    INSERT_UPDATE
}

设置好之后,我们还需要编写具体的填充规则,具体是编写一个填充类并交给Spring管理,然后实现MetaObjectHandler接口中的insertFill和updateFill方法。


Eg


插入User对象的时候自动填充插入时间,更新User对象的时候自动填充更新时间。

指定实体类中需要自动填充的字段,并设置填充时机。


@Data
@EqualsAndHashCode(callSuper = false)
public class User extends Model<User> {
    ...
    @TableField(fill = INSERT)
    private LocalDateTime createTime;
    @TableField(fill = UPDATE)
    private LocalDateTime updateTime;
    ...
}
  • 编写填充规则
@Component
public class MyMetaObjHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        if(metaObject.hasSetter("createTime")){
            setInsertFieldValByName("createTime", LocalDateTime.now(),metaObject);
        }
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        if(metaObject.hasSetter("updateTime")){
            setUpdateFieldValByName("updateTime",LocalDateTime.now(),metaObject);
        }
    }
}

解释一下为什么要用if判断是否有对应的属性


mybatisPlus在执行插入或者更新操作的时候,每次都会执行该方法,有些表中是没有设置自动填充字段的,而且有些自动填充字段的值的获取比较消耗系统性能,所以为了不必要的消耗,进行if判断,决定是否需要填充。


有些时候我们已经设置了属性的值。不想让mybatisPlus再自动填充,也就是说我们没有设置属性的值,mybatisPlus进行填充,如果设置了那么就用我们设置的值。这种情况我们只需要在填充类中提前获取默认值,然后使用该默认值就可以了。


@Override
public void updateFill(MetaObject metaObject) {
    if(metaObject.hasSetter("updateTime")){
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if(Objects.nonNull(updateTime)){
            setUpdateFieldValByName("updateTime",updateTime,metaObject);
        }else{
            setUpdateFieldValByName("updateTime",LocalDateTime.now(),metaObject);
        }
    }
}

对 @TableField(fill = FieldFill.INSERT_UPDATE) 理解


并不是有了这个注解就能进到MyMetaObjHandler,更不是注解了1个字段进去1次,注解了2个字段进去2次,并不是的,只要我们实现了MyMetaObjHandler就都可以进去的,而且一次UPDATE OR INSERT操作只会进一次;只是是否对该字段拥有写入权限的问题,只要被标注,就会在自定义的MyMetaObjHandler里进行对该字段有写入权限,否则哪怕set了,也没效果。


乐观锁

乐观锁适用于读多写少的情况,更新数据的时候不使用“锁“而是使用版本号来判断是否可以更新数据。通过不加锁来减小数据更新时间和系统的性能消耗,进而提高数据库的吞吐量。CAS机制就是一种典型的乐观锁的形式。


乐观锁是逻辑存在的一种概念,我们如果使用乐观锁需要手动在表的加上version字段。


mysql使用乐观锁伪代码示例:


update user 
set balabala....
where balabala... and version = xxx
目录
相关文章
|
SQL Java 数据库连接
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射
515 0
|
SQL Java 数据库连接
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!
MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!
371 0
|
SQL XML Java
Mybatis进阶——动态SQL(1)
Mybatis进阶——动态SQL(1)
121 3
|
XML Java 数据库连接
【JavaEE进阶】 MyBatis使用XML实现增删改查
【JavaEE进阶】 MyBatis使用XML实现增删改查
|
Java 关系型数据库 数据库连接
【JavaEE进阶】 MyBatis使用注解实现增删改查
【JavaEE进阶】 MyBatis使用注解实现增删改查
|
Java 关系型数据库 数据库连接
【JavaEE进阶】MyBatis⼊⻔
【JavaEE进阶】MyBatis⼊⻔
|
SQL XML Java
【JavaEE进阶】 MyBatis之动态SQL
【JavaEE进阶】 MyBatis之动态SQL
|
SQL Java 数据库连接
“MyBatis进阶:分页与特殊字符处理“
“MyBatis进阶:分页与特殊字符处理“
146 0
|
SQL XML Java
MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
587 0
|
SQL Java 程序员
Mybatis-Plus 进阶开发 -- Mybatis-Plus 入门教程(二)(3)
Mybatis-Plus 进阶开发 -- Mybatis-Plus 入门教程(二)
279 0
下一篇
开通oss服务