MyBatis Common Mapper高级映射实战:ResultMap让复杂查询结果"丝滑"落地
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: 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的复用策略
- 定义全局ResultMap:在XML中定义通用ResultMap,供多个Statement引用
- 继承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的核心功能,是实现复杂查询结果映射的关键。在实际项目中,建议:
- 简单映射用注解:字段名与属性名一致时,直接使用
@ResultType - 复杂映射用XML:多表关联、集合映射等复杂场景使用XML配置ResultMap
- 公共映射抽像化:定义全局ResultMap,通过继承实现复用
- 性能监控不可少:通过RawResultMapTest类似的测试用例验证映射效果
掌握ResultMap的高级用法,能让你在面对复杂数据查询时游刃有余。更多高级技巧可参考:
- 官方文档:README.md
- 测试用例:base/src/test/java/tk/mybatis/mapper/rawresultmap/
- 核心源码:core/src/main/java/tk/mybatis/mapper/entity/EntityTable.java
希望本文能帮助你彻底解决MyBatis结果映射难题,让数据流转更加顺畅!如果觉得有用,别忘了点赞收藏,也欢迎在评论区分享你的使用经验。
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



