亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot中MyBatis使用自定義TypeHandler的實現

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

1. 前言

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

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

2. 自定義TypeHandler的應用場景

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

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

3. 實現自定義 TypeHandler

假設我們有一個需求,數據庫中存儲了一個 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;
    }
}

接下來,我們實現自定義的 TypeHandler,將 JSON 字符串轉換為 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. 在實體類中應用自定義TypeHandler

假設我們有一個 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. 總結

在 Spring Boot 項目中集成 MyBatis 時,自定義 TypeHandler 是處理數據庫與 Java 對象之間復雜轉換的重要工具。通過 TypeHandler,我們可以輕松實現如 JSON 字符串與 Java 對象之間的轉換、枚舉映射、以及其他復雜的數據類型轉換。靈活運用 TypeHandler 可以簡化代碼邏輯,提高項目的可維護性。

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

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

相關文章

  • 使用Sentinel實現流控和服務降級的代碼示例

    使用Sentinel實現流控和服務降級的代碼示例

    Sentinel是面向分布式、多語言異構化服務架構的流量治理組件,本文將詳細為大家介紹如何使用Sentinel實現流控和服務降級,文中有相關的代碼示例,需要的朋友可以參考下
    2023-05-05
  • MybatisX-Generator自動代碼生成插件教程

    MybatisX-Generator自動代碼生成插件教程

    這篇文章主要介紹了MybatisX-Generator自動代碼生成插件教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot集成Prometheus實現監(jiān)控的過程

    SpringBoot集成Prometheus實現監(jiān)控的過程

    這篇文章主要介紹了SpringBoot集成Prometheus實現監(jiān)控,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 詳解Java 反射和反射的應用場景

    詳解Java 反射和反射的應用場景

    這篇文章主要介紹了Java 反射和反射的應用場景的相關資料,幫助大家更好的理解和學習Java反射的相關知識,感興趣的朋友可以了解下
    2020-08-08
  • Java多線程(單例模式,堵塞隊列,定時器)詳解

    Java多線程(單例模式,堵塞隊列,定時器)詳解

    這篇文章主要介紹了java多線程的(單例模式,堵塞隊列,定時器),具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-08-08
  • Spring中的SpringData詳細說明

    Spring中的SpringData詳細說明

    這篇文章主要介紹了Spring中的SpringData詳細說明,Spring Data 是Spring 的一個子項目, 旨在統(tǒng)一和簡化對各類型持久化存儲, 而不拘泥于是關系型數據庫還是NoSQL 數據存儲,需要的朋友可以參考下
    2023-11-11
  • Eureka源碼閱讀解析Server服務端啟動流程實例

    Eureka源碼閱讀解析Server服務端啟動流程實例

    這篇文章主要為大家介紹了Eureka源碼閱讀解析Server服務端啟動流程實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 舉例講解Java中final關鍵字的用法

    舉例講解Java中final關鍵字的用法

    Java中的final關鍵字可以被用來修飾變量、方法和類等,意味著終結、不可改變,下面我們就來舉例講解Java中final關鍵字的用法:
    2016-06-06
  • 新手了解java 數組基礎知識

    新手了解java 數組基礎知識

    這篇文章主要介紹了Java 數組分析及簡單實例的相關資料,在Java中它就是對象,一個比較特殊的對象,需要的朋友可以參考下,希望可以對你有所幫助
    2021-07-07
  • springboot中用fastjson處理返回值為null的屬性值

    springboot中用fastjson處理返回值為null的屬性值

    在本篇文章里小編給大家整理的是一篇關于springboot中用fastjson處理返回值問題詳解內容,需要的朋友們參考下。
    2020-03-03

最新評論