欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot+mybatis+枚舉處理器的實現(xiàn)

 更新時間:2022年03月24日 10:53:27   作者:我想飛,你想不  
在Spring?boot項目開發(fā)中經(jīng)常遇到需要使用枚舉的場景,本文就介紹了springboot+mybatis+枚舉處理器的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下

背景

在Spring boot項目開發(fā)中經(jīng)常遇到需要使用枚舉的場景,比如描述狀態(tài)、性別、類型等相關(guān)字段。通常這些字段在數(shù)據(jù)庫會以tinyint類型存在,比如:0:女性,1:男性;或者,0:設(shè)備掉線,1:設(shè)備在線。如果在系統(tǒng)中我們也以int的方式到處使用,后期在維護的時候?qū)?shù)字的理解會非常困難,所以通常這種字段我們一般采用枚舉的方式在系統(tǒng)的流轉(zhuǎn),而在存儲的時候我們使用數(shù)字的方式存儲。

以上,因為數(shù)據(jù)庫存儲字段的類型和我們在系統(tǒng)中流轉(zhuǎn)的類型不同,我們需要實現(xiàn)一個兩者自動轉(zhuǎn)換的功能,也就是標(biāo)題中提到的枚舉處理器。

現(xiàn)狀

如果我們采用全數(shù)字的方式在系統(tǒng)中流轉(zhuǎn),最終系統(tǒng)代碼就會變成這樣:

if(status == 1){ // 時間一長,誰來告訴我1代表什么狀態(tài)
    ...
}else if (status == 0){ // 0又代表什么狀態(tài)
    ...
}
...

以上這種操作會造成代碼的可讀性非常低,非常需要依靠對其中數(shù)字的注釋進行編碼。

期望

希望類型性別、狀態(tài)這類字段可以全部使用枚舉類型,提高代碼的可維護性。考慮到大部分我們使用枚舉的時候都可以使用ONLINE(1, "在線"), OFFLINE(0, "掉線")這樣的方式,可以總結(jié)出一個通用的枚舉接口,后續(xù)類似的枚舉類都實現(xiàn)這個接口。

實現(xiàn)

為了滿足期望的功能,通過一個通用的枚舉接口和mybatis的枚舉處理器來實現(xiàn)業(yè)務(wù)系統(tǒng)中使用枚舉類型和mysql中使用數(shù)值類型的功能。

通用的枚舉接口

簡單粗暴的命名這個通用枚舉接口為KeyValueEnum:

public interface KeyValueEnum {

    int getKey();

    String getValue();

}

基于該接口實現(xiàn)一個狀態(tài)枚舉類:

public enum StatusEnum implements KeyValueEnum {

    ONLINE(1, "在線"),
    
    OFFLINE(0, "掉線");
    
    private int key;

    private String value;

    StatusEnum(int key, String value){
        this.key = key;
        this.value = value;
    }

    @Override
    public int getKey() {
        return key;
    }

    @Override
    public String getValue() {
        return value;
    }
}

由此,所有類似的接口都可以用過getKey()getValue()方法來獲取相關(guān)數(shù)值。

mybaits枚舉處理器

@MappedTypes(value = {Status.class, Sex.class}) // 每增加一種枚舉類型,就在此添加。
public class EnumTypeHandler<E extends KeyValueEnum> extends BaseTypeHandler<E> {

    private Class<E> type;
    private E[] enums;

    public EnumTypeHandler(Class<E> type){
        this.type = type;
        this.enums = type.getEnumConstants();
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, KeyValueEnum keyValueEnum, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, keyValueEnum.getKey());
    }

    @Override
    public E getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int key = resultSet.getInt(i);
        return getEnum(key);
    }

    @Override
    public E getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int key = resultSet.getInt(s);
        return getEnum(key);
    }

    @Override
    public E getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int key = callableStatement.getInt(i);
        return getEnum(key);
    }

    private E getEnum(int key){
        for (E keyValue:
             enums) {
            if (keyValue.getKey() == key){
                return keyValue;
            }
        }
        return null;
    }
}

枚舉處理器是通過繼承mybatis自帶的BaseTypeHandler抽象類實現(xiàn)的,其中包含的具體方法參考mybatis的BaseTypeHandler文檔即可。

需要注意的是,如果每增加一種需要存儲到數(shù)據(jù)庫的枚舉類型就需要在@MappedTypes(value = {Status.class, Sex.class})注解中添加一個對應(yīng)的枚舉類。

配置枚舉處理器

# application.yaml
mybatis:
  configuration:
    map-underscore-to-camel-case: true # 下劃線轉(zhuǎn)駝峰
  type-handlers-package: xxx.xxx.xxx.handler.mybatisTypeHandler # 配置剛才編輯的枚舉處理器

包含枚舉類型字段的實體類

@Data
public class device {

    private long id;

    private Status status;
}

期望實現(xiàn)的目標(biāo)是直接通過數(shù)據(jù)庫查詢出對應(yīng)的枚舉類型。

查詢mapper

public interface deviceMapper {

    @Results(id="aaa", value = {
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "status", property = "status")
    })
    @Select("select * from device where id = #{id}")
    Device getDeviceById(long id);
}

通過mapper查詢最終可以實現(xiàn)數(shù)據(jù)庫tinyint類型查詢后轉(zhuǎn)換為實體類字段對應(yīng)的枚舉類型。

到此這篇關(guān)于springboot+mybatis+枚舉處理器的實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot mybatis 枚舉處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在SpringBoot中使用lombok的注意事項

    在SpringBoot中使用lombok的注意事項

    這篇文章主要介紹了在SpringBoot中使用lombok的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java多線程的具體介紹與使用筆記小結(jié)

    Java多線程的具體介紹與使用筆記小結(jié)

    Java多線程詳細介紹線程是程序執(zhí)行的最小單元,多線程是指程序同一時間可以有多個執(zhí)行單元運行(這個與你的CPU核心有關(guān))。 接下來通過本文給大家介紹Java多線程的具體介紹與使用筆記小結(jié),感興趣的朋友一起看看吧
    2021-05-05
  • Spring Boot整合mybatis(一)實例代碼

    Spring Boot整合mybatis(一)實例代碼

    sprig-boot是一個微服務(wù)架構(gòu),加快了spring工程快速開發(fā),以及簡便了配置。接下來開始spring-boot與mybatis的整合
    2017-07-07
  • 詳解@ConfigurationProperties如何裝載到Spring容器中

    詳解@ConfigurationProperties如何裝載到Spring容器中

    這篇文章主要為大家詳細介紹了@ConfigurationProperties該如何裝載到Spring容器中,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-07-07
  • 在springboot中注入FilterRegistrationBean不生效的原因

    在springboot中注入FilterRegistrationBean不生效的原因

    這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 在eclipse中修改tomcat的部署路徑操作

    在eclipse中修改tomcat的部署路徑操作

    這篇文章主要介紹了在eclipse中修改tomcat的部署路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • slf4j與jul、log4j1、log4j2、logback的集成原理

    slf4j與jul、log4j1、log4j2、logback的集成原理

    這篇文章主要介紹了slf4j與jul、log4j1、log4j2、logback的集成原理,以及通用日志框架與具體日志實現(xiàn)系統(tǒng)的機制機制介紹,包括依賴的jar包,jar沖突處理等
    2022-03-03
  • Spring MVC 執(zhí)行流程的簡述

    Spring MVC 執(zhí)行流程的簡述

    這篇文章主要介紹了Spring MVC 執(zhí)行流程的簡述,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系

    簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系

    這篇文章主要介紹了簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫連接池詳解

    Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫連接池詳解

    事務(wù)的作用就是為了保證用戶的每一個操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring Boot開發(fā)應(yīng)用時,大部分情況下也都需要使用事務(wù)
    2022-12-12

最新評論