Mybatis一对多查询示例

在实际生活中一对多级联关系有许多,例如一个用户可以有多个订单,而一个订单只属于一个用户。

下面以用户和订单之间的关系为例,讲解一对多级联查询(实现“根据用户id查询用户及其关联的订单信息”的功能)的处理过程,只需参考该实例即可学会一对多级联查询的MyBatis实现。

1.创建数据表

use springtest;
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
  id tinyint(2) NOT NULL AUTO_INCREMENT,
  ordersn varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  user_id tinyint(2) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY user_id (user_id),
  CONSTRAINT user_id FOREIGN KEY (user_id) REFERENCES user (uid)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO orders VALUES ('1', '999999', '1');
INSERT INTO orders VALUES ('2', '88888', '1');
INSERT INTO orders VALUES ('3', '7777777', '31');
INSERT INTO orders VALUES ('4', '666666666', '31');
select * from orders;

2.创建持久化类
在com.po包中创建对应的持久化类Orders,User表对应的持久化类MyUser

package com.po;
//springtest数据库中orders表的持久化类
public class Orders {
  private Integer id;
  private  String ordersn;
}
package com.po;
import java.util.List;
public class MyUser {
  private Integer uid;
  private String uname;
  private String usex;
//一对多关联查询,用户关联的订单
  private List<Orders> ordersList;
}

3.创建映射文件
在mybatis-config.xml核心配置文件中 告诉 MyBatis到哪里去找UserMapper.xml和OrdersMapper.xml映射文件

<mapper resource="com/mybatis/OrdersMapper.xml"/>

3.1创建orders表对应的映射文件,OrdersMapper.xml

<mapper namespace="com.dao.OrdersDao">
<!-- 根据用户uid查询订单信息 -->
<select id="selectOrdersById" parameterType="Integer" resultType="com.po.Orders">
  select * from orders where user_id=#{id}
</select>
</mapper>

3.2 UserMapper.xml
一对多 根据uid查询用户及其关联的订单信息:第一种方法(嵌套查询)

<!-- 一对多 根据uid查询用户及其关联的订单信息:第一种方法(嵌套查询) -->
<resultMap type="com.po.MyUser" id="userAndOrders1">
  <id property="uid" column="uid"/>
  <result property="uname" column="uname"/>
  <result property="usex" column="usex"/>
<!-- 一对多关联查询,ofType表示集合中的元素类型,将uid传递给selectOrdersById-->
  <collection property="ordersList" ofType="com.po.Orders" column="uid"
   select="com.dao.OrdersDao.selectOrdersById"/>
</resultMap>
<select id="selectUserOrdersById1" parameterType="Integer" resultMap="userAndOrders1">
  select * from user where uid = #{id}
</select>

一对多 根据uid查询用户及其关联的订单信息:第二种方法(连接查询)

<!-- 一对多 根据uid查询用户及其关联的订单信息:第二种方法(连接查询) -->
<resultMap type="com.po.MyUser" id="userAndOrders2">
  <id property="uid" column="uid"/>
  <result property="uname" column="uname"/>
  <result property="usex" column="usex"/>
  <!-- 一对多关联查询,ofType表示集合中的元素类型 -->
  <collection property="ordersList" ofType="com.po.Orders" >
  <id property="id" column="id"/>
  <result property="ordersn" column="ordersn"/>
  </collection>
</resultMap>
<select id="selectUserOrdersById2" parameterType="Integer" resultMap="userAndOrders2">
select u.*,o.id,o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=#{id}
</select>

一对多 根据uid查询用户及其关联的订单信息:第三种方法(使用POJO存储结果)

<!-- 一对多 根据uid查询用户及其关联的订单信息:第三种方法(使用POJO存储结果) -->
<select id="selectUserOrdersById3" parameterType="Integer" resultType="com.pojo.SelectUserOrdersById">
select u.*,o.id,o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=#{id}
</select>
package com.pojo;
public class SelectUserOrdersById {
  private Integer uid;
  private String uname;
  private String usex;
  private Integer id;
  private String ordersn;
}

4.在com.pojo中创建第3步使用的POJO类com.pojo.SelectUserOrdersById

package com.pojo;
public class SelectUserOrdersById {
  private Integer uid;
  private String uname;
  private String usex;
  private Integer id;
  private String ordersn;
}

5.创建数据操作接口

//在com.dao中创建第3步映射文件对应的数据操作接口OrdersDao。
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.po.Orders;
@Repository("ordersDao")
@Mapper
public interface OrdersDao {
  //根据用户uid查询订单信息
  public List<Orders> selectOrdersById(Integer uid);
}

在UserDao里添加以下内容

//一对多 根据uid查询用户及其关联的订单信息:第一种方法(嵌套查询)
public MyUser selectUserOrdersById1(Integer uid);
//一对多 根据uid查询用户及其关联的订单信息:第二种方法(连接查询)
public MyUser selectUserOrdersById2(Integer uid);
//一对多 根据uid查询用户及其关联的订单信息:第三种方法(使用POJO存储结果)
public List<SelectUserOrdersById> selectUserOrdersById3(Integer uid);

6.在com.controller包中创建OneToMoreController类,在该类中调用第5步的接口方法.
同时创建测试类,TestOneToMore
测试结果

DEBUG [main] - ==>  Preparing: select * from user where uid = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - ==>  Preparing: select * from orders where user_id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 2
MyUser [uid=1, uname=张三, usex=, ordersList=[Orders [id=1, ordersn=999999], Orders [id=2, ordersn=88888]]]
===================================
DEBUG [main] - ==>  Preparing: select u.*,o.id,o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 2
MyUser [uid=1, uname=张三, usex=, ordersList=[Orders [id=1, ordersn=999999], Orders [id=2, ordersn=88888]]]
===================================
DEBUG [main] - ==>  Preparing: select u.*,o.id,o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 2
[SelectUserOrdersById [uid=1, uname=张三, usex=, id=1, ordersn=999999], SelectUserOrdersById [uid=1, uname=张三, usex=, id=2, ordersn=88888]]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有两个表,一个是订单表(order),一个是订单详情表(order_item),一个订单可以对应多个订单详情,可以用 MyBatis一对多查询来实现。 首先需要创建两个实体类 Order 和 OrderItem,分别对应数据库的两个表。 Order 实体类: ```java public class Order { private Integer id; private String orderNo; private Date createTime; private List<OrderItem> orderItems; // getter,setter 略 } ``` OrderItem 实体类: ```java public class OrderItem { private Integer id; private Integer orderId; private String productName; private Integer productCount; // getter,setter 略 } ``` 然后在 OrderMapper.xml 中定义一对多查询的 SQL 语句: ```xml <select id="getOrderWithItems" resultMap="orderWithItems"> SELECT o.id, o.order_no, o.create_time, i.id AS item_id, i.order_id, i.product_name, i.product_count FROM `order` o LEFT JOIN order_item i ON o.id = i.order_id WHERE o.id = #{id} </select> <resultMap id="orderWithItems" type="Order"> <id property="id" column="id" /> <result property="orderNo" column="order_no" /> <result property="createTime" column="create_time" /> <collection property="orderItems" ofType="OrderItem" resultMap="orderItemResult" /> </resultMap> <resultMap id="orderItemResult" type="OrderItem"> <id property="id" column="item_id" /> <result property="orderId" column="order_id" /> <result property="productName" column="product_name" /> <result property="productCount" column="product_count" /> </resultMap> ``` 在上面的 SQL 语句中,使用了左连接来查询订单以及对应的订单详情,其中 o 表示订单表,i 表示订单详情表。通过在 Order 实体类中添加一个 List 类型的属性 orderItems,来保存一对多查询的结果。 最后,在 OrderMapper 接口中定义 getOrderWithItems 方法: ```java public interface OrderMapper { Order getOrderWithItems(Integer id); } ``` 通过调用 getOrderWithItems 方法,就能够得到一个订单以及它对应的多个订单详情的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值