MyBatis Common Mapper高级映射实战:ResultMap让复杂查询结果“丝滑“落地

MyBatis Common Mapper高级映射实战:ResultMap让复杂查询结果"丝滑"落地

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

你是否还在为MyBatis查询结果映射烦恼?字段名与属性名不匹配导致数据丢失?复杂对象嵌套映射无从下手?本文将通过MyBatis Common Mapper的ResultMap高级用法,带你解决90%的结果映射难题,让数据库查询结果完美"丝滑"落地到Java对象中。

读完本文你将掌握:

  • 如何通过ResultMap解决字段名与属性名映射问题
  • 高级结果映射技巧:级联映射、集合映射实现方案
  • 动态ResultMap与注解方式的灵活应用
  • 性能优化:ResultMap缓存与复用策略

ResultMap基础:解决字段与属性的"翻译官"问题

在数据库表设计中,我们习惯使用下划线命名(如user_name),而Java类通常采用驼峰命名(如userName)。这种命名差异会导致MyBatis默认映射失败,需要ResultMap充当"翻译官"角色。

XML配置方式

MyBatis Common Mapper支持通过XML文件定义ResultMap,典型配置如下:

<resultMap id="BaseResultMap" type="tk.mybatis.mapper.rawresultmap.User">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="user_name" jdbcType="VARCHAR" property="uname" />
    <result column="age____aa" jdbcType="INTEGER" property="age" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap>

代码示例来源:base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.xml

注解配置方式

对于简单映射场景,可以直接使用注解方式:

public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user")
    @Results({
        @Result(column = "user_name", property = "userName"),
        @Result(column = "create_time", property = "createTime")
    })
    List<User> selectUserList();
}

高级映射技巧:从单表到关联查询

级联属性映射

当Java对象包含其他对象作为属性时,可通过.语法实现级联映射:

<resultMap id="UserWithAddressMap" type="tk.mybatis.mapper.model.User">
    <id column="id" property="id"/>
    <result column="user_name" property="userName"/>
    <result column="addr_province" property="address.province"/>
    <result column="addr_city" property="address.city"/>
</resultMap>

集合映射

对于一对多关系(如用户拥有多个订单),使用<collection>标签:

<resultMap id="UserWithOrdersMap" type="tk.mybatis.mapper.model.User">
    <id column="id" property="id"/>
    <result column="user_name" property="userName"/>
    <collection property="orders" ofType="tk.mybatis.mapper.model.Order">
        <id column="order_id" property="id"/>
        <result column="order_no" property="orderNo"/>
        <result column="order_time" property="orderTime"/>
    </collection>
</resultMap>

动态ResultMap:注解与XML的灵活结合

MyBatis Common Mapper支持动态选择ResultMap,满足不同查询场景的映射需求。

注解引用XML定义的ResultMap

public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user WHERE id = #{id}")
    @ResultMap("BaseResultMap")
    User selectById(Long id);
}

代码示例来源:solon-plugin/src/test/java/tk/mybatis/solon/test/mapper/UserMapper.java

动态SQL中的ResultMap切换

<select id="selectUserByCondition" resultMap="${resultMap}">
    SELECT * FROM user
    <where>
        <if test="userName != null">AND user_name = #{userName}</if>
        <if test="status != null">AND status = #{status}</if>
    </where>
</select>

实战案例:RawResultMap测试分析

MyBatis Common Mapper的测试用例展示了ResultMap的实际应用效果。在RawResultMapTest中,通过启用基础ResultMap配置:

config.setEnableBaseResultMapFlag(true);

代码示例来源:base/src/test/java/tk/mybatis/mapper/rawresultmap/RawResultMapTest.java

测试结果表明,使用ResultMap的查询能正确映射所有字段,而未使用ResultMap的查询会丢失部分数据:

// 使用ResultMap - 所有属性都能正确映射
users = mapper.fetchRawResultMap();
users.forEach(u -> {
    Assert.assertNotNull(u.getUname());
    Assert.assertNotNull(u.getEmail());
});

// 未使用ResultMap - email字段映射失败
users = mapper.selectAll();
users.forEach(u -> {
    Assert.assertNotNull(u.getUname());
    Assert.assertNull(u.getEmail());
});

性能优化:ResultMap的缓存与复用

ResultMap的复用策略

  1. 定义全局ResultMap:在XML中定义通用ResultMap,供多个Statement引用
  2. 继承ResultMap:通过extends属性实现ResultMap的继承复用
<resultMap id="BaseResultMap" type="User">
    <id column="id" property="id"/>
    <result column="user_name" property="userName"/>
</resultMap>

<resultMap id="UserDetailMap" type="User" extends="BaseResultMap">
    <result column="email" property="email"/>
    <result column="phone" property="phone"/>
</resultMap>

启用ResultMap缓存

在MyBatis配置中启用ResultMap缓存,减少重复解析开销:

<settings>
    <!-- 启用ResultMap缓存 -->
    <setting name="cacheEnabled" value="true"/>
    <!-- 开启延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true"/>
</settings>

总结与最佳实践

ResultMap作为MyBatis Common Mapper的核心功能,是实现复杂查询结果映射的关键。在实际项目中,建议:

  1. 简单映射用注解:字段名与属性名一致时,直接使用@ResultType
  2. 复杂映射用XML:多表关联、集合映射等复杂场景使用XML配置ResultMap
  3. 公共映射抽像化:定义全局ResultMap,通过继承实现复用
  4. 性能监控不可少:通过RawResultMapTest类似的测试用例验证映射效果

掌握ResultMap的高级用法,能让你在面对复杂数据查询时游刃有余。更多高级技巧可参考:

希望本文能帮助你彻底解决MyBatis结果映射难题,让数据流转更加顺畅!如果觉得有用,别忘了点赞收藏,也欢迎在评论区分享你的使用经验。

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值