之前自己练手的时候用过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使用也还在初级阶段,有错误欢迎大佬留言
完~