MyBatis實現(xiàn)數(shù)據(jù)庫類型和Java類型的轉換
MyBatis 在處理數(shù)據(jù)庫查詢結果或傳遞參數(shù)時,需要將數(shù)據(jù)庫類型與 Java 類型之間進行轉換。MyBatis 提供了多種方式來實現(xiàn)這種類型轉換,主要通過內置的 TypeHandler(類型處理器)機制。
1. TypeHandler 的作用
TypeHandler 是 MyBatis 中的一個接口,用于在 Java 類型和 JDBC 類型之間進行轉換。每當 MyBatis 需要將 Java 對象傳遞給 SQL 語句,或者從 SQL 查詢結果中獲取數(shù)據(jù)并轉換為 Java 對象時,都會使用 TypeHandler。
TypeHandler 負責以下兩種類型的轉換:
Java 類型到 JDBC 類型的轉換:當 MyBatis 需要將 Java 對象作為參數(shù)傳遞給 SQL 語句時,
TypeHandler會將 Java 類型轉換為 JDBC 類型。JDBC 類型到 Java 類型的轉換:當 MyBatis 從數(shù)據(jù)庫中獲取數(shù)據(jù)時,
TypeHandler會將 JDBC 類型轉換為 Java 類型。
2. 內置的 TypeHandler
MyBatis 提供了許多內置的 TypeHandler,可以處理常見的 Java 類型和 JDBC 類型之間的轉換。以下是一些常見的內置 TypeHandler:
IntegerTypeHandler:用于將int和Integer轉換為數(shù)據(jù)庫中的INTEGER類型。StringTypeHandler:用于將String轉換為數(shù)據(jù)庫中的VARCHAR類型。DateTypeHandler:用于將java.util.Date轉換為數(shù)據(jù)庫中的DATE類型。BooleanTypeHandler:用于將boolean和Boolean轉換為數(shù)據(jù)庫中的BIT或BOOLEAN類型。
這些內置的 TypeHandler 在絕大多數(shù)情況下能夠滿足開發(fā)者的需求。MyBatis 會自動選擇合適的 TypeHandler 來處理常見的數(shù)據(jù)類型。
3. 自定義 TypeHandler
有時,應用程序中可能需要處理一些自定義的數(shù)據(jù)類型,或者需要對現(xiàn)有的類型轉換進行定制。此時可以通過實現(xiàn) TypeHandler 接口來自定義類型處理器。
3.1. 實現(xiàn) TypeHandler 接口
要創(chuàng)建一個自定義的 TypeHandler,你需要實現(xiàn) org.apache.ibatis.type.TypeHandler 接口。這個接口有四個方法:
setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):將 Java 類型的數(shù)據(jù)設置到PreparedStatement中,作為 SQL 語句的參數(shù)。getResult(ResultSet rs, String columnName):從ResultSet中通過列名獲取數(shù)據(jù),并將其轉換為 Java 類型。getResult(ResultSet rs, int columnIndex):從ResultSet中通過列索引獲取數(shù)據(jù),并將其轉換為 Java 類型。getResult(CallableStatement cs, int columnIndex):從CallableStatement中獲取數(shù)據(jù),并將其轉換為 Java 類型(用于處理存儲過程的輸出參數(shù))。
3.2. 自定義 TypeHandler 示例
假設你有一個枚舉類 Gender,它表示用戶的性別。數(shù)據(jù)庫中性別使用 CHAR 類型存儲,值為 'M' 或 'F',而在 Java 中使用枚舉來表示:
public enum Gender {
MALE, FEMALE
}你可以創(chuàng)建一個自定義的 TypeHandler,用于將 CHAR 類型的數(shù)據(jù)庫值轉換為 Gender 枚舉,并反向轉換:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
?
public class GenderTypeHandler extends BaseTypeHandler<Gender> {
?
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Gender gender, JdbcType jdbcType) throws SQLException {
ps.setString(i, gender == Gender.MALE ? "M" : "F");
}
?
@Override
public Gender getNullableResult(ResultSet rs, String columnName) throws SQLException {
String gender = rs.getString(columnName);
return gender != null && gender.equals("M") ? Gender.MALE : Gender.FEMALE;
}
?
@Override
public Gender getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String gender = rs.getString(columnIndex);
return gender != null && gender.equals("M") ? Gender.MALE : Gender.FEMALE;
}
?
@Override
public Gender getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String gender = cs.getString(columnIndex);
return gender != null && gender.equals("M") ? Gender.MALE : Gender.FEMALE;
}
}3.3. 注冊自定義 TypeHandler
你可以通過兩種方式將自定義的 TypeHandler 注冊到 MyBatis:
在 MyBatis 配置文件中注冊:
<typeHandlers>
<typeHandler handler="com.example.GenderTypeHandler" javaType="com.example.Gender"/>
</typeHandlers>通過注解注冊:
如果你使用 MyBatis 的 Mapper 注解,可以在字段或方法上直接使用 @TypeHandler 注解:
@Select("SELECT id, name, gender FROM users WHERE id = #{id}")
@Results({
@Result(property = "gender", column = "gender", typeHandler = GenderTypeHandler.class)
})
User selectUserById(int id);4. 全局和局部 TypeHandler
全局 TypeHandler:可以通過在 MyBatis 配置文件中注冊自定義
TypeHandler,或者使用@MappedTypes注解,將自定義TypeHandler綁定到特定的 Java 類型。MyBatis 會自動在需要時使用這些全局TypeHandler。局部 TypeHandler:在特定的 SQL 映射文件或注解中指定
TypeHandler。這種方式僅在指定的地方生效,不會影響全局行為。
5. 總結
- 內置 TypeHandler:MyBatis 提供了多種內置的 TypeHandler,用于處理常見的 Java 類型和數(shù)據(jù)庫類型之間的轉換。
- 自定義 TypeHandler:當內置的 TypeHandler 不能滿足需求時,可以通過實現(xiàn) TypeHandler 接口或擴展 BaseTypeHandler 類來自定義類型處理器,并在 MyBatis 中注冊使用。
- 注冊與使用:自定義的 TypeHandler 可以全局注冊,也可以在特定的映射文件或注解中局部使用,靈活處理復雜的類型轉換需求。
通過使用 TypeHandler,MyBatis 能夠靈活且高效地處理 Java 類型和數(shù)據(jù)庫類型之間的轉換,滿足各種應用場景的需求。
以上就是MyBatis實現(xiàn)數(shù)據(jù)庫類型和Java類型的轉換的詳細內容,更多關于MyBatis數(shù)據(jù)庫和Java類型轉換的資料請關注腳本之家其它相關文章!
相關文章
Java優(yōu)化for循環(huán)嵌套的高效率方法
這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下2020-09-09
SpringBoot過濾器與攔截器深入分析實現(xiàn)方法
大家應該都曉得實現(xiàn)過濾器需要實現(xiàn) javax.servlet.Filter 接口,而攔截器會在處理指定請求之前和之后進行相關操作,配置攔截器需要兩步,本文通過實例代碼給大家介紹SpringBoot 過濾器和攔截器的相關知識,感興趣的朋友一起看看吧2022-11-11

