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

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

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

背景

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

以上,因?yàn)閿?shù)據(jù)庫(kù)存儲(chǔ)字段的類型和我們?cè)谙到y(tǒng)中流轉(zhuǎn)的類型不同,我們需要實(shí)現(xiàn)一個(gè)兩者自動(dòng)轉(zhuǎn)換的功能,也就是標(biāo)題中提到的枚舉處理器。

現(xiàn)狀

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

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

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

期望

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

實(shí)現(xiàn)

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

通用的枚舉接口

簡(jiǎn)單粗暴的命名這個(gè)通用枚舉接口為KeyValueEnum:

public interface KeyValueEnum {

    int getKey();

    String getValue();

}

基于該接口實(shí)現(xiàn)一個(gè)狀態(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抽象類實(shí)現(xiàn)的,其中包含的具體方法參考mybatis的BaseTypeHandler文檔即可。

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

配置枚舉處理器

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

包含枚舉類型字段的實(shí)體類

@Data
public class device {

    private long id;

    private Status status;
}

期望實(shí)現(xiàn)的目標(biāo)是直接通過數(shù)據(jù)庫(kù)查詢出對(duì)應(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查詢最終可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)tinyint類型查詢后轉(zhuǎn)換為實(shí)體類字段對(duì)應(yīng)的枚舉類型。

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

相關(guān)文章

  • 在SpringBoot中使用lombok的注意事項(xiàng)

    在SpringBoot中使用lombok的注意事項(xiàng)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論