😄 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 提供的自定义 TypeHandler
。TypeHandler
是 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
,确保数据的准确性和一致性。
如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!