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

MyBatis中TypeHandler基本用法與示例

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

引入

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

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

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

1.TypeHandler的作用

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

2.TypeHandler的接口

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

public interface TypeHandler<T> {
    // 設(shè)置 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 類型,并設(shè)置到 PreparedStatement 中。
  • getResult:將查詢結(jié)果從數(shù)據(jù)庫的 JDBC 類型轉(zhuǎn)換為 Java 類型。

3.默認(rèn)的TypeHandler

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

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

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

4. 自定義TypeHandler的場(chǎng)景

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

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

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

假設(shè)我們有一個(gè)場(chǎng)景,需要將數(shù)據(jù)庫中的 status 字段(存儲(chǔ)為字符串 “ACTIVE” 或 “INACTIVE”)映射為 Java 中的枚舉類型 Status。我們可以通過自定義 TypeHandler 來實(shí)現(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 中注冊(cè)和使用TypeHandler

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

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

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

查詢和插入示例

User 實(shí)體類:

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);
}

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Java中文件操作和IO的實(shí)例練習(xí)

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

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

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

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

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

    詳解在Spring Boot中使用Https

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

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

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

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

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

最新評(píng)論

察隅县| 兴宁市| 府谷县| 巩留县| 郓城县| 太保市| 子长县| 溧阳市| 山东| 封丘县| 新津县| 泽库县| 元氏县| 四会市| 北宁市| 阿勒泰市| 齐河县| 黄骅市| 新沂市| 台湾省| 东乡族自治县| 五台县| 香格里拉县| 景德镇市| 凤凰县| 邵东县| 朝阳区| 西城区| 石城县| 通河县| 杭锦旗| 新密市| 邵阳县| 伊通| 通化县| 斗六市| 衢州市| 亳州市| 晋宁县| 东丽区| 石柱|