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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.