mybatis-plus使用心得
mybatis-plus是一款基于mybatis的持久层框架,在mybatis上只做增强不做改变。基本使用流程:
- 导入依赖坐标:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>Latest Version</version> </dependency>
- 在yml文件中配置使用的数据源。
- mybatisplus分别在dao层和service层提供了基础的接口,提供了基础的增删改查实现。只需要继承BaseMapper和Iservice接口。
- 在mybatis-plus中集成了分页插件,需要在配置类中将插件配置成bean加入容器中。
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; }
- 集成日志配置,在yml文件中配置:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- id生成:mybatis-plus自带主键生成策略,使用注解
@TableId(type = IdType.AUTO) private Long id;
- 自动填充,一般数据库中都有修改时间,新增时间等字段,mybatis-plus可以通过配置生成策略自动生成。代码中在实体类上需要自动填充的字段使用注解标注。
@TableField(value = "gmt_create",fill = FieldFill.INSERT) private Date gmtCreate; @TableField(value = "gmt_modified",fill = FieldFill.INSERT_UPDATE) private Date gmtModified;
需要将自动填充策略作为bean添加到容器中,自定义填充字段的生成策略。
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill...."); this.setFieldValByName("gmtCreate",new Date(),metaObject); this.setFieldValByName("gmtModified",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill...."); this.setFieldValByName("gmtModified",new Date(),metaObject); } }
- 逻辑删除字段处理,实际开发中数据库的字段一般不会进行物理删除,通常使用逻辑删除修改标记位。mybatis-plus中使用注解@Tablelogic实现,数据库增加逻辑删除字段,实体类上标注
@TableLogic(value = "1",delval = "0") //逻辑删除 private Integer deleted;
在yml文件中指明逻辑删除标记位:
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 逻辑删除的字段 logic-delete-value: 1 # 1代表删除 logic-not-delete-value: 0 # 0代表未删除
- 乐观锁/悲观锁 mybatis-plus中使用@Version字段实现乐观锁,数据库添加version字段,实体类处理:
@Version private Integer version;
将乐观锁组件注册到IOC中
@Bean public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){ return new OptimisticLockerInnerInterceptor(); }
- mybatis-plus处理枚举字段,使用自定义的枚举类表示,可以使用@EnumValue注解加在要保存进数据库中的字段上,mp将会自动映射。使用@JsonValue加在枚举类中要返回给前端的属性的get方法上,返回时将会自动映射,如SexEnum中返回前端的就是(“男人”/“女人”).
public enum SexEnum { MAN(1, "男人"), WOMAN(0, "女人"); @EnumValue private int code; private String value; SexEnum(int code, String value) { this.code = code; this.value = value; } public int getCode() { return code; } @JsonValue public String getValue() { return value; } }
yml文件中配置
mybatis-plus: type-enums-package: com.codeyoung.json.domain # 指定枚举类所在的包 configuration: default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler # 指定默认枚举类处理器
- mybatis-plus处理json字段的数据,如果数据库中字段为json格式的字符串,可以使用@TableFiled(Typehandler=JacksonTypeHandler.class)实现javatype到jdbctype的互转,可以将实体类对象转为json字符串存入到表中。
@Data public class Foo { private Long id; private String bar; private Bar barObj; private Date createTime; } @Data public class Bar { private String name; private Integer quz; private Date timestamp; }