Python 官方文档:入门教程 => 点击学习
目录一、说明1.<collection>标签属性说明2. 示例代码二、平铺查询三、 嵌套查询(Nested Select for Collection)3.1
columnPrefix用法
如果使用了 columnPrefix 属性,可以省略 result 标签中的 column 属性,并且 MyBatis 会自动完成属性与列名之间的映射。
<resultMap id="userResultMap" type="User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<collection property="roles" ofType="Role">
<id column="role_id" property="id"/>
<result column="role_name" property="name"/>
</collection>
</resultMap>
改用
columnPrefix
前缀写法简化代码,使用使用时,多使用表别名作为列前缀,例如columnPrefix="r."
<resultMap id="userResultMap" type="User">
<id column="user_id" property="id"/>
<result column="user_name" property="name"/>
<collection property="roles" ofType="Role" columnPrefix="role_">
<id column="role_id" property="id"/>
<result property="name"/>
</collection>
</resultMap>
mybatis 官方文档
实体类
public class User {
private Integer id;
private String name;
private Integer age;
private List<Order> orders;
// 省略 getter 和 setter 方法
}
public class Order {
private Integer id;
private String orderNo;
private Date createTime;
// 省略 getter 和 setter 方法
}
可结合
columnPrefix
、resultMap
使用
Mybatis XML
<select id="getUserOrdersById" resultMap="userResultMap">
SELECT u.id, u.name, u.age, o.id AS order_id, o.order_no, o.create_time
FROM user u
INNER JOIN `order` o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<collection property="orders" ofType="com.example.Order" resultMap="orderResultMap" />
</resultMap>
<resultMap id="orderResultMap" type="com.example.Order">
<id property="id" column="order_id" />
<result property="orderNo" column="order_no" />
<result property="createTime" column="create_time" />
</resultMap>
嵌套查询支持惰性加载,可通过设置
fetchType
调整集合加载方式,默认值为“lazy”,可选值为“eager”。
<select id="getUserOrdersById" resultMap="userResultMap">
SELECT u.id, u.name, u.age
FROM user u
WHERE u.id = #{id}
</select>
<select id="getOrderByUserId" resultMap="orderResultMap">
SELECT o.id, o.order_no, o.create_time
FROM `order` o
WHERE o.user_id = #{userId}
</select>
<resultMap id="orderResultMap" type="com.example.Order">
<id property="id" column="order_id" />
<result property="orderNo" column="order_no" />
<result property="createTime" column="create_time" />
</resultMap>
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<collection property="orders" ofType="com.example.Order" resultMap="orderResultMap" select="getOrderByUserId" column="id">
<!-- 这里使用 column="id",指定了内层 select 语句的参数值为外层查询语句结果集中的 id 属性值(即用户ID) -->
</collection>
</resultMap>
上面讲到指定
select
嵌套sql时,需要指定column="id"
,如果内层SQL需要传入多个参数时,可采用如下方式
public class OrderQuery {
private Long userId; // 用户id
private Integer status; // 订单状态
// getter和setter方法
}
<select id="getOrdersByUserId" resultType="Order">
SELECT *
FROM `order`
WHERE user_id = #{userId}
AND status = #{status}
</select>
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- 注意这里的association标签的select属性使用了OrderQuery对象的属性 -->
<result property="orders" column="id"
select="com.example.mapper.OrderMapper.getOrdersByUserId">
<association property="param" javaType="OrderQuery">
<result property="userId" column="id"/>
<result property="status" value="1"/> <!-- 这里传递的是固定值,也可以替换为动态的表达式 -->
</association>
</result>
</resultMap>
association一对一属性处理
上面介绍一对多查询列表属性处理,其实association更常用于一对一属性的处理上
package com.example;
public class Order {
private int orderId;
private String orderName;
private Customer customer;
// getters and setters for orderId, orderName, customer
}
package com.example;
public class Customer {
private int customerId;
private String customerName;
// getters and setters for customerId, customerName
}
<resultMap id="orderMap" type="com.example.Order">
<id property="orderId" column="order_id"/>
<result property="orderName" column="order_name"/>
<association property="customer" javaType="com.example.Customer">
<id property="customerId" column="customer_id"/>
<result property="customerName" column="customer_name"/>
</association>
</resultMap>
在这个例子中,Order类有一个Customer属性,我们使用Association关联对象将query出的Customer映射到Order对象的Customer属性上。
需要注意的是,Association也可以嵌套使用,我们可以通过多层Association实现多个对象之间的关联。此外,需要注意的是,在映射关联对象Association时要确保SQL语句中的JOIN操作正确无误。
到此这篇关于Mybatis一对多查询列表属性处理的文章就介绍到这了,更多相关Mybatis一对多查询列表属性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Mybatis一对多查询列表属性处理示例详解
本文链接: https://lsjlt.com/news/214039.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0