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)文章
詳解@ConfigurationProperties如何裝載到Spring容器中
這篇文章主要為大家詳細介紹了@ConfigurationProperties該如何裝載到Spring容器中,文中的示例代碼講解詳細,需要的小伙伴可以參考一下2023-07-07在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08slf4j與jul、log4j1、log4j2、logback的集成原理
這篇文章主要介紹了slf4j與jul、log4j1、log4j2、logback的集成原理,以及通用日志框架與具體日志實現(xiàn)系統(tǒng)的機制機制介紹,包括依賴的jar包,jar沖突處理等2022-03-03簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系
這篇文章主要介紹了簡單了解JAVA內(nèi)存泄漏和溢出區(qū)別及聯(lián)系,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Spring事務(wù)管理中關(guān)于數(shù)據(jù)庫連接池詳解
事務(wù)的作用就是為了保證用戶的每一個操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring Boot開發(fā)應(yīng)用時,大部分情況下也都需要使用事務(wù)2022-12-12