Mybatis一对多与多对一查询处理详解
Mybatis是一个支持高度定制化SQL查询、缓存处理和参数映射的框架。在Mybatis中,一对多与多对一的查询是非常常见和重要的使用情景。本文将详细介绍Mybatis一对多与多对一查询的处理方法。
一对多查询
一对多查询指的是,在表之间通过一个外键关联形成的一种关系,即一个父对象对应多个子对象。下面是一个一对多的示例:
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` int NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `order_items` (
`id` int NOT NULL AUTO_INCREMENT,
`order_id` int NOT NULL,
`product_name` varchar(32) NOT NULL,
`product_price` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`)
);
我们可以通过以下的映射关系,将orders
表与order_items
表关联起来:
<resultMap id="orderResultMap" type="com.example.Order">
<id property="id" column="id" />
<result property="orderNo" column="order_no" />
<association property="user" column="user_id" select="com.example.UserMapper.selectById" />
<collection property="items" ofType="com.example.OrderItem" column="id" select="com.example.OrderItemMapper.selectByOrderId" />
</resultMap>
在上面的映射中,我们先定义了Order
类的映射关系。其中,items
属性被定义为一个OrderItem
对象的数组,对应order_items
表中的多条记录。column
属性中指定的是父对象的主键列。接下来,在OrderMapper
中,我们可以通过以下方式实现通过父对象id查询对应的子对象集合:
<select id="selectByOrderId" resultMap="itemResultMap">
SELECT * FROM order_items WHERE order_id=#{orderId}
</select>
这里的#{orderId}
对应查询方法中传入的参数。
多对一查询
多对一查询指的是,在表之间通过一个外键关联形成的一种关系,即多个子对象对应一个父对象。下面是一个多对一的示例:
CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `orders2` (
`id` int NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` int NOT NULL,
PRIMARY KEY (`id`)
);
我们可以通过以下的映射关系,将orders2
表与users
表关联起来:
<resultMap id="orderResultMap" type="com.example.Order">
<id property="id" column="id" />
<result property="orderNo" column="order_no" />
<association property="user" column="user_id" select="com.example.UserMapper.selectById" />
</resultMap>
在上面的映射中,我们定义了Order
类的映射关系,并在<association>
标签中定义了父对象类的映射关系。其中,column
属性中指定的是子对象的外键列。接下来,在OrderMapper
中,我们可以通过以下方式实现查询父对象:
<select id="selectById" resultMap="userResultMap">
SELECT * FROM users WHERE id=#{id}
</select>
这里的#{id}
对应查询方法中传入的参数。
示例
示例一:一对多查询
假设我们要查询order_no="1001"
的订单详情信息,可以写出以下查询方法:
public Order selectOrderDetailByOrderNo(String orderNo) {
return sqlSession.selectOne("com.example.OrderMapper.selectOrderDetailByOrderNo", orderNo);
}
对应的<select>
标签定义如下:
<select id="selectOrderDetailByOrderNo" resultMap="orderResultMap">
SELECT * FROM orders WHERE order_no = #{orderNo}
</select>
示例二:多对一查询
假设我们要查询id为1的用户的订单列表信息,可以写出以下查询方法:
public List<Order> selectOrdersByUserId(Integer userId) {
return sqlSession.selectList("com.example.OrderMapper.selectOrdersByUserId", userId);
}
对应的<select>
标签定义如下:
<select id="selectOrdersByUserId" resultMap="orderResultMap">
SELECT * FROM orders WHERE user_id = #{userId}
</select>
上述两个示例中,sqlSession
是Mybatis框架中用来执行SQL语句的核心对象。在执行查询时,我们可以通过定义的resultMap
标签,将查询结果映射为特定的Java对象。对于一对多和多对一的查询,我们可以通过<collection>
和<association>
标签实现子对象与父对象之间的关联。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis一对多与多对一查询处理详解 - Python技术站