摘要:自帶對枚舉的處理類該類實現了枚舉類型和類型的相互轉換。而在具體中也需要使用屬性,如在處理到該位置時,就會調用指定的處理類來處理枚舉類型。
mybatis自帶對枚舉的處理類
org.apache.ibatis.type.EnumOrdinalTypeHandler
但是給轉換僅僅是將對應的枚舉轉換為其索引位置,也就是"ordinal()"方法獲取到的值。對應自定義的int值,該類無能為力。
org.apache.ibatis.type.EnumTypeHandler
對于想將枚舉在數據庫中存儲為對應的int值的情況,該類沒辦法實現。
基于以上mybatis提供的兩個枚舉處理類的能力有限,因此只能自己定義對枚舉的轉換了。
自定義mybatis的枚舉處理類EnumValueTypeHandler該類需要繼承org.apache.ibatis.type.BaseTypeHandler
import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.MappedTypes; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; /** * 處理實現了{@link EsnBaseEnum}接口的枚舉類 * @author followtry * @time 2016年8月16日 下午8:06:49 * @since 2016年8月16日 下午8:06:49 */ //在 xml 中添加該 TypeHandler 時需要使用該注解 @MappedTypes(value = { QcListTypeEnum.class, SellingQcBizTypeEnum.class }) public class EnumValueTypeHandlerextends BaseTypeHandler { private Class type; private final E[] enums; public EnumValueTypeHandler(Class type) { if (type == null) { throw new IllegalArgumentException("Type argument cannot be null"); } this.type = type; this.enums = type.getEnumConstants(); if (this.enums == null) { throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type."); } } @Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException { //獲取非空的枚舉的int值并設置到statement中 ps.setInt(i, parameter.getValue()); } @Override public E getNullableResult(ResultSet rs, String columnName) throws SQLException { int i = rs.getInt(columnName); if (rs.wasNull()) { return null; } else { try { return getEnumByValue(i); } catch (Exception ex) { throw new IllegalArgumentException( "Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex); } } } /** * 通過枚舉類型的int值,獲取到對應的枚舉類型 * @author jingzz * @param i */ protected E getEnumByValue(int i) { for (E e : enums) { if (e.getValue() == i) { return e; } } return null; } @Override public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int i = rs.getInt(columnIndex); if (rs.wasNull()) { return null; } else { try { return getEnumByValue(i); } catch (Exception ex) { throw new IllegalArgumentException( "Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex); } } } @Override public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int i = cs.getInt(columnIndex); if (cs.wasNull()) { return null; } else { try { return getEnumByValue(i); } catch (Exception ex) { throw new IllegalArgumentException( "Cannot convert " + i + " to " + type.getSimpleName() + " by ordinal value.", ex); } } } }
該處理器是處理繼承了EsnBaseEnum接口的枚舉類,因為該接口中定義了獲取自定義int值的方法。
如果在 mybatis 的 xml 中配置 該 typehandler,則需要添加注解@MappedTypes。在添加 typeHandler 注冊時使用具體的實現類注冊。
配置文件如下:
自定義的 Enum 需要實現的接口
/** * @author jingzz * @time 2016年8月17日 上午9:22:46 * @since 2016年8月17日 上午9:22:46 */ public interface EsnBaseEnum { public int getValue(); }
而實現了EsnBaseEnum的枚舉示例如下:
/** * 同步的類型 * @author jingzz * @time 2016年8月3日 上午11:13:06 */ public enum SyncType implements EsnBaseEnum { DEPT(3),//部門 PERSON(1);//人員 private int value; private SyncType(int value) { this.value = value; } @Override public int getValue(){ return this.value; } }
只有在實現了EsnBaseEnum的接口,EnumValueTypeHandler才能通過接口的getValue方法獲取到對應枚舉的值。
到此,對于枚舉的簡單處理邏輯已經實現完成了,接下來就是如何配置來使用該自定義枚舉處理邏輯
配置對枚舉的處理首先,mybatis中對于處理邏輯的設置是在sql的映射文件中,如EsnSyncLogMapper.xml。
關鍵的設置枚舉處理的位置如下:
其中type列設置了屬性typeHandler,其值為自定義的枚舉處理邏輯。
而在具體sql中也需要使用typeHandler屬性,如:
#{type, typeHandler=com.test.common.EnumValueTypeHandler},
在mybatis處理到該位置時,就會調用typeHandler指定的處理類來處理枚舉類型。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77673.html
摘要:內置的枚舉處理器為了處理上述遇到的問題,內置了兩種,分別是和。將使用枚舉實例的值序數值,從開始來和枚舉類之間做轉換。比如有記錄顯式為全局指定在查詢時,類變量將自動賦值為,添加記錄時同理,數據庫值將存儲為其枚舉類實例序號。 場景描述 我們在實際場景中經常會遇到需要將枚舉值存儲到數據庫中,或是將從數據庫中查詢到的值對應到枚舉類上的情況。 比如表process大致定義如下: -- -----...
摘要:如何解決呢在中我們可以使用方式來干預的創建過程,來完成轉換器的指定。再也不用寫的配置文件了結束了以上就是我對如何在中優雅的使用枚舉的探索。 問題 在編碼過程中,經常會遇到用某個數值來表示某種狀態、類型或者階段的情況,比如有這樣一個枚舉: public enum ComputerState { OPEN(10), //開啟 CLOSE(11), ...
摘要:本文速覽本篇文章是我為接下來的源碼分析系列文章寫的一個導讀文章。年該項目從基金會遷出,并改名為。同期,停止維護。符號所在的行則是表示的執行結果。同時,使用無需處理受檢異常,比如。另外,把寫在配置文件中,進行集中管理,利于維護。 1.本文速覽 本篇文章是我為接下來的 MyBatis 源碼分析系列文章寫的一個導讀文章。本篇文章從 MyBatis 是什么(what),為什么要使用(why),...
摘要:枚舉類型提供了提供了持久化的枚舉類型。假設表結構的列,使用類型存儲或,對象使用枚舉類型標識當執行語句時,或會存儲到列,如果想要存儲的時枚舉值而不是枚舉名字,就需要配置類型處理器和提供了對和的內檢支持,將映射為,將映射為數組。 mybatis中靜態sql語句有時不足以滿足用戶的需求,因此其提供了動態sql標簽。 IF標簽 if標簽通過條件測試,動態插入sql片段,例如: an...
摘要:通用是為了解決使用中的基本操作,使用它可以很方便的進行開發,可以節省開發人員大量的時間。當該參數設置為時,時會查詢第一頁,超過總數時,會查詢最后一頁。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工...
閱讀 3669·2021-11-23 09:51
閱讀 1661·2021-10-22 09:53
閱讀 1345·2021-10-09 09:56
閱讀 853·2019-08-30 13:47
閱讀 2155·2019-08-30 12:55
閱讀 1597·2019-08-30 12:46
閱讀 1105·2019-08-30 10:51
閱讀 2410·2019-08-29 12:43