MyBatis类型处理与映射深度解析 - 全面指南
MyBatis类型处理与映射深度解析
一、TypeHandler:类型转换的桥梁
1.1 内置类型处理器
MyBatis内置了丰富的TypeHandler来处理Java类型与数据库类型的转换:
// 常见内置处理器示例
StringTypeHandler // String <-> VARCHAR
IntegerTypeHandler // Integer <-> INT
DateTypeHandler // Date <-> TIMESTAMP
EnumTypeHandler // Enum <-> VARCHAR (存储枚举名称)
日期处理最佳实践:
<result column="create_time" property="createTime"
typeHandler="org.apache.ibatis.type.DateTypeHandler"/>
1.2 自定义类型处理器
当需要处理特殊类型时,可以实现TypeHandler
接口:
public class JsonTypeHandler implements TypeHandler<Map<String, Object>> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setParameter(PreparedStatement ps, int i,
Map<String, Object> parameter, JdbcType jdbcType) {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public Map<String, Object> getResult(ResultSet rs, String columnName) {
// 实现结果集转换...
}
}
注册自定义处理器:
<typeHandlers>
<typeHandler handler="com.example.JsonTypeHandler"
javaType="java.util.Map" jdbcType="VARCHAR"/>
</typeHandlers>
二、对象关系映射的艺术
2.1 复杂对象嵌套
2.1.1 一对一关联(association)
<resultMap id="orderResultMap" type="Order">
<id property="id" column="order_id"/>
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
</association>
</resultMap>
2.1.2 一对多关联(collection)
<resultMap id="blogResultMap" type="Blog">
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="title" column="post_title"/>
</collection>
</resultMap>
2.2 自动映射规则
MyBatis提供三种自动映射策略(mybatis-config.xml):
<settings>
<!-- NONE(禁用), PARTIAL(默认,不映射嵌套), FULL(全自动) -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>
自动映射注意事项:
- 列名与属性名需严格匹配(下划线转驼峰需配置
mapUnderscoreToCamelCase
) - 嵌套映射建议使用显式resultMap
- 复杂类型建议禁用自动映射
三、实战建议
类型处理器选择:
- 简单类型:优先使用内置处理器
- JSON/XML数据:自定义处理器
- 枚举:考虑使用
EnumOrdinalTypeHandler
存储序号而非名称
- 映射优化技巧:
性能考量:
- 避免过度嵌套(超过3层建议拆解查询)
- 大数据量关联查询考虑使用
<select>
标签的fetchType="lazy"
常见问题解决方案:
- 类型不匹配:检查TypeHandler注册是否正确
- 嵌套映射失效:确认是否配置了
autoMappingBehavior
- 枚举转换异常:检查是否使用了正确的EnumTypeHandler
通过合理运用TypeHandler和映射策略,可以显著提升MyBatis的数据处理能力与开发效率。