之前自己練手的時候用過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使用也還在初級階段,有錯誤歡迎大佬留言
完~