国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Mybatis中自定義TypeHandler處理枚舉詳解

Mybatis中自定義TypeHandler處理枚舉詳解

2020-08-14 16:08南軻夢 Java教程

本文主要介紹了Mybatis中自定義TypeHandler處理枚舉的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧

Mybatis中,處理枚舉類的TypeHandler有兩個:

  • EnumTypeHandler: 用于保存枚舉名
  • EnumOrdinalTypeHandler: 用于保存枚舉的序號。

在實際項目中,以上往往不能滿足我們的需求。

需求分析

枚舉需要包含兩個屬性,label(用于顯示), value(實際的枚舉值)。數(shù)據(jù)庫保存枚舉值(value)。

這很明顯Mybatis提供的兩個枚舉TypeHandler不能滿足我們的需求。此時,我們可以自定義一個通用的枚舉TypeHandler來滿足我們的需求。

自定義枚舉TypeHandler

通用枚舉DisplayedEnum

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public interface DisplayedEnum {
 String DEFAULT_VALUE_NAME = "value";
 String DEFAULT_LABEL_NAME = "label";
 default Integer getValue() {
 Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_VALUE_NAME);
 if (field == null)
  return null;
 try {
  field.setAccessible(true);
  return Integer.parseInt(field.get(this).toString());
 } catch (IllegalAccessException e) {
  throw new RuntimeException(e);
 }
 }
 @JsonValue
 default String getLabel() {
 Field field = ReflectionUtils.findField(this.getClass(), DEFAULT_LABEL_NAME);
 if (field == null)
  return null;
 try {
  field.setAccessible(true);
  return field.get(this).toString();
 } catch (IllegalAccessException e) {
  throw new RuntimeException(e);
 }
 }
 static <T extends Enum<T>> T valueOfEnum(Class<T> enumClass, Integer value) {
 if (value == null)
  throw new IllegalArgumentException("DisplayedEnum value should not be null");
 if (enumClass.isAssignableFrom(DisplayedEnum.class))
  throw new IllegalArgumentException("illegal DisplayedEnum type");
 T[] enums = enumClass.getEnumConstants();
 for (T t: enums) {
  DisplayedEnum displayedEnum = (DisplayedEnum)t;
  if (displayedEnum.getValue().equals(value))
  return (T) displayedEnum;
 }
 throw new IllegalArgumentException("cannot parse integer: " + value + " to " + enumClass.getName());
 }
}

說明:

普通枚舉類通過實現(xiàn)DisplayedEnum接口,就可以:

  1. 通過getValue()獲取枚舉值。
  2. 通過getLabel()獲取枚舉的label屬性。
  3. 通過valueOfEnum()將Integer值轉(zhuǎn)換為指定的枚舉類型。

普通枚舉類

?
1
2
3
4
5
6
7
8
9
public enum CommonsType implements DisplayedEnum {
 NORMAL("正常", 0), INVALID("無效", 1);
 String label;
 Integer value;
 private CommonsType(String label, Integer value) {
 this.label = label;
 this.value = value;
 }
}

以上就是一個普通枚舉類的示例。

自定義枚舉TypeHandler

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@MappedJdbcTypes(value = JdbcType.TINYINT, includeNullJdbcType = true)
public class DefaultEnumTypeHandler extends BaseTypeHandler<DisplayedEnum> {
 private Class<DisplayedEnum> type;
 public EnumTypeHandler(){};
 public EnumTypeHandler(Class<DisplayedEnum> type) {
 if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
 this.type = type;
 }
 @Override
 public void setNonNullParameter(PreparedStatement ps, int i, DisplayedEnum parameter, JdbcType jdbcType)
  throws SQLException {
 ps.setInt(i, parameter.getValue());
 }
 @Override
 public DisplayedEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
 return convert(rs.getInt(columnName));
 }
 @Override
 public DisplayedEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
 return convert(rs.getInt(columnIndex));
 }
 @Override
 public DisplayedEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
 return convert(cs.getInt(columnIndex));
 }
 private DisplayedEnum convert(int status){
 DisplayedEnum[] objs = type.getEnumConstants();
 for(DisplayedEnum em: objs){
  if(em.getValue() == status){
  return em;
  }
 }
 return null;
 }
}

使用我們自定義的DefaultEnumTypeHandler

由于Mybatis默認(rèn)在處理枚舉類型的時候會使用EnumTypeHandler(只保存及轉(zhuǎn)換枚舉類型的名字), 因此,我們需要手動指定使用DefaultEnumTypeHandler。示例如下:

?
1
2
3
4
5
<resultMap id="xxx" type="xxx">
 ...
 <result column="type" jdbcType="TINYINT" property="type" typeHandler="xxx.xxx.xxx.DefaultEnumTypeHandler" />
 ...
</resultMap>

即我們需要通過使用typeHandler來指定。

小結(jié)

以上是我們應(yīng)用在實際項目中的一個對于Mybatis處理枚舉類的方案。我看大多數(shù)人也都是這樣在用。然而,在實際項目中,我們會發(fā)現(xiàn)隨著枚舉類的增多,這樣寫起來會很繁瑣。我看了一下網(wǎng)絡(luò)上似乎也沒人處理這種情況。那么,下一篇文章將針對這種情況進行處理。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持服務(wù)器之家!

原文鏈接:http://www.cnblogs.com/dongying/p/6410889.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 夜夜夜久久久 | 欧洲av一区二区 | 午夜视频导航 | 欧美综合一区 | 视频a区| 国产高清av在线一区二区三区 | 青青草视频在线免费观看 | 日韩在线视频免费 | 狠狠艹| 国产黄色在线网站 | 国产一级一级国产 | 日韩在线永久免费播放 | 日韩一区电影 | 最新国产在线视频 | 亚洲成av人片一区二区梦乃 | 黄色一级片免费播放 | 亚洲视频一区二区三区 | 午夜精品久久久久久久久久久久久 | 日韩中文字幕一区二区 | 一级黄色片看看 | 亚洲精品一区二区三区在线 | 国产激情一区二区三区成人免费 | 中日韩一线二线三线视频 | 亚洲精品久久久一区二区三区 | 日本久久久久久久久久久久 | 成av在线| 亚洲精品国产精品国自产在线 | 在线播放亚洲 | 精品免费视频 | 亚洲小视频 | 久久久久久国产一级毛片高清版 | 欧美一区久久 | 国产成年人视频 | 亚洲精品在线视频 | av亚洲在线 | 亚洲 视频 一区 | 毛片黄片| 在线观看午夜免费视频 | 亚洲免费一区 | 夜夜操比| jizzxxx日本|