ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MyBatis的resultType和resultMap的区别

MyBatis的resultType和resultMap的区别 一、引言在使用 MyBatis 进行数据库连接操作时对于 SQL 语句返回结果的处理通常有两种方式resultType和resultMap。这两种方式各有其适用场景和特点理解它们的区别对于编写高效、清晰的 MyBatis 映射文件至关重要。本文将详细介绍这两种结果映射方式并结合实际代码示例帮助你根据不同的查询需求做出合适的选择。二、resultType简单直接的映射2.1 基本概念与使用resultType是 MyBatis 中最直接的结果映射方式。当使用 resultType 时SQL 查询出的字段名必须与 POJOPlain Old Java Object中的属性名完全一致或遵循驼峰命名转换规则MyBatis 会自动将查询结果映射到指定类型的对象中。resultType 的值通常是 POJO 在项目中的全限定类名或别名。2.2 适用场景与优缺点适用场景单表查询查询的字段与 POJO 属性一一对应时使用 resultType 最为合适。简单查询查询结果不需要复杂的关联映射。优点配置简单无需额外定义 resultMap。代码简洁易于理解。缺点字段名必须严格匹配灵活性较差。无法处理复杂的关联查询如一对一、一对多。2.3 多表查询的变通处理虽然 resultType 主要用于单表映射但在多表连接查询时也可以通过创建“组合 POJO”来变通使用一对一查询新建一个 POJO包含两个表中需要查询的所有字段。通常做法是创建一个继承自主表 POJO 的类并添加从表所需字段。一对多查询若使用内连接查询结果可能出现重复记录。此时需要在业务层如 Service中通过双重 for 循环进行去重和组装。这种方式虽然可行但会使得 POJO 设计变得复杂且业务层逻辑繁重因此对于复杂的关联查询更推荐使用 resultMap。三、resultMap强大灵活的映射3.1 基本概念与定义resultMap是 MyBatis 中功能更强大的结果映射方式。它允许你在 mapper.xml 文件中显式地定义数据库字段与 Java 对象属性之间的映射关系从而解除了字段名必须与属性名严格匹配的限制并能够处理复杂的对象关联。一个基本的 resultMap 定义如下!-- 订单查询关联用户的 resultMap -- !-- 将整个查询的结果映射到 cn.itcast.mybatis.po.Orders 中 -- resultMap typecn.itcast.mybatis.po.Orders idOrdersUserResultMap !-- 配置映射的订单信息 -- !-- id指定查询列中的唯一标识订单信息的唯一标识如果有多个列组成唯一标识配置多个id column订单信息的唯一标识列 property订单信息的唯一标识列所映射到 Orders 中哪个属性 -- id columnid propertyid/ result columnuser_id propertyuserId/ result columnnumber propertynumber/ result columncreatetime propertycreatetime/ result columnnote propertynote/ /resultMap3.2 处理一对一关联association当查询涉及两个具有一对一关系的表时如订单和用户可以在主表的 POJO 中添加另一个表的 POJO 作为属性然后在 resultMap 中使用association元素进行映射。示例查询订单及其关联的用户信息resultMap typecn.itcast.mybatis.po.Orders idOrdersUserResultMap !-- 订单基本信息映射 -- id columnid propertyid/ result columnuser_id propertyuserId/ result columnnumber propertynumber/ result columncreatetime propertycreatetime/ result columnnote propertynote/ !-- 配置映射的关联的用户信息 -- !-- association用于映射关联查询单个对象的信息 property要将关联查询的用户信息映射到 Orders 中哪个属性 -- association propertyuser javaTypecn.itcast.mybatis.po.User !-- id关联查询用户的唯一标识 column指定唯一标识用户信息的列 property映射到 user 的哪个属性 -- id columnuser_id propertyid/ result columnusername propertyusername/ result columnsex propertysex/ result columnaddress propertyaddress/ /association /resultMap这样查询结果会自动将用户信息封装到 Orders 对象的 user 属性中。3.3 处理一对多关联collection一对多关系如一个订单对应多条订单明细是实际开发中常见的场景。如果不对 SQL 语句进行特殊处理由于一个订单对应多条明细查询结果中订单信息会出现重复。resultMap 的解决方案是在主表 POJO 中添加一个 List 属性来存放从表的数据并在 mapper.xml 中使用collection元素进行映射。示例查询订单及其所有订单明细!-- 订单及订单明细的 resultMap -- !-- 使用 extends 继承不用在中配置订单信息和用户信息的映射 -- resultMap typecn.itcast.mybatis.po.Orders idOrdersAndOrderDetailResultMap extendsOrdersUserResultMap !-- 订单信息 -- !-- 用户信息 -- !-- 使用 extends 继承不用在中配置订单信息和用户信息的映射 -- !-- 订单明细信息 一个订单关联查询出了多条明细要使用 collection 进行映射 collection对关联查询到多条记录映射到集合对象中 property将关联查询到多条记录映射到 cn.itcast.mybatis.po.Orders 哪个属性 ofType指定映射到 list 集合属性中 pojo 的类型 -- collection propertyorderdetails ofTypecn.itcast.mybatis.po.Orderdetail !-- id订单明细唯一标识 property:要将订单明细的唯一标识映射到 cn.itcast.mybatis.po.Orderdetail 的哪个属性 -- id columnorderdetail_id propertyid/ result columnitems_id propertyitemsId/ result columnitems_num propertyitemsNum/ result columnorders_id propertyordersId/ /collection /resultMap通过这种方式虽然一条订单信息对应多条订单明细但由于将多条明细存储到了 List 集合中查询后将不再出现重复的订单数据达到了去重的效果。四、resultType 与 resultMap 对比总结对比项resultTyperesultMap映射方式自动映射字段名与属性名需一致手动映射可自定义字段与属性的对应关系配置复杂度简单无需额外配置复杂需显式定义映射关系灵活性较低受限于命名规范高可处理复杂映射和关联适用场景单表简单查询多表关联查询、复杂映射、字段名不一致性能较高自动映射稍低需解析映射配置代码可读性高直观简单取决于映射定义的清晰度五、实践建议与选择策略简单查询优先使用 resultType对于单表查询或字段名与属性名完全匹配的场景使用 resultType 可以让代码更简洁。复杂关联必须使用 resultMap涉及一对一、一对多关联查询时resultMap 是唯一的选择。考虑使用继承简化配置如示例所示通过 extends 属性继承已有的 resultMap可以避免重复配置提高可维护性。注意性能影响虽然 resultMap 功能强大但复杂的嵌套映射可能会影响性能。在设计时应权衡功能需求与性能要求。保持映射清晰为每个 resultMap 添加清晰的注释说明其用途和映射关系便于团队协作和后期维护。六、结语resultType 和 resultMap 是 MyBatis 中处理查询结果的两种核心方式它们各有优劣适用于不同的场景。理解它们的原理和适用条件能够帮助你在实际开发中做出更合理的技术选型编写出既高效又易于维护的数据访问层代码。建议在项目初期就根据业务复杂度规划好映射策略避免后期因映射混乱导致的维护困难。
返回列表