SpringBoot中MyBatis使用自定义TypeHandler

2024-08-28 14:04

本文主要是介绍SpringBoot中MyBatis使用自定义TypeHandler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

SpringBoot整合MyBatis使用自定义TypeHandler

  • 1. 前言
  • 2. 自定义TypeHandler的应用场景
  • 3. 实现自定义 TypeHandler
  • 4. 在 MyBatis 配置中使用 TypeHandler
    • 方式一:在mybatis-config.xml中配置
    • 方式二:使用注解配置
  • 5. 在实体类中应用自定义TypeHandler
  • 6. 总结

1. 前言

在 Spring Boot 项目中集成 MyBatis 时,我们有时需要处理数据库字段与 Java 对象属性之间的特殊转换,这时可以使用 MyBatis 提供的自定义 TypeHandlerTypeHandler 是 MyBatis 用于在 JDBC 和 Java 类型之间进行映射的接口。当默认的类型映射不能满足需求时,自定义 TypeHandler 就非常有用。

本章节就跟着博主一起来学习如何自定义TypeHandler

2. 自定义TypeHandler的应用场景

日常开发过程种自定义 TypeHandler 主要用于以下场景:

  • 数据库中的字段类型与 Java 中的字段类型不匹配,例如数据库中存储 JSON 字符串,而在 Java 中使用自定义的对象。
  • 数据库中的枚举值需要与 Java 枚举进行映射。
  • 需要对数据库的特殊字段类型进行自定义的序列化和反序列化处理。例如:数据库中逗号分隔字符串转换为List集合

3. 实现自定义 TypeHandler

假设我们有一个需求,数据库中存储了一个 JSON 字符串,如:

{"city":"广州市", "street":"天河区棠下街道"}

而我们希望在 Java 中将其映射为一个对象。首先,我们定义一个简单的对象类 Address

package com.example.demo.model;public class Address {private String street;private String city;// getters and setterspublic 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();@Overridepublic 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);}}@Overridepublic Address getNullableResult(ResultSet rs, String columnName) throws SQLException {String json = rs.getString(columnName);return parseAddress(json);}@Overridepublic Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String json = rs.getString(columnIndex);return parseAddress(json);}@Overridepublic 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 setterspublic 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 默认处理的场景。在实际开发中,建议根据业务需求合理使用 TypeHandler,确保数据的准确性和一致性。

如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


在这里插入图片描述

这篇关于SpringBoot中MyBatis使用自定义TypeHandler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114974

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解