详解Mybatis中ResultType和ResultMap区别

在 MyBatis 中,resultTyperesultMap 都用于将 SQL 查询结果映射到 Java 对象中,但它们的用途和灵活性有所不同。

一、resultType

resultType 是 MyBatis 中一种简单且快捷的结果映射方式。它直接指定了查询结果应该映射到哪个 Java 类。

特点:
  • 简单易用: 适用于简单的映射场景,如查询结果与 Java 对象的字段名完全匹配。
  • 自动映射: MyBatis 会根据列名自动将结果集的字段映射到实体类的属性上。
  • 限制较多: 不能处理复杂的映射关系,如字段名与属性名不一致、嵌套对象映射、多对多关系映射等。
使用示例:
<select id="getUserById" parameterType="int" resultType="com.example.User">
    SELECT id, name, email FROM users WHERE id = #{id}
</select>

在这个例子中,MyBatis 会自动将 idnameemail 字段映射到 User 类的相应属性上。

二、resultMap

resultMap 是 MyBatis 提供的更为灵活和强大的结果映射方式。它允许你自定义复杂的映射规则,包括字段名和属性名不一致的情况、嵌套映射(将查询结果中的某些字段映射为对象属性)、以及处理一对多和多对多关系。

特点:
  • 灵活强大: 可以处理复杂的映射需求,如字段名与属性名不匹配、嵌套对象映射、一对多、多对多等。
  • 支持嵌套对象: 可以将结果集中的某些字段映射为 Java 对象的属性(嵌套对象)。
  • 自定义映射: 可以手动定义字段和属性之间的映射关系,甚至可以处理不同表之间的关联查询结果。
使用示例:
<resultMap id="userResultMap" type="com.example.User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <result property="email" column="user_email"/>
    <!-- 嵌套的对象映射 -->
    <association property="address" column="address_id" javaType="com.example.Address"
                 select="com.example.AddressMapper.getAddressById"/>
    <!-- 一对多映射 -->
    <collection property="orders" ofType="com.example.Order" 
                select="com.example.OrderMapper.getOrdersByUserId" column="user_id"/>
</resultMap>

<select id="getUserById" parameterType="int" resultMap="userResultMap">
    SELECT user_id, user_name, user_email, address_id FROM users WHERE user_id = #{id}
</select>

在这个例子中,resultMap 不仅定义了简单的字段到属性的映射,还处理了嵌套对象(address)以及一对多的关系(orders)。

三、区别总结:

  • 复杂度: resultType 适用于简单的映射场景,而 resultMap 用于更复杂的映射需求。
  • 灵活性: resultMap 提供了比 resultType 更高的灵活性,允许自定义映射规则和处理复杂的对象结构。
  • 使用场景: 如果查询结果与 Java 对象的字段名一致,且没有复杂的关系映射,使用 resultType 更简洁。如果需要处理嵌套对象、字段名不一致、多对多或一对多关系,使用 resultMap

四、什么时候用 resultType,什么时候用 resultMap

  • 使用 resultType 当查询结果集的字段名与 Java 类属性名一致,并且映射关系简单时,使用 resultType 可以简化配置。

  • 使用 resultMap 当需要自定义映射关系、字段名不一致、处理嵌套对象或复杂的关系(如一对多、多对多)时,使用 resultMap 提供更强大的功能和灵活性。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis ,paramtype、parammapresultmapresulttype 这些属性可以用于处理多表复杂查询。以下是一个使用示例: 1. paramtype 示例: 在映射文件或注解使用 paramtype 属性指定传入 SQL 语句的参数类型。假设有一个查询方法,需要传入两个参数,一个是整数类型的用户 ID,另一个是字符串类型的用户名。可以这样定义 paramtype: ```xml <select id="getUser" parameterType="map" resultType="User"> SELECT * FROM users WHERE id = #{id} AND name = #{name} </select> ``` 这里的 parameterType="map" 表示传入的参数是一个 Map 对象,其包含了键为 "id" 和 "name" 的参数。 2. parammap 示例: 如果查询需要传入多个参数,可以使用 parammap 属性将多个参数打包成一个对象传递给 SQL 语句。假设有一个查询方法需要传入用户 ID 和订单号两个参数,可以这样定义 parammap: ```xml <select id="getOrder" parameterType="map" resultMap="OrderResultMap"> SELECT * FROM orders WHERE user_id = #{param1.userId} AND order_no = #{param1.orderNo} </select> ``` 这里的 parameterType="map" 表示传入的参数是一个 Map 对象,其键为 "param1" 的值是一个包含 userId 和 orderNo 属性的对象。 3. resultmap 示例: 如果查询结果涉及多个表,并且需要将结果映射到多个对象,可以使用 resultmap 属性来定义结果映射表。假设有一个查询方法需要返回用户信息和订单信息,可以这样定义 resultmap: ```xml <resultMap id="UserResultMap" type="User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <!-- 其他属性映射 --> </resultMap> <resultMap id="OrderResultMap" type="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <!-- 其他属性映射 --> </resultMap> <select id="getUserOrder" resultMap="UserResultMap, OrderResultMap"> SELECT u.id AS user_id, u.name AS user_name, o.id AS order_id, o.order_no FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE u.id = #{id} </select> ``` 这里的 resultMap="UserResultMap, OrderResultMap" 表示将查询结果映射到 User 对象和 Order 对象。 4. resulttype 示例: 在某些情况下,可能只需要返回单个结果,可以使用 resulttype 属性指定返回结果的数据类型。假设有一个查询方法只需要返回用户名,可以这样定义 resulttype: ```xml <select id="getUserName" resultType="java.lang.String"> SELECT name FROM users WHERE id = #{id} </select> ``` 这里的 resultType="java.lang.String" 表示返回的结果是字符串类型。 通过使用 paramtype、parammapresultmapresulttype 属性,可以更灵活地处理多表复杂查询,实现数据的准确映射和精确查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

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

抵扣说明:

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

余额充值