<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在Spring boot專案開發中經常遇到需要使用列舉的場景,比如描述狀態、性別、型別等相關欄位。通常這些欄位在資料庫會以tinyint
型別存在,比如:0:女性,1:男性;或者,0:裝置掉線,1:裝置線上。如果在系統中我們也以int的方式到處使用,後期在維護的時候對數位的理解會非常困難,所以通常這種欄位我們一般採用列舉的方式在系統的流轉,而在儲存的時候我們使用數位的方式儲存。
以上,因為資料庫儲存欄位的型別和我們在系統中流轉的型別不同,我們需要實現一個兩者自動轉換的功能,也就是標題中提到的列舉處理器。
如果我們採用全數位的方式在系統中流轉,最終系統程式碼就會變成這樣:
if(status == 1){ // 時間一長,誰來告訴我1代表什麼狀態 ... }else if (status == 0){ // 0又代表什麼狀態 ... } ...
以上這種操作會造成程式碼的可讀性非常低,非常需要依靠對其中數位的註釋進行編碼。
希望型別性別、狀態這類欄位可以全部使用列舉型別,提高程式碼的可維護性。考慮到大部分我們使用列舉的時候都可以使用ONLINE(1, "線上"), OFFLINE(0, "掉線")
這樣的方式,可以總結出一個通用的列舉介面,後續類似的列舉類都實現這個介面。
為了滿足期望的功能,通過一個通用的列舉介面和mybatis的列舉處理器來實現業務系統中使用列舉型別和mysql中使用數值型別的功能。
簡單粗暴的命名這個通用列舉介面為KeyValueEnum
:
public interface KeyValueEnum { int getKey(); String getValue(); }
基於該介面實現一個狀態列舉類:
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()
方法來獲取相關數值。
@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抽象類實現的,其中包含的具體方法參考mybatis的BaseTypeHandler檔案即可。
需要注意的是,如果每增加一種需要儲存到資料庫的列舉型別就需要在@MappedTypes(value = {Status.class, Sex.class})註解中新增一個對應的列舉類。
# application.yaml mybatis: configuration: map-underscore-to-camel-case: true # 下劃線轉駝峰 type-handlers-package: xxx.xxx.xxx.handler.mybatisTypeHandler # 設定剛才編輯的列舉處理器
@Data public class device { private long id; private Status status; }
期望實現的目標是直接通過資料庫查詢出對應的列舉型別。
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查詢最終可以實現資料庫tinyint
型別查詢後轉換為實體類欄位對應的列舉型別。
到此這篇關於springboot+mybatis+列舉處理器的實現的文章就介紹到這了,更多相關springboot mybatis 列舉處理器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45