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]]
发布了3 篇原创文章 · 获赞 0 · 访问量 117

猜你喜欢

转载自blog.csdn.net/Aristochi/article/details/103933963