Mybatis-Plus使用心得——小白给小白的入门笔记(SpringBoot2.X)

之前自己练手的时候用过Mybatis-Plus,但现在公司项目中也用到了,也还是记录一下吧。也还是看官方参考文档和代码示例来的,Mybatis-Plus版本:3.1.0。使用到的有:逻辑删除,乐观锁,自动填充,通用枚举,代码生成。

1.逻辑删除

1.1 application.yml配置逻辑删除和非逻辑删除的值,这里设置逻辑删除为1,未删除为0。

mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

1.2 注解@TableLogic设置实体类上要逻辑删除的字段

@Data
public class BaseEntity implements Serializable {
    ...
    ...
    
    /**
     * 是否软删
     */
    @TableLogic
    private Boolean isDeleted;

    ...
    ...
}

1.3 注册Bean(截止至2019年6月26日,官方文档中说明 -> 注册 Bean(3.1.1开始不再需要这一步),小伙伴可以试一下不注册Bean能否成功。)

@Configuration
public class MyBatisPlusConfiguration {

    ...
    ...
    
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
    
}

这样就可以愉快的使用啦,它会在你CURD接口和条件构造器上:

1.使用查找的时候自动在查找条件加上 and is_deleted = 0;(默认开启了驼峰转换:mybatis-plus.configuration.map-underscore-to-camel-case=true)

2.删除的时候设置is_deleted = 1。

注意标红的地方,为什么这么说呢:如果你在XXMapper.xml文件中写sql语句,你写的什么就是什么,Mybatis-Plus是不会做任何改变的。也就是说,你在

XXMapper.xml写了一个删除语句delete from student where id=1,这样真会把id为1的学员删除。


2.乐观锁

2.1 注册乐观锁Bean

@Configuration
public class MyBatisPlusConfiguration {

    ...
    ...
    
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
    
}

2.2 注解@Version设置实体类上乐观锁version字段

@Data
public class BaseEntity implements Serializable {
    /**
     * 版本号
     */
    @Version
    private Long version;

}

就可以使用啦,例子 -> 更新特定字段:

        //更新XX表中的特定字段,params为请求参数,xxMapper继承了BaseMapper

        UpdateWrapper<XXEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("xx", params.getXX())
                .set("xx", params.XX())
                .set("xx", params.getXX());
        updateWrapper.eq("id", params.getId());

        //乐观锁更新申请信息
        XXEntity entity = new XXEntity();
        entity.setVersion(params.getInfoVersion());
        int updateCount = xxMapper.update(entity, updateWrapper);
        if (updateCount > 0) {
            //更新成功
            //do something...

        }

 


3.字段自动填充

3.1 配置要自动填充的字段,这里配置了createTime在执行insert方法时会自动填充,editTime在insert或update会自动填充。

@Data
public class BaseEntity implements Serializable {
    ...
    ...    

    
     /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 修改时间
     */
    @TableField(value = "edit_time", fill = FieldFill.INSERT_UPDATE)
    private Date editTime;
    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT)
    private String creator;
    /**
     * 修改人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String editor;


}

3.2 自定义实现MyMetaObjectHandler,

public class MetaObjectHandlerConfig implements MetaObjectHandler {

    // mybatis-plus公共字段自动填充,https://baomidou.oschina.io/mybatis-plus-doc/#/auto-fill
    @Override
    public void insertFill(MetaObject metaObject) {
        Date date = new Date();
        //获取creator的值,并赋值给editor
        setInsertFieldValByName("editor",metaObject.getValue("creator"),metaObject);
        setInsertFieldValByName("createTime", date, metaObject);
        setInsertFieldValByName("editTime", date, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Date date = new Date();
        setUpdateFieldValByName("editTime", date, metaObject);
    }
}

这样插入更新的时候就不用了设置createTime,editTime啦。


4.通用枚举

4.1 实体类定义属性为枚举类型

@Data
public class BaseEntity implements Serializable {
    ...
    ...    

    
    /**
     * 枚举
     */
    private GenderEnum gender;


}

4.2 注解@EnumValue标记数据库存的值

@Getter
public enum GenderEnum{
    MEN(1, "男"),
    WOMEN(2, "女");

    @EnumValue
    private Integer Code;
    private String Name;

    GenderEnum(Integer code, String name) {
        this.Code = code;
        this.Name = name;
    }
}

4.3 application.yml扫描枚举包地址

mybatis-plus:
  typeEnumsPackage: com.canon.model.enums

这样你存入数据库的gender值就为1啦。


顺带一提,xxMapper.xml不用写数据库属性和实体类字段的映射代码,下面的代码不需要:

    <resultMap id="BaseResultMap" type="com.canon.model.base.xxEntity" >
        <id column="id" property="id" />
        <result column="age" property="age" />
    </resultMap>

可以直接这样写

@Mapper
public interface xxMapper extends BaseMapper<xxEntity> {


    GetDiseaseLibraryRes getDiseaseLibraryInfo(@Param("params") GetDiseaseLibraryReqVO params);
}
<select id="getDiseaseLibraryInfo"
            resultType="com.canon.model.disease.GetDiseaseLibraryRes">
		SELECT
		    xx1,xx2,xx3,xx4
		FROM
		    xx
		where id = #{params.id};

</select>

这样查找直接用#{params.xx},查找结果直接封装到GetDiseaseLibraryRes实体。以前我不知道能这样做

代码生成使用就不写了,博主Mybatis-plus使用也还在初级阶段,有错误欢迎大佬留言

完~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值