0


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. 前言

在 Spring Boot 项目中集成 MyBatis 时,我们有时需要处理数据库字段与 Java 对象属性之间的特殊转换,这时可以使用 MyBatis 提供的自定义

TypeHandler

TypeHandler

是 MyBatis 用于在 JDBC 和 Java 类型之间进行映射的接口。当默认的类型映射不能满足需求时,自定义

TypeHandler

就非常有用。

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

TypeHandler

2. 自定义TypeHandler的应用场景

日常开发过程种自定义

TypeHandler

主要用于以下场景:

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

3. 实现自定义 TypeHandler

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

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

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

Address

packagecom.example.demo.model;publicclassAddress{privateString street;privateString city;// getters and setterspublicStringgetStreet(){return street;}publicvoidsetStreet(String street){this.street = street;}publicStringgetCity(){return city;}publicvoidsetCity(String city){this.city = city;}}

接下来,我们实现自定义的

TypeHandler

,将 JSON 字符串转换为

Address

对象。

packagecom.example.demo.typehandler;importcom.example.demo.model.Address;importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importjava.sql.*;publicclassAddressTypeHandlerextendsBaseTypeHandler<Address>{privatestaticfinalObjectMapper objectMapper =newObjectMapper();@OverridepublicvoidsetNonNullParameter(PreparedStatement ps,int i,Address parameter,JdbcType jdbcType)throwsSQLException{try{
            ps.setString(i, objectMapper.writeValueAsString(parameter));}catch(JsonProcessingException e){thrownewSQLException("Error converting Address to String", e);}}@OverridepublicAddressgetNullableResult(ResultSet rs,String columnName)throwsSQLException{String json = rs.getString(columnName);returnparseAddress(json);}@OverridepublicAddressgetNullableResult(ResultSet rs,int columnIndex)throwsSQLException{String json = rs.getString(columnIndex);returnparseAddress(json);}@OverridepublicAddressgetNullableResult(CallableStatement cs,int columnIndex)throwsSQLException{String json = cs.getString(columnIndex);returnparseAddress(json);}privateAddressparseAddress(String json)throwsSQLException{if(json ==null){returnnull;}try{return objectMapper.readValue(json,Address.class);}catch(JsonProcessingException e){thrownewSQLException("Error converting String to Address", e);}}}

4. 在 MyBatis 配置中使用 TypeHandler

要让 MyBatis 知道我们的自定义

TypeHandler

,可以在

mybatis-config.xml

中进行配置,或者通过注解的方式。

方式一:在mybatis-config.xml中配置

<typeHandlers><typeHandlerhandler="com.example.demo.typehandler.AddressTypeHandler"javaType="com.example.demo.model.Address"jdbcType="VARCHAR"/></typeHandlers>

方式二:使用注解配置

Mapper

接口的方法上直接使用

@Result

注解配置:

packagecom.example.demo.mapper;importcom.example.demo.model.Address;importcom.example.demo.model.User;importcom.example.demo.typehandler.AddressTypeHandler;importorg.apache.ibatis.annotations.*;importjava.util.List;@MapperpublicinterfaceUserMapper{@Select("SELECT id, name, address FROM user WHERE id = #{id}")@Results({@Result(column ="address", property ="address", typeHandler =AddressTypeHandler.class)})UserfindById(int id);@Insert("INSERT INTO user(name, address) VALUES(#{name}, #{address, typeHandler=com.example.demo.typehandler.AddressTypeHandler})")@Options(useGeneratedKeys =true, keyProperty ="id")intinsert(User user);}

5. 在实体类中应用自定义TypeHandler

假设我们有一个

User

类,其中包含

Address

字段。

packagecom.example.demo.model;publicclassUser{privateint id;privateString name;privateAddress address;// getters and setterspublicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicAddressgetAddress(){return address;}publicvoidsetAddress(Address address){this.address = address;}}

6. 总结

Spring Boot

项目中集成

MyBatis

时,自定义

TypeHandler

是处理数据库与 Java 对象之间复杂转换的重要工具。通过

TypeHandler

,我们可以轻松实现如 JSON 字符串与 Java 对象之间的转换、枚举映射、以及其他复杂的数据类型转换。灵活运用

TypeHandler

可以简化代码逻辑,提高项目的可维护性。

自定义

TypeHandler

适用于处理那些不能被 MyBatis 默认处理的场景。在实际开发中,建议根据业务需求合理使用

TypeHandler

,确保数据的准确性和一致性。

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


在这里插入图片描述


本文转载自: https://blog.csdn.net/lhmyy521125/article/details/141568854
版权归原作者 Micro麦可乐 所有, 如有侵权,请联系我们删除。

“SpringBoot中MyBatis使用自定义TypeHandler”的评论:

还没有评论