SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
1. 前言
在 Spring Boot 項(xiàng)目中集成 MyBatis 時(shí),我們有時(shí)需要處理數(shù)據(jù)庫字段與 Java 對象屬性之間的特殊轉(zhuǎn)換,這時(shí)可以使用 MyBatis 提供的自定義 TypeHandler。TypeHandler 是 MyBatis 用于在 JDBC 和 Java 類型之間進(jìn)行映射的接口。當(dāng)默認(rèn)的類型映射不能滿足需求時(shí),自定義 TypeHandler 就非常有用。
本章節(jié)就跟著博主一起來學(xué)習(xí)如何自定義TypeHandler。
2. 自定義TypeHandler的應(yīng)用場景
日常開發(fā)過程種自定義 TypeHandler 主要用于以下場景:
- 數(shù)據(jù)庫中的字段類型與 Java 中的字段類型不匹配,例如數(shù)據(jù)庫中存儲(chǔ) JSON 字符串,而在 Java 中使用自定義的對象。
- 數(shù)據(jù)庫中的枚舉值需要與 Java 枚舉進(jìn)行映射。
- 需要對數(shù)據(jù)庫的特殊字段類型進(jìn)行自定義的序列化和反序列化處理。例如:數(shù)據(jù)庫中逗號(hào)分隔字符串轉(zhuǎn)換為List集合
3. 實(shí)現(xiàn)自定義 TypeHandler
假設(shè)我們有一個(gè)需求,數(shù)據(jù)庫中存儲(chǔ)了一個(gè) JSON 字符串,如:
{"city":"廣州市", "street":"天河區(qū)棠下街道"}
而我們希望在 Java 中將其映射為一個(gè)對象。首先,我們定義一個(gè)簡單的對象類 Address。
package com.example.demo.model;
public class Address {
private String street;
private String city;
// getters and setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
接下來,我們實(shí)現(xiàn)自定義的 TypeHandler,將 JSON 字符串轉(zhuǎn)換為 Address 對象。
package com.example.demo.typehandler;
import com.example.demo.model.Address;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
public class AddressTypeHandler extends BaseTypeHandler<Address> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType) throws SQLException {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (JsonProcessingException e) {
throw new SQLException("Error converting Address to String", e);
}
}
@Override
public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseAddress(json);
}
@Override
public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseAddress(json);
}
@Override
public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseAddress(json);
}
private Address parseAddress(String json) throws SQLException {
if (json == null) {
return null;
}
try {
return objectMapper.readValue(json, Address.class);
} catch (JsonProcessingException e) {
throw new SQLException("Error converting String to Address", e);
}
}
}
4. 在 MyBatis 配置中使用 TypeHandler
要讓 MyBatis 知道我們的自定義 TypeHandler,可以在 mybatis-config.xml 中進(jìn)行配置,或者通過注解的方式。
方式一:在mybatis-config.xml中配置
<typeHandlers>
<typeHandler handler="com.example.demo.typehandler.AddressTypeHandler" javaType="com.example.demo.model.Address" jdbcType="VARCHAR"/>
</typeHandlers>
方式二:使用注解配置
在 Mapper 接口的方法上直接使用 @Result 注解配置:
package com.example.demo.mapper;
import com.example.demo.model.Address;
import com.example.demo.model.User;
import com.example.demo.typehandler.AddressTypeHandler;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("SELECT id, name, address FROM user WHERE id = #{id}")
@Results({
@Result(column = "address", property = "address", typeHandler = AddressTypeHandler.class)
})
User findById(int id);
@Insert("INSERT INTO user(name, address) VALUES(#{name}, #{address, typeHandler=com.example.demo.typehandler.AddressTypeHandler})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
}
5. 在實(shí)體類中應(yīng)用自定義TypeHandler
假設(shè)我們有一個(gè) User 類,其中包含 Address 字段。
package com.example.demo.model;
public class User {
private int id;
private String name;
private Address address;
// getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
6. 總結(jié)
在 Spring Boot 項(xiàng)目中集成 MyBatis 時(shí),自定義 TypeHandler 是處理數(shù)據(jù)庫與 Java 對象之間復(fù)雜轉(zhuǎn)換的重要工具。通過 TypeHandler,我們可以輕松實(shí)現(xiàn)如 JSON 字符串與 Java 對象之間的轉(zhuǎn)換、枚舉映射、以及其他復(fù)雜的數(shù)據(jù)類型轉(zhuǎn)換。靈活運(yùn)用 TypeHandler 可以簡化代碼邏輯,提高項(xiàng)目的可維護(hù)性。
自定義 TypeHandler 適用于處理那些不能被 MyBatis 默認(rèn)處理的場景。在實(shí)際開發(fā)中,建議根據(jù)業(yè)務(wù)需求合理使用 TypeHandler,確保數(shù)據(jù)的準(zhǔn)確性和一致性。
到此這篇關(guān)于SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis自定義TypeHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis中TypeHandler的使用教程詳解
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- 解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問題
- Mybatis中TypeHandler使用小結(jié)
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- MyBatisPlus自定義JsonTypeHandler實(shí)現(xiàn)自動(dòng)轉(zhuǎn)化JSON問題
- MyBatis自定義TypeHandler如何解決字段映射問題
- MyBatis中TypeHandler基本用法與示例
相關(guān)文章
Mybatis 數(shù)據(jù)庫連接池的實(shí)現(xiàn)示例
在Java應(yīng)用程序中,與數(shù)據(jù)庫的連接是非常昂貴的,因此,當(dāng)我們使用MyBatis進(jìn)行數(shù)據(jù)操作時(shí),需要一個(gè)連接池來分配并管理這些連接,本文主要介紹了Mybatis 數(shù)據(jù)庫連接池的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Java 8 lambda表達(dá)式引入詳解及實(shí)例
這篇文章主要介紹了Java 8 lambda表達(dá)式引入詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java內(nèi)存溢出的幾個(gè)區(qū)域總結(jié)(注意避坑!)
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運(yùn)行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個(gè)區(qū)域,總結(jié)出來給大家提醒注意避坑,需要的朋友可以參考下2022-11-11
Java中的Lambda表達(dá)式及其應(yīng)用小結(jié)
Java中的Lambda表達(dá)式是一項(xiàng)極具創(chuàng)新性的特性,它使得Java代碼更加簡潔和高效,尤其是在集合操作和并行處理方面,這篇文章主要介紹了Java中的Lambda表達(dá)式及其應(yīng)用,需要的朋友可以參考下2025-04-04
Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解
我們在做Web應(yīng)用的時(shí)候,請求處理過程中發(fā)生錯(cuò)誤是非常常見的情況。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09

