resultMap对象集合级联关系 { 一对多 }(三)

数据库两张表 :

Employee  员工表

Dept  部门表

   -- emp员工表中存储的是 员工的信息
   -- dept部门表中存储的是 部门的信息 
   -- 员工表和部门表中的共有属性是:部门编号,部门编号是一样的

 

需求:通过部门编号查询部门,并查询该部门所有的员工

 

实体类

Dept 部门

/***
 *	部门实体类 
 */
public class Dept {

  private Integer did; //部门id
  private String dname;	//部门名称	
	
  /*
   * 一个员工对应一个部门,这是一对一关系。
   * 那么一个部门对应多个员工,这是一对多关系。
   * 
   * 定义一个集合,存储这个部门中的所有员工
   */
   private ArrayList<Employee> list;
	
   //......省略set/get/toString 方法
}

ps:部门实体类中存在一个List集合,存放该部门所有的员工,这是一对多关系

 

Employee 员工

package com.mybatis.bean;

/**
 * 	员工类实体
 */
public class Employee {

  //实体类字段建议和数据库字段名一致
  private Integer id; 		 //员工id
  private String name;		 //员工姓名
  private String sex;			 //性别
  private Integer money;		 //工资
	
  //部门实体类 成员变量
  private Dept dept; 
	
  //.....省略set get toString方法
}

 

持久层

/**
 * Employee 的持久层接口
 */
public interface EmployeeMapper {	

  //根据部门查询所有的员工
  public abstract ArrayList<Employee> findEmpByDeptId(Integer id);
}
/**
 * 操作部门的DAO接口
 */
public interface DeptMapper {

  //根据部门id查询部门,  以及部门下的所有员工
  public abstract Dept findDeptEmpByid(Integer id);
		
  /* 分步查询:
   * 1.根据部门id查询部门信息, 在通过部门id查询员工表的员工
   */
  public abstract Dept findDeptEmpByIdStep(Integer id);
}

 

SQL映射文件

 

<!-- 操作Employee表的SQL映射文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.EmployeeMapper"> <!--命名空间绑定持久层 -->

  <!-- 通过部门id查询员工表 -->
  <select id="findEmpByDeptId" resultType="com.mybatis.bean.Employee">
	SELECT * FROM employee  WHERE dept_id = #{id}
  </select> 
</mapper> 
 
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dao.DeptMapper">
  <!--  该xml是 操作Dept部门表的 SQL映射文件 -->

    
        <!--  第一种方式:(两张表一起查询)  利用collection封装集合结果集  -->
  <!-- 根据部门id查询部门以及员工的结果集 封装规则 -->
  <resultMap type="com.mybatis.bean.Dept" id="deptOfEmps">
   <id column="dept_id" property="did"/>  <!--主键字段封装 -->
		
   <!-- 普通字段封装 -->
   <result column="dept_name" property="dname" />
		
   <!-- collection标签,定义关联集合类型的封装规则
         property: 指定关联的集合 (dept对象的list属性)
         ofType: 指定集合存放的元素类型,指定员工类型
   -->
   <collection property="list" ofType="com.mybatis.bean.Employee">
	<!-- 定义集合中的元素封装规则 (Employee 封装规则)  -->
	<id column="emp_id" property="id" />  <!-- 定义主键字段封装规则 -->
			
	<!-- 普通字段封装规则 -->
	<result column="emp_name"  property="name" />
	<result column="emp_money" property="money"/>
	<result column="emp_sex"   property="sex"/>
   </collection>		
 </resultMap>

  <!-- 根据部门id查询  该部门信息以及部门所有员工信息
	public abstract Dept findDeptEmpByid(Integer id);  -->
  <select id="findDeptEmpByid" resultMap="deptOfEmps">  <!-- 指定封装规则 -->
   SELECT  
	d.did dept_id, d.dname dept_name,e.id emp_id , e.name emp_name, e.money emp_money,e.sex emp_sex
   FROM 
	employee e JOIN dept d  ON e.dept_id = d.did 
   WHERE  
	e.dept_id = #{id}
  </select>
	
	
	
 <!-- 第二种方式
   分步查询:  根据部门id查询部门以及部门的所有员工 
 	1.先查询出部门信息   		(查询Dept部门表)
	2.在通过部门id查询员工表	 (Employee)
 	 将两次查询出来的结果封装成Dept对象
 -->
 <resultMap type="com.mybatis.bean.Dept" id="deptOfEmpsStep">
	<id column="did" property="did"/>
		
	<result column="dname" property="dname"/>	 
	 
 	<!-- collection 定义关联集合类型的封装规则 
 		property:指定关联属性
 		ofType:指定集合中存放元素类型	 			
         分步查询 :
          select:指定封装的结果集数据 是调用哪一个SQL映射文件方法得到的
          column:指定将结果集中的那一列传递给   (select指定的方法)
	 -->
	 <collection property="list" ofType="com.mybatis.bean.Employee" 
           select="com.mybatis.dao.EmployeeMapper.findEmpByDeptId" column="did">
	 </collection>
	 	<!-- 如果分步查询,需要传递多个参数,mybatis会将参数封装成map集合
	 		column={column1,column2}   -->
	 </resultMap>
	 
 <!-- 分步查询 -->
 <select id="findDeptEmpByIdStep" resultMap="deptOfEmpsStep">
	SELECT * FROM dept where did = #{id}
 </select>	
	
</mapper>

ps:将查询出来的员工对象封装到Dept对象中List集合,需要使用到collection标签

Main调用

public static void main(String[] args) throws IOException {
		
		
  String resource = "mybatis_config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		
  SqlSession session = sqlSessionFactory.openSession();
	
  EmployeeMapper empMmapper = session.getMapper(EmployeeMapper.class); //利用反射创建employee的持久层实现类
  DeptMapper deptMapper = session.getMapper(DeptMapper.class);		 //利用反射创建 Dapt的持久层实现类
					
  //----------------------分隔线------------------------------
		
  //根据部门id查询部门信息与部门的所有员工   ---->> 直接查询
  Dept dept2 = deptMapper.findDeptEmpByid(2);
  System.out.println(dept2.toString());
		
		
  //根据部门id查询部门信息与部门的所有员工  --->> 分步查询
  Dept dept3 = deptMapper.findDeptEmpByIdStep(2);
  System.out.println(dept3.toString());
}	

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis提供了一种简便的方式来实现一对多级联查询。在这种情况下,一个实体类中包含了多个子实体类的集合,这些子实体类与该实体类是一对多关系。 下面是一对多级联查询的示例: 1. 首先,我们创建以下两个实体类: Order.java ```java public class Order { private int id; private String code; private List<OrderItem> items; // 省略getter和setter方法 } ``` OrderItem.java ```java public class OrderItem { private int id; private int orderId; private String product; private int quantity; // 省略getter和setter方法 } ``` 2. 接下来,我们需要创建一个映射文件来进行一对多级联查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。 OrderMapper.xml ```xml <mapper namespace="com.example.OrderMapper"> <resultMap id="orderMap" type="com.example.Order"> <id property="id" column="id"/> <result property="code" column="code"/> <collection property="items" ofType="com.example.OrderItem"> <id property="id" column="item_id"/> <result property="product" column="product"/> <result property="quantity" column="quantity"/> </collection> </resultMap> <select id="getOrders" resultMap="orderMap"> SELECT o.id, o.code, i.id as item_id, i.product, i.quantity FROM orders o LEFT JOIN order_items i ON o.id = i.order_id ORDER BY o.id </select> </mapper> ``` 在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关联起来,并使用`ORDER BY`子句来按订单ID排序。 3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。 OrderMapper.java ```java public interface OrderMapper { List<Order> getOrders(); } ``` 现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示: ```java SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = factory.openSession(); OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orders = orderMapper.getOrders(); for (Order order : orders) { System.out.println(order.getCode()); for (OrderItem item : order.getItems()) { System.out.println("\t" + item.getProduct() + " x" + item.getQuantity()); } } ``` 这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值