欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis類型處理器TypeHandler的作用及說明

 更新時間:2025年03月12日 08:46:40   作者:冰糖心書房  
這篇文章主要介紹了MyBatis類型處理器TypeHandler的作用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

TypeHandler 是 MyBatis 中用于處理 Java 類型與 JDBC 類型之間轉(zhuǎn)換的接口。它在 MyBatis 的參數(shù)綁定和結(jié)果映射過程中起著至關(guān)重要的作用。

為什么需要 TypeHandler?

Java 和 數(shù)據(jù)庫(JDBC)使用不同的類型系統(tǒng)。例如:

  • Java 中有 String、IntegerDateBoolean、enum 等類型。
  • JDBC 中有 VARCHAR、INTEGERDATE、BOOLEAN、TIMESTAMP、BLOB 等類型。

當(dāng) MyBatis 執(zhí)行 SQL 語句時,需要將 Java 對象中的數(shù)據(jù)設(shè)置到 JDBC 的 PreparedStatement 中(參數(shù)綁定),以及將 JDBC 的 ResultSet 中的數(shù)據(jù)轉(zhuǎn)換為 Java 對象(結(jié)果映射)。TypeHandler 就負(fù)責(zé)處理這兩種情況下的類型轉(zhuǎn)換。

TypeHandler 的作用

參數(shù)綁定 (Java 類型 -> JDBC 類型):

  • 當(dāng) MyBatis 將 Java 對象中的數(shù)據(jù)設(shè)置到 PreparedStatement 的占位符(#{})時,TypeHandler 會將 Java 類型轉(zhuǎn)換為對應(yīng)的 JDBC 類型。
  • 例如,將 Java 的 String 類型轉(zhuǎn)換為 JDBC 的 VARCHAR 類型,將 Java 的 Date 類型轉(zhuǎn)換為 JDBC 的 TIMESTAMP 類型。

結(jié)果映射 (JDBC 類型 -> Java 類型):

  • 當(dāng) MyBatis 從 ResultSet 中讀取數(shù)據(jù)并將其映射為 Java 對象時,TypeHandler 會將 JDBC 類型轉(zhuǎn)換為對應(yīng)的 Java 類型。
  • 例如,將 JDBC 的 VARCHAR 類型轉(zhuǎn)換為 Java 的 String 類型,將 JDBC 的 INTEGER 類型轉(zhuǎn)換為 Java 的 Integer 類型。

TypeHandler 的接口定義

public interface TypeHandler<T> {

  // 參數(shù)綁定:將 Java 類型轉(zhuǎn)換為 JDBC 類型,并設(shè)置到 PreparedStatement 中
  void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

  // 結(jié)果映射:從 ResultSet 中獲取指定列的數(shù)據(jù),并將其轉(zhuǎn)換為 Java 類型
  T getResult(ResultSet rs, String columnName) throws SQLException;

  // 結(jié)果映射:從 ResultSet 中獲取指定列索引的數(shù)據(jù),并將其轉(zhuǎn)換為 Java 類型
  T getResult(ResultSet rs, int columnIndex) throws SQLException;
  
    // 結(jié)果映射:從 CallableStatement 中獲取指定列索引的數(shù)據(jù),將其轉(zhuǎn)換為java類型
  T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
  • setParameter(): 將 Java 類型的參數(shù) parameter 設(shè)置到 PreparedStatement 的第 i 個占位符,并指定 JDBC 類型 jdbcTypejdbcType 可以為空,MyBatis 會嘗試自動推斷)。
  • getResult(): 有三個重載方法,分別根據(jù)列名、列索引從 ResultSet 中獲取數(shù)據(jù),或從CallableStatement獲取數(shù)據(jù),并將其轉(zhuǎn)換為 Java 類型。

MyBatis 內(nèi)置的 TypeHandler

MyBatis 內(nèi)置了許多常用的 TypeHandler,用于處理常見的類型轉(zhuǎn)換。例如:

  • StringTypeHandler: 處理 String 類型。
  • IntegerTypeHandler: 處理 Integer 類型。
  • LongTypeHandler: 處理 Long 類型。
  • DateTypeHandler: 處理 java.util.Date 類型。
  • BooleanTypeHandler: 處理 Boolean 類型。
  • EnumTypeHandler: 處理枚舉類型(默認(rèn)使用枚舉的名稱)。
  • EnumOrdinalTypeHandler: 處理枚舉類型(使用枚舉的序數(shù))。
  • BlobTypeHandler: 處理二進(jìn)制大對象 (BLOB)。
  • ClobTypeHandler: 處理字符大對象 (CLOB)。
  • SqlDateTypeHandler:處理java.sql.Date類型
  • SqlTimeTypeHandler:處理java.sql.Time類型
  • SqlTimestampTypeHandler:處理java.sql.Timestamp類型

自定義 TypeHandler

當(dāng) MyBatis 內(nèi)置的 TypeHandler 不能滿足需求時,我們可以自定義 TypeHandler。例如:

  • 處理特殊類型: 例如,將數(shù)據(jù)庫中的 JSON 字符串轉(zhuǎn)換為 Java 對象,或者將 Java 對象轉(zhuǎn)換為 JSON 字符串存儲到數(shù)據(jù)庫中。
  • 自定義類型轉(zhuǎn)換邏輯: 例如,對日期類型進(jìn)行特殊的格式化,或者對枚舉類型使用自定義的轉(zhuǎn)換規(guī)則。

自定義 TypeHandler 的步驟

1.實現(xiàn) TypeHandler 接口: 創(chuàng)建一個類,實現(xiàn) TypeHandler 接口,并實現(xiàn)接口中的方法。

2.注冊 TypeHandler: 有兩種方式注冊自定義的 TypeHandler

  • XML 配置:mybatis-config.xml 文件中,使用 <typeHandlers> 標(biāo)簽注冊 TypeHandler。
<typeHandlers>
  <typeHandler handler="com.example.MyTypeHandler" javaType="com.example.MyType" jdbcType="VARCHAR"/>
</typeHandlers>
  • 或者使用包掃描:
 <typeHandlers>
     <package name="com.example.typehandler"/>
 </typeHandlers>
  • 注解配置: 在自定義的 TypeHandler 類上使用 @MappedTypes@MappedJdbcTypes 注解。
@MappedTypes(MyType.class) // 指定 Java 類型
@MappedJdbcTypes(JdbcType.VARCHAR) // 指定 JDBC 類型
public class MyTypeHandler implements TypeHandler<MyType> {
    // ... 實現(xiàn) TypeHandler 接口的方法 ...
}

3.指定jdbcType(可選): 如果MyBatis無法推斷,則必須通過jdbcType屬性為null值指定數(shù)據(jù)庫列的類型

  • 示例:
  • 自定義一個將數(shù)據(jù)庫中的 VARCHAR 類型轉(zhuǎn)換為 Java 中的枚舉類型的 TypeHandler:
// 假設(shè)有一個枚舉類型
public enum Status {
    ACTIVE, INACTIVE, PENDING
}

// 自定義 TypeHandler
@MappedTypes(Status.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class StatusTypeHandler implements TypeHandler<Status> {

    @Override
    public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setString(i, null);
        } else {
            ps.setString(i, parameter.name()); // 將枚舉的名稱存儲到數(shù)據(jù)庫
        }
    }

    @Override
    public Status getResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return getStatus(value);
    }

    @Override
    public Status getResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
         return getStatus(value);
    }

    @Override
    public Status getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return getStatus(value);
    }
    
    private Status getStatus(String value){
         if (value == null) {
            return null;
        }
        try {
            return Status.valueOf(value); // 根據(jù)名稱從數(shù)據(jù)庫中獲取枚舉值
        } catch (IllegalArgumentException e) {
            return null; // 或者拋出異常
        }
    }
}

// 在 mybatis-config.xml 中注冊 TypeHandler
<typeHandlers>
  <typeHandler handler="com.example.StatusTypeHandler"/>
</typeHandlers>

// 或者在 Mapper XML 文件中使用
<resultMap id="userResultMap" type="User">
    <result property="status" column="status" javaType="com.example.Status" jdbcType="VARCHAR" typeHandler="com.example.StatusTypeHandler"/>
</resultMap>

總結(jié)

TypeHandler 是 MyBatis 中用于處理 Java 類型與 JDBC 類型之間轉(zhuǎn)換的關(guān)鍵組件。

MyBatis 內(nèi)置了許多常用的 TypeHandler,在大多數(shù)情況下,我們可以直接使用內(nèi)置的 TypeHandler。

當(dāng)需要處理特殊類型或自定義類型轉(zhuǎn)換邏輯時,我們可以自定義 TypeHandler,并通過 XML 配置或注解的方式注冊自定義的 TypeHandler。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Layui 后臺加載菜單欄名稱以及url的例子

    Layui 后臺加載菜單欄名稱以及url的例子

    今天小編就為大家分享一篇Layui 后臺加載菜單欄名稱以及url的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • idea運(yùn)行vue項目設(shè)置自定義瀏覽器方式

    idea運(yùn)行vue項目設(shè)置自定義瀏覽器方式

    這篇文章主要介紹了idea運(yùn)行vue項目設(shè)置自定義瀏覽器方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java線程池復(fù)用線程的秘密你知道嗎

    Java線程池復(fù)用線程的秘密你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java線程池復(fù)用線程的秘密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望您能夠多多關(guān)注

    2022-03-03
  • 淺析Java中Future接口的使用方法

    淺析Java中Future接口的使用方法

    在Java開發(fā)中,異步編程是提高系統(tǒng)性能和響應(yīng)能力的重要手段之一。本文將深入探討Future接口的原理和源碼解讀,幫助讀者更好地理解Future接口的工作機(jī)制和使用方法
    2023-05-05
  • 淺析Mybatis Plus和Mybatis的區(qū)別

    淺析Mybatis Plus和Mybatis的區(qū)別

    這篇文章主要介紹了Mybatis Plus和Mybatis的區(qū)別,需要的朋友可以參考下
    2020-08-08
  • Java 程序設(shè)計總復(fù)習(xí)題(java基礎(chǔ)代碼)

    Java 程序設(shè)計總復(fù)習(xí)題(java基礎(chǔ)代碼)

    這篇文章主要介紹了Java 程序設(shè)計總復(fù)習(xí)題,主要是java基礎(chǔ)代碼,方便學(xué)習(xí)java的同學(xué)
    2021-05-05
  • SpringBoot3+ShardingJDBC5.5.0 讀寫分離配置的實現(xiàn)

    SpringBoot3+ShardingJDBC5.5.0 讀寫分離配置的實現(xiàn)

    本文主要介紹了SpringBoot3+ShardingJDBC5.5.0 讀寫分離配置的實現(xiàn),最新版5.5.0支持SpringBoot3x現(xiàn)分享給大家,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • JavaMail實現(xiàn)郵件發(fā)送機(jī)制

    JavaMail實現(xiàn)郵件發(fā)送機(jī)制

    這篇文章主要為大家詳細(xì)介紹了JavaMail實現(xiàn)郵件發(fā)送機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java使用抽象工廠模式實現(xiàn)的肯德基消費(fèi)案例詳解

    Java使用抽象工廠模式實現(xiàn)的肯德基消費(fèi)案例詳解

    這篇文章主要介紹了Java使用抽象工廠模式實現(xiàn)的肯德基消費(fèi)案例,較為詳細(xì)的分析了抽象工廠模式的定義、原理并結(jié)合實例形式分析了Java使用抽象工廠模式實現(xiàn)肯德基消費(fèi)案例的步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • spring?boot集成p6spy的最佳實踐

    spring?boot集成p6spy的最佳實踐

    這篇文章主要介紹了spring?boot集成p6spy的最佳實踐-p6spy-spring-boot-starter的項目案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02

最新評論