SpringBoot中MyBatis使用自定义TypeHandler的实现
作者:Micro麦可乐
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 setters public 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(); @Override public 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); } } @Override public Address getNullableResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); return parseAddress(json); } @Override public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String json = rs.getString(columnIndex); return parseAddress(json); } @Override public 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 setters public 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的实现的文章就介绍到这了,更多相关MyBatis自定义TypeHandler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!