国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

mybatis處理枚舉類

caspar / 1602人閱讀

摘要:自帶對枚舉的處理類該類實現(xiàn)了枚舉類型和類型的相互轉(zhuǎn)換。而在具體中也需要使用屬性,如在處理到該位置時,就會調(diào)用指定的處理類來處理枚舉類型。

mybatis自帶對枚舉的處理類

org.apache.ibatis.type.EnumOrdinalTypeHandler :該類實現(xiàn)了枚舉類型和Integer類型的相互轉(zhuǎn)換。

但是給轉(zhuǎn)換僅僅是將對應(yīng)的枚舉轉(zhuǎn)換為其索引位置,也就是"ordinal()"方法獲取到的值。對應(yīng)自定義的int值,該類無能為力。

org.apache.ibatis.type.EnumTypeHandler:該類實現(xiàn)了枚舉類型和String類型的相互轉(zhuǎn)換。

對于想將枚舉在數(shù)據(jù)庫中存儲為對應(yīng)的int值的情況,該類沒辦法實現(xiàn)。

基于以上mybatis提供的兩個枚舉處理類的能力有限,因此只能自己定義對枚舉的轉(zhuǎn)換了。

自定義mybatis的枚舉處理類EnumValueTypeHandler

該類需要繼承org.apache.ibatis.type.BaseTypeHandler,然后在重定義的方法中實現(xiàn)自有邏輯。

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;

/**
 * 處理實現(xiàn)了{@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 EnumValueTypeHandler extends 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值并設(shè)置到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值,獲取到對應(yīng)的枚舉類型
     * @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 注冊時使用具體的實現(xiàn)類注冊。

配置文件如下:



    


    
    

自定義的 Enum 需要實現(xiàn)的接口

/**
 * @author jingzz
 * @time 2016年8月17日 上午9:22:46
 * @since 2016年8月17日 上午9:22:46
 */
public interface EsnBaseEnum {
    
    public int getValue();
}

而實現(xiàn)了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;
    }
}

只有在實現(xiàn)了EsnBaseEnum的接口,EnumValueTypeHandler才能通過接口的getValue方法獲取到對應(yīng)枚舉的值。

到此,對于枚舉的簡單處理邏輯已經(jīng)實現(xiàn)完成了,接下來就是如何配置來使用該自定義枚舉處理邏輯

配置對枚舉的處理

首先,mybatis中對于處理邏輯的設(shè)置是在sql的映射文件中,如EsnSyncLogMapper.xml。

關(guān)鍵的設(shè)置枚舉處理的位置如下:


    
    
    
    
    
    
  

其中type列設(shè)置了屬性typeHandler,其值為自定義的枚舉處理邏輯。

而在具體sql中也需要使用typeHandler屬性,如:

 
    #{type, typeHandler=com.test.common.EnumValueTypeHandler},
  

在mybatis處理到該位置時,就會調(diào)用typeHandler指定的處理類來處理枚舉類型。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77673.html

相關(guān)文章

  • 使用MyBatis簡化枚舉值的存儲和讀取

    摘要:內(nèi)置的枚舉處理器為了處理上述遇到的問題,內(nèi)置了兩種,分別是和。將使用枚舉實例的值序數(shù)值,從開始來和枚舉類之間做轉(zhuǎn)換。比如有記錄顯式為全局指定在查詢時,類變量將自動賦值為,添加記錄時同理,數(shù)據(jù)庫值將存儲為其枚舉類實例序號。 場景描述 我們在實際場景中經(jīng)常會遇到需要將枚舉值存儲到數(shù)據(jù)庫中,或是將從數(shù)據(jù)庫中查詢到的值對應(yīng)到枚舉類上的情況。 比如表process大致定義如下: -- -----...

    Bryan 評論0 收藏0
  • 如何在MyBatis中優(yōu)雅的使用枚舉

    摘要:如何解決呢在中我們可以使用方式來干預(yù)的創(chuàng)建過程,來完成轉(zhuǎn)換器的指定。再也不用寫的配置文件了結(jié)束了以上就是我對如何在中優(yōu)雅的使用枚舉的探索。 問題 在編碼過程中,經(jīng)常會遇到用某個數(shù)值來表示某種狀態(tài)、類型或者階段的情況,比如有這樣一個枚舉: public enum ComputerState { OPEN(10), //開啟 CLOSE(11), ...

    clasnake 評論0 收藏0
  • MyBatis 源碼分析系列文章導(dǎo)讀

    摘要:本文速覽本篇文章是我為接下來的源碼分析系列文章寫的一個導(dǎo)讀文章。年該項目從基金會遷出,并改名為。同期,停止維護。符號所在的行則是表示的執(zhí)行結(jié)果。同時,使用無需處理受檢異常,比如。另外,把寫在配置文件中,進行集中管理,利于維護。 1.本文速覽 本篇文章是我為接下來的 MyBatis 源碼分析系列文章寫的一個導(dǎo)讀文章。本篇文章從 MyBatis 是什么(what),為什么要使用(why),...

    weizx 評論0 收藏0
  • mybatis動態(tài)sql

    摘要:枚舉類型提供了提供了持久化的枚舉類型。假設(shè)表結(jié)構(gòu)的列,使用類型存儲或,對象使用枚舉類型標識當執(zhí)行語句時,或會存儲到列,如果想要存儲的時枚舉值而不是枚舉名字,就需要配置類型處理器和提供了對和的內(nèi)檢支持,將映射為,將映射為數(shù)組。 mybatis中靜態(tài)sql語句有時不足以滿足用戶的需求,因此其提供了動態(tài)sql標簽。 IF標簽 if標簽通過條件測試,動態(tài)插入sql片段,例如: an...

    anyway 評論0 收藏0
  • 一起來學SpringBoot | 第八篇:通用Mapper與分頁插件的集成

    摘要:通用是為了解決使用中的基本操作,使用它可以很方便的進行開發(fā),可以節(jié)省開發(fā)人員大量的時間。當該參數(shù)設(shè)置為時,時會查詢第一頁,超過總數(shù)時,會查詢最后一頁。 SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工...

    韓冰 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<