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

SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)

 更新時間:2024年08月28日 08:39:04   作者:Micro麥可樂  
本文主要介紹了SpringBoot中MyBatis使用自定義TypeHandler,當(dāng)默認(rèn)的類型映射不能滿足需求時,自定義?TypeHandler?就非常有用,具有一定的參考價值,感興趣的可以了解一下

1. 前言

在 Spring Boot 項目中集成 MyBatis 時,我們有時需要處理數(shù)據(jù)庫字段與 Java 對象屬性之間的特殊轉(zhuǎn)換,這時可以使用 MyBatis 提供的自定義 TypeHandler。TypeHandler 是 MyBatis 用于在 JDBC 和 Java 類型之間進行映射的接口。當(dāng)默認(rèn)的類型映射不能滿足需求時,自定義 TypeHandler 就非常有用。

本章節(jié)就跟著博主一起來學(xué)習(xí)如何自定義TypeHandler

2. 自定義TypeHandler的應(yīng)用場景

日常開發(fā)過程種自定義 TypeHandler 主要用于以下場景:

  • 數(shù)據(jù)庫中的字段類型與 Java 中的字段類型不匹配,例如數(shù)據(jù)庫中存儲 JSON 字符串,而在 Java 中使用自定義的對象。
  • 數(shù)據(jù)庫中的枚舉值需要與 Java 枚舉進行映射。
  • 需要對數(shù)據(jù)庫的特殊字段類型進行自定義的序列化和反序列化處理。例如:數(shù)據(jù)庫中逗號分隔字符串轉(zhuǎn)換為List集合

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

假設(shè)我們有一個需求,數(shù)據(jù)庫中存儲了一個 JSON 字符串,如:

{"city":"廣州市", "street":"天河區(qū)棠下街道"}

而我們希望在 Java 中將其映射為一個對象。首先,我們定義一個簡單的對象類 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;
    }
}

接下來,我們實現(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 中進行配置,或者通過注解的方式。

方式一:在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. 在實體類中應(yīng)用自定義TypeHandler

假設(shè)我們有一個 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 項目中集成 MyBatis 時,自定義 TypeHandler 是處理數(shù)據(jù)庫與 Java 對象之間復(fù)雜轉(zhuǎn)換的重要工具。通過 TypeHandler,我們可以輕松實現(xiàn)如 JSON 字符串與 Java 對象之間的轉(zhuǎn)換、枚舉映射、以及其他復(fù)雜的數(shù)據(jù)類型轉(zhuǎn)換。靈活運用 TypeHandler 可以簡化代碼邏輯,提高項目的可維護性。

自定義 TypeHandler 適用于處理那些不能被 MyBatis 默認(rèn)處理的場景。在實際開發(fā)中,建議根據(jù)業(yè)務(wù)需求合理使用 TypeHandler,確保數(shù)據(jù)的準(zhǔn)確性和一致性。

到此這篇關(guān)于SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis自定義TypeHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

萍乡市| 长葛市| 沂源县| 迭部县| 花莲县| 平泉县| 松阳县| 宝应县| 长治市| 建水县| 四会市| 云梦县| 青浦区| 霍林郭勒市| 平山县| 布尔津县| 昌图县| 股票| 南江县| 南丰县| 阳东县| 平山县| 三门峡市| 海淀区| 蕉岭县| 时尚| 利辛县| 芮城县| 德江县| 五大连池市| 闻喜县| 德格县| 定州市| 宝清县| 兴仁县| 读书| 东阳市| 新丰县| 错那县| 怀来县| 北宁市|