ResultSetHandler 在 MyBatis 中提供了强大的结果映射能力,支持多种灵活的结果映射方式,以适应各种复杂的数据库查询结果到 Java 对象的转换需求。 它主要通过 ResultMap 来定义和实现这些结果映射方式。
ResultSetHandler 支持的结果映射方式,主要通过 ResultMap 的不同子元素来体现:
-
基本属性映射 (
<id>和<result>元素):-
<id>元素: 用于映射 主键 (ID) 属性。 通常用于标识对象的唯一性。- 属性:
column: 数据库结果集中的列名。property: Java 对象中的属性名。jdbcType(可选): JDBC 类型。javaType(可选): Java 类型。typeHandler(可选): 类型处理器。
- 属性:
-
<result>元素: 用于映射 普通属性 (非主键属性)。- 属性: 与
<id>元素相同,包括column,property,jdbcType,javaType,typeHandler。
- 属性: 与
-
作用: 将
ResultSet中的列值,按照指定的列名 (column) 和属性名 (property) 映射到 Java 对象的对应属性上。 可以使用jdbcType和typeHandler进行类型转换和自定义处理。 -
适用场景: 最基本的结果映射方式,适用于单表查询,将结果集中的列直接映射到 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> -
-
关联映射 (Association Mapping - 一对一关系,
<association>元素):-
<association>元素: 用于映射 一对一关联关系。 例如,一个User对象关联一个Address对象。- 属性:
property: Java 对象中表示关联对象的属性名 (例如address)。javaType: 关联对象的 Java 类型 (例如Address.class)。column或columns: 数据库结果集中用于关联查询的列名 (或列名列表,用于联合主键)。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中提取关联对象的数据,并映射到主对象的关联属性上。 性能较高,但可能导致数据冗余 (如果多行结果关联到同一个主对象)。
- 嵌套查询 (Nested Select): 如果配置了
示例
ResultMap(一对一关联映射 - 嵌套查询):<resultMap id="userResultMapWithAddress" type="User"> <id column="user_id" property="id"/> -

最低0.47元/天 解锁文章
1766

被折叠的 条评论
为什么被折叠?



