😄 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
,确保数据的准确性和一致性。
如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!
版权归原作者 Micro麦可乐 所有, 如有侵权,请联系我们删除。