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>

自动映射注意事项

  1. 列名与属性名需严格匹配(下划线转驼峰需配置mapUnderscoreToCamelCase
  2. 嵌套映射建议使用显式resultMap
  3. 复杂类型建议禁用自动映射

三、实战建议

  1. 类型处理器选择

    • 简单类型:优先使用内置处理器
    • JSON/XML数据:自定义处理器
    • 枚举:考虑使用EnumOrdinalTypeHandler存储序号而非名称
  2. 映射优化技巧

图1

  1. 性能考量

    • 避免过度嵌套(超过3层建议拆解查询)
    • 大数据量关联查询考虑使用<select>标签的fetchType="lazy"
  2. 常见问题解决方案

    • 类型不匹配:检查TypeHandler注册是否正确
    • 嵌套映射失效:确认是否配置了autoMappingBehavior
    • 枚举转换异常:检查是否使用了正确的EnumTypeHandler

通过合理运用TypeHandler和映射策略,可以显著提升MyBatis的数据处理能力与开发效率。

添加新评论