最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

在Spring boot項(xiàng)目開(kāi)發(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),誰(shuí)來(lái)告訴我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)

為了滿足期望的功能,通過(guò)一個(gè)通用的枚舉接口和mybatis的枚舉處理器來(lái)實(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;
    }
}

由此,所有類似的接口都可以用過(guò)getKey()getValue()方法來(lái)獲取相關(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;
    }
}

枚舉處理器是通過(guò)繼承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)是直接通過(guò)數(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);
}

通過(guò)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)文章

  • Java文件與IO流操作原理詳細(xì)分析

    Java文件與IO流操作原理詳細(xì)分析

    在java中提供有對(duì)于文件操作系統(tǒng)的支持,這個(gè)支持在java.io.File類中進(jìn)行了定義,也就是說(shuō)在整個(gè)java.io包中File類是唯一一個(gè)與文件本身操作有關(guān)的類(創(chuàng)建,刪除,重命名)有關(guān)的類,而如果想要進(jìn)行File類的操作,我們需要提供有完整的路徑支持,而后可以調(diào)用相應(yīng)的方法進(jìn)行處理
    2022-09-09
  • JavaEE實(shí)現(xiàn)前后臺(tái)交互的文件上傳與下載

    JavaEE實(shí)現(xiàn)前后臺(tái)交互的文件上傳與下載

    這篇文章主要介紹了JavaEE實(shí)現(xiàn)前后臺(tái)交互的文件上傳與下載,分享相關(guān)技術(shù),實(shí)現(xiàn)文件上傳下載功能,需要的朋友可以參考下
    2015-11-11
  • Mybatis逆工程jar包的修改和打包

    Mybatis逆工程jar包的修改和打包

    這篇文章主要介紹了Mybatis逆工程jar包的修改和打包的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(6)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(6)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • java轉(zhuǎn)化為exe程序步驟詳解

    java轉(zhuǎn)化為exe程序步驟詳解

    在本篇內(nèi)容里我們給大家分享了關(guān)于java轉(zhuǎn)化為exe程序的具體步驟和相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • 深度deepin安裝以及jdk、tomcat、Nginx安裝教程

    深度deepin安裝以及jdk、tomcat、Nginx安裝教程

    這篇文章主要給大家介紹了關(guān)于深度deepin安裝以及jdk、tomcat、Nginx安裝的相關(guān)資料,按照文中介紹的方法可以輕松的實(shí)現(xiàn)安裝,對(duì)大家的工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • 使用Java DOM解析器修改XML文件內(nèi)容的操作方法

    使用Java DOM解析器修改XML文件內(nèi)容的操作方法

    在Java中,XML文件的解析和修改可以通過(guò)多種方法實(shí)現(xiàn),其中DOM(Document Object Model)是一種常用的方式,在本文中,我們將介紹如何使用Java DOM解析器修改XML文件中的內(nèi)容,并給出一個(gè)具體的示例,需要的朋友可以參考下
    2024-08-08
  • JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug問(wèn)題

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug問(wèn)題

    這篇文章主要介紹了JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringMVC獲取請(qǐng)求參數(shù)實(shí)現(xiàn)方法介紹

    SpringMVC獲取請(qǐng)求參數(shù)實(shí)現(xiàn)方法介紹

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法
    2022-11-11
  • 在Spring Boot項(xiàng)目中引入本地JAR包的步驟和配置

    在Spring Boot項(xiàng)目中引入本地JAR包的步驟和配置

    本文探討了在Spring Boot項(xiàng)目中引入本地JAR包的步驟和必要的配置,通過(guò)使用Maven的system作用域,開(kāi)發(fā)者可以將自定義的本地庫(kù)或功能集成到Spring Boot應(yīng)用程序中,,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

蓬安县| 灵川县| 沈丘县| 安塞县| 曲阜市| 亳州市| 驻马店市| 朝阳市| 泰顺县| 邛崃市| 宣汉县| 古蔺县| 砚山县| 京山县| 旌德县| 永康市| 广丰县| 霍州市| 镇宁| 鹤庆县| 石渠县| 瑞昌市| 高邑县| 丽江市| 辰溪县| 德惠市| 湄潭县| 内黄县| 海兴县| 军事| 吕梁市| 耒阳市| 保定市| 临澧县| 浮山县| 会同县| 类乌齐县| 汝州市| 南江县| 北川| 诏安县|