网站正能量破解版下载大全安装,优秀的产品设计与分析,wordpress点击图片弹出,太原市网站建设网站在 MyBatis 中#xff0c;TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象#xff0c;它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 ListUser 的案例…在 MyBatis 中TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 ListUser 的案例详解 TypeHandler 的原理与实践。 一、TypeHandler 的作用与原理
1. 核心功能
类型转换桥梁将 Java 对象属性转换为 JDBC 参数如 PreparedStatement 设置值结果集映射将数据库查询结果如 ResultSet转换为 Java 对象属性空值处理统一处理 Java 对象与数据库字段的 NULL 值逻辑。
2. 应用场景
内置类型处理MyBatis 已支持 String、Integer、Date 等常见类型的转换复杂类型处理如 JSON 字符串与对象互转、枚举值与数据库标记映射、CSV 字符串与集合转换等。 二、TypeHandler 的配置与扩展
1. 内置 TypeHandler
MyBatis 默认提供多种 TypeHandler例如
StringTypeHandler处理 VARCHAR 与 StringEnumTypeHandler处理枚举与数据库标记如 disabled 转 0DateTypeHandler处理日期类型与 TIMESTAMP 的转换。
2. 自定义 TypeHandler 步骤
继承 BaseTypeHandler实现 setNonNullParameterJava→JDBC和 getNullableResultJDBC→Java方法注册处理器 全局注册在 mybatis-config.xml 中通过 typeHandlers 标签配置局部指定在 Mapper XML 或注解中通过 typeHandler 属性标记 应用转换逻辑在实体类字段或 SQL 映射中声明使用自定义 TypeHandler。 三、实战FastJson 实现 JSON 字符串与 List 转换
1. 场景描述
假设数据库表 user_group 的 users 字段存储 JSON 字符串需在 Java 中映射为 ListUser 对象
CREATE TABLE user_group (id BIGINT PRIMARY KEY,users VARCHAR(2048) -- 存储格式[{id:1,name:Alice,age:25},...]
);2. 实现步骤
① 引入依赖
dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.83/version
/dependency② 定义 User 实体
public class User {private Long id;private String name;private Integer age;// getters/setters
}③ 自定义 TypeHandler
public class ListUserTypeHandler extends BaseTypeHandlerListUser {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, ListUser users, JdbcType jdbcType) throws SQLException {ps.setString(i, JSON.toJSONString(users)); // Java→JSON字符串}Overridepublic ListUser getNullableResult(ResultSet rs, String columnName) throws SQLException {String json rs.getString(columnName);return parseJson(json);}private ListUser parseJson(String json) {return json null ? null : JSON.parseObject(json, new TypeReferenceListUser(){});}// 其他重写方法略...
}④ 全局注册 TypeHandler
!-- mybatis-config.xml --
typeHandlerstypeHandler handlercom.example.ListUserTypeHandler javaTypejava.util.List jdbcTypeVARCHAR/
/typeHandlers⑤ 实体类与 Mapper 映射
public class UserGroup {private Long id;TableField(typeHandler ListUserTypeHandler.class)private ListUser users;// getters/setters
}!-- UserGroupMapper.xml --
select idselectUserGroup resultTypeUserGroupSELECT * FROM user_group WHERE id #{id}
/select四、测试与验证
UserGroup group sqlSession.selectOne(selectUserGroup, 1L);
System.out.println(group.getUsers());
// 输出[User{id1, nameAlice, age25}, User{id2, nameBob, age30}]五、总结与扩展 优势 解耦业务与持久化逻辑将类型转换代码集中管理提升可维护性支持复杂场景通过自定义逻辑处理加密数据、多语言字段等特殊需求。 扩展方向 泛型支持抽象通用 JSON TypeHandler通过 TypeReference 适配不同泛型类性能优化针对高频转换类型缓存解析结果减少重复计算。
通过合理使用 TypeHandler开发者可以显著提升 MyBatis 在处理复杂数据类型时的灵活性与代码整洁度是高效 ORM 实践的重要工具。