MyBatis ResultSetHandler支持哪些结果映射方式? 如何处理一对一、一对多、多对多关系?

ResultSetHandler 在 MyBatis 中提供了强大的结果映射能力,支持多种灵活的结果映射方式,以适应各种复杂的数据库查询结果到 Java 对象的转换需求。 它主要通过 ResultMap 来定义和实现这些结果映射方式。

ResultSetHandler 支持的结果映射方式,主要通过 ResultMap 的不同子元素来体现:

  1. 基本属性映射 (<id><result> 元素):

    • <id> 元素: 用于映射 主键 (ID) 属性。 通常用于标识对象的唯一性。

      • 属性:
        • column: 数据库结果集中的列名。
        • property: Java 对象中的属性名。
        • jdbcType (可选): JDBC 类型。
        • javaType (可选): Java 类型。
        • typeHandler (可选): 类型处理器。
    • <result> 元素: 用于映射 普通属性 (非主键属性)

      • 属性:<id> 元素相同,包括 column, property, jdbcType, javaType, typeHandler
    • 作用:ResultSet 中的列值,按照指定的列名 (column) 和属性名 (property) 映射到 Java 对象的对应属性上。 可以使用 jdbcTypetypeHandler 进行类型转换和自定义处理。

    • 适用场景: 最基本的结果映射方式,适用于单表查询,将结果集中的列直接映射到 Java 对象的简单属性。

    示例 ResultMap (基本属性映射):

    <resultMap id="userResultMap" type="User">
        <id column="user_id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="email" property="email" jdbcType="VARCHAR"/>
    </resultMap>
    
  2. 关联映射 (Association Mapping - 一对一关系,<association> 元素):

    • <association> 元素: 用于映射 一对一关联关系。 例如,一个 User 对象关联一个 Address 对象。

      • 属性:
        • property: Java 对象中表示关联对象的属性名 (例如 address)。
        • javaType: 关联对象的 Java 类型 (例如 Address.class)。
        • columncolumns: 数据库结果集中用于关联查询的列名 (或列名列表,用于联合主键)。
        • select (可选): 指定一个外部的 select 语句 (另一个 MappedStatement) 来查询关联对象。 嵌套查询方式。
        • resultMap (可选): 引用外部定义的 resultMap 来映射关联对象。
        • fetchType (可选): 指定关联对象的加载方式 (LAZY 或 EAGER)。 默认 LAZY
      • 子元素: 可以包含 <id>, <result>, <association>, <collection> 等子元素,用于更详细地定义关联对象的映射规则。
    • 处理方式: ResultSetHandler 会根据 <association> 元素的配置,处理一对一关联关系。 主要有两种处理方式:

      • 嵌套查询 (Nested Select): 如果配置了 select 属性,ResultSetHandler执行指定的 select 语句 (嵌套查询) 来查询关联对象。 嵌套查询会 延迟加载 (Lazy Loading) 关联对象 (除非 fetchType="EAGER")。 性能可能较低,但可以实现按需加载关联对象。
      • 连接查询 (Join Query): 如果没有配置 select 属性,通常需要在主查询中使用 JOIN 语句一次性查询主对象和关联对象的数据。 ResultSetHandler 需要根据 <association> 元素的映射规则, 从同一个 ResultSet 中提取关联对象的数据,并映射到主对象的关联属性上。 性能较高,但可能导致数据冗余 (如果多行结果关联到同一个主对象)。

    示例 ResultMap (一对一关联映射 - 嵌套查询):

    <resultMap id="userResultMapWithAddress" type="User">
        <id column="user_id" property="id"/>
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰糖心书房

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

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

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

打赏作者

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

抵扣说明:

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

余额充值