最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis中TypeHandler基本用法與示例

 更新時間:2025年11月28日 09:24:52   作者:Caven77  
本文主要介紹了MyBatis中TypeHandler基本用法與示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

引入

在 MyBatis 中,TypeHandler 是一個 類型處理器,它的作用是處理數(shù)據(jù)庫中 JDBC 類型和 Java 類型之間的轉(zhuǎn)換。有時數(shù)據(jù)庫的字段類型和 Java 對象的字段類型不完全一致,或者我們希望對某些字段的映射 進行定制化處理,這時就需要用到 TypeHandler。

TypeHandler 提供了一種靈活的機制,用于在 MyBatis 執(zhí)行 SQL 時對參數(shù)、返回值和數(shù)據(jù)庫列進行類型轉(zhuǎn)換。MyBatis 提供了許多常見類型的默認處理器(如字符串、整數(shù)、日期等),但在某些情況下,我們可能需要自定義 TypeHandler 來處理特定的數(shù)據(jù)轉(zhuǎn)換需求。

你可以重寫已有的類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現(xiàn) org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 并且可以(可選地)將它映射到一個 JDBC 類型。

1.TypeHandler的作用

  • 傳入?yún)?shù)時轉(zhuǎn)換類型:將 Java 對象中的屬性值轉(zhuǎn)換為適合 SQL 語句的 JDBC 類型。
  • 查詢結(jié)果時轉(zhuǎn)換類型:將查詢結(jié)果中的字段值轉(zhuǎn)換為 Java 對象的屬性。

2.TypeHandler的接口

MyBatis 的 TypeHandler 是一個接口,主要有以下方法:

public interface TypeHandler<T> {
    // 設置 PreparedStatement 的參數(shù)
    void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

    // 從 ResultSet 獲取結(jié)果
    T getResult(ResultSet rs, String columnName) throws SQLException;

    T getResult(ResultSet rs, int columnIndex) throws SQLException;

    T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
  • setParameter:將參數(shù)值從 Java 類型轉(zhuǎn)換為 JDBC 類型,并設置到 PreparedStatement 中。
  • getResult:將查詢結(jié)果從數(shù)據(jù)庫的 JDBC 類型轉(zhuǎn)換為 Java 類型。

3.默認的TypeHandler

MyBatis 默認已經(jīng)為許多常見的 Java 類型提供了類型處理器。例如:

  • String 類型:StringTypeHandler
  • Integer 類型:IntegerTypeHandler
  • Date 類型:DateTypeHandler
  • Boolean 類型:BooleanTypeHandler

當我們傳遞這些常見類型的對象時,MyBatis 會自動選擇合適的 TypeHandler 來執(zhí)行類型轉(zhuǎn)換。

4. 自定義TypeHandler的場景

雖然 MyBatis 提供了默認的 TypeHandler,在某些特殊場景下,我們可能需要自定義 TypeHandler 來處理復雜的類型轉(zhuǎn)換。常見的應用場景包括:

  • 枚舉類型與數(shù)據(jù)庫值之間的映射:例如數(shù)據(jù)庫存儲 0 和 1 來表示枚舉值 YES 和 NO,在 Java 中則用枚舉來表示。
  • JSON 字符串與對象之間的轉(zhuǎn)換:例如將 JSON 字符串轉(zhuǎn)換為 Java 對象(如使用 Gson 或 Jackson)。
  • 日期格式不一致:例如數(shù)據(jù)庫存儲的是字符串日期格式,而 Java 中存儲的是 Date 類型,需要進行格式轉(zhuǎn)換。
  • 自定義的數(shù)據(jù)類型:例如數(shù)據(jù)庫中存儲的 VARCHAR 字段可以是某個自定義的類型,比如存儲一組特定格式的字符串,需要轉(zhuǎn)換為一個自定義對象。

5. 自定義TypeHandler實現(xiàn)

假設我們有一個場景,需要將數(shù)據(jù)庫中的 status 字段(存儲為字符串 “ACTIVE” 或 “INACTIVE”)映射為 Java 中的枚舉類型 Status。我們可以通過自定義 TypeHandler 來實現(xiàn)。

枚舉類型示例

枚舉類型 Status:

public enum Status {
    ACTIVE("ACTIVE"),
    INACTIVE("INACTIVE");

    private final String value;

    Status(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public static Status fromString(String value) {
        for (Status status : Status.values()) {
            if (status.getValue().equalsIgnoreCase(value)) {
                return status;
            }
        }
        return null;
    }
}

自定義 TypeHandler:

@MappedTypes(Status.class)  // 指定適用于 Status 類型
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, parameter.getValue());  // 將枚舉轉(zhuǎn)換為數(shù)據(jù)庫中的字符串
        } else {
            ps.setNull(i, Types.VARCHAR);
        }
    }

    @Override
    public Status getResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        return Status.fromString(value);  // 將數(shù)據(jù)庫中的字符串轉(zhuǎn)換為枚舉
    }

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

    @Override
    public Status getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return Status.fromString(value);
    }
}
  • setParameter:將枚舉類型的 Status 轉(zhuǎn)換為數(shù)據(jù)庫中的字符串(例如 “ACTIVE” 或 “INACTIVE”)。
  • getResult:將從數(shù)據(jù)庫查詢結(jié)果中獲取的字符串轉(zhuǎn)換回 Status 枚舉類型。

在 MyBatis 中注冊和使用TypeHandler

  • 注冊 TypeHandler 的方式:
    • 可以通過 @MappedTypes 注解自動注冊(如上例所示),在類型處理器的類上增加一個 @MappedTypes 注解指定與其關聯(lián)的 Java 類型列表。 如果在 javaType 屬性中也同時指定,則注解上的配置將被忽略。
    • 也可以在 MyBatis 配置文件中通過 <typeHandlers> 配置進行注冊。類型處理器的配置元素(typeHandler 元素)上增加一個 javaType 屬性(比如:javaType="String");
  • 可以通過兩種方式來指定關聯(lián)的 JDBC 類型:
    • 在類型處理器的配置元素上增加一個 jdbcType 屬性(比如:jdbcType="VARCHAR");
    • 在類型處理器的類上增加一個 @MappedJdbcTypes 注解指定與其關聯(lián)的 JDBC 類型列表。 如果在 jdbcType 屬性中也同時指定,則注解上的配置將被忽略。

下面給出在MyBatis 配置文件中通過 <typeHandlers> 配置的示例:

<typeHandlers>
			 <typeHandler handler="org.mybatis.example.ExampleTypeHandler" 
										javaType="..." 
										jdbcType="..."/>
</typeHandlers>

查詢和插入示例

User 實體類:

public class User {
    private Integer id;
    private String username;
    private Status status;  // 使用自定義的枚舉類型

    // Getters and Setters
}

Mapper 接口:

@ResulttypeHandler屬性中指定我們自定義的typeHandler

public interface UserMapper {

    @Select("SELECT id, username, status FROM t_user WHERE id = #{id}")
    @Results({
        @Result(property = "status", column = "status", typeHandler = StatusTypeHandler.class)
    })
    User selectUserById(int id);

    @Insert("INSERT INTO t_user (username, status) VALUES (#{username}, #{status, typeHandler=com.example.handler.StatusTypeHandler})")
    void insertUser(User user);
}

這樣,在查詢時status 字段會使用 StatusTypeHandler 進行轉(zhuǎn)換,插入時也會用 StatusTypeHandler 處理枚舉和數(shù)據(jù)庫字符串之間的轉(zhuǎn)換。

到此這篇關于MyBatis中TypeHandler基本用法與示例的文章就介紹到這了,更多相關MyBatis TypeHandler用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaWeb文件上傳與下載功能解析

    JavaWeb文件上傳與下載功能解析

    這篇文章主要為大家詳細介紹了JavaWeb文件上傳與下載功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java入門指南之IDEA高效調(diào)試與數(shù)組

    Java入門指南之IDEA高效調(diào)試與數(shù)組

    調(diào)試是指在程序運行過程中,通過各種手段觀察程序的執(zhí)行狀態(tài)、變量值的變化等,以找出程序中存在的錯誤或異常的過程,這篇文章主要介紹了Java入門指南之IDEA高效調(diào)試與數(shù)組的相關資料,需要的朋友可以參考下
    2026-05-05
  • java實現(xiàn)傾斜水印鋪滿整張圖

    java實現(xiàn)傾斜水印鋪滿整張圖

    這篇文章主要為大家詳細介紹了java實現(xiàn)傾斜水印鋪滿整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring?AI借助全局參數(shù)實現(xiàn)智能數(shù)據(jù)庫操作與個性化待辦管理

    Spring?AI借助全局參數(shù)實現(xiàn)智能數(shù)據(jù)庫操作與個性化待辦管理

    這篇文章主要介紹了Spring?AI借助全局參數(shù)實現(xiàn)智能數(shù)據(jù)庫操作與個性化待辦管理,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2024-11-11
  • Java中文件操作和IO的實例練習

    Java中文件操作和IO的實例練習

    Java IO流和文件操作實現(xiàn)過程解析是Java語言中的一種基本操作,IO流是Java中處理輸入輸出的基礎,這篇文章主要介紹了Java中文件操作和IO實例練習的相關資料,文中通過代碼及圖文介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • 解決使用redisTemplate高并發(fā)下連接池滿的問題

    解決使用redisTemplate高并發(fā)下連接池滿的問題

    這篇文章主要介紹了解決使用redisTemplate高并發(fā)下連接池滿的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java matches類,Pattern類及matcher類用法示例

    Java matches類,Pattern類及matcher類用法示例

    這篇文章主要介紹了Java matches類,Pattern類及matcher類用法,結(jié)合實例形式分析了java matches類,Pattern類及matcher類針對字符串常見操作技巧與相關注意事項,需要的朋友可以參考下
    2019-03-03
  • 詳解在Spring Boot中使用Https

    詳解在Spring Boot中使用Https

    本篇文章主要介紹了詳解在Spring Boot中使用Https,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot實現(xiàn)熱部署詳解

    SpringBoot實現(xiàn)熱部署詳解

    SpringBoot熱部署是一種開發(fā)時極為有用的功能,它能夠讓開發(fā)人員在代碼修改后無需手動重啟應用程序就能立即看到變化的效果,所以我本文就給打擊介紹一下為什么要使用熱部署以及實現(xiàn)熱部署的方式,需要的朋友可以參考下
    2023-07-07
  • 使用Java解決斐波那契數(shù)列問題的兩種方法(兔子繁殖問題)

    使用Java解決斐波那契數(shù)列問題的兩種方法(兔子繁殖問題)

    有一個經(jīng)典的數(shù)學問題,稱為斐波那契數(shù)列或兔子繁殖問題,問題是這樣的:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數(shù)為多少?本文介紹了如何使用Java解決問題,需要的朋友可以參考下
    2026-01-01

最新評論

临夏县| 泰来县| 望谟县| 马鞍山市| 黔西县| 潜江市| 明溪县| 舟曲县| 台中市| 永丰县| 腾冲县| 田林县| 汶上县| 崇文区| 无为县| 绥阳县| 招远市| 罗城| 卓尼县| 苍南县| 若羌县| 乐安县| 正定县| 涞源县| 兖州市| 忻州市| 三河市| 平昌县| 陇南市| 咸丰县| 赤水市| 满城县| 洛阳市| 平顶山市| 苗栗市| 织金县| 惠东县| 江源县| 天津市| 寿光市| 开江县|