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使用也還在初級階段,有錯誤歡迎大佬留言

完~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章