MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)

基于XML的多表联合查询可参考:https://blog.csdn.net/qq_40348465/article/details/84677890

   简单介绍所用的一些注解:

(1)@Results的基本用法。当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来。column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。

(2)@ResultMap的用法。当这段@Results代码需要在多个方法用到时,为了提高代码复用性,我们可以为这个@Results注解设置id,然后使用@ResultMap注解来复用这段代码。
 (3)@One的用法。当我们需要通过查询到的一个字段值作为参数,去执行另外一个方法来查询关联的内容,而且两者是一对一关系时,可以使用@One注解来便捷的实现。比如当我们需要查询学生信息以及其所属班级信息时,需要以查询到的class_id为参数,来执行ClassesMapper中的selectById方法,从而获得学生所属的班级信息。

(4)@Many的用法。与@One类似,只不过如果使用@One查询到的结果是多行,会抛出TooManyResultException异常,这种时候应该使用的是@Many注解,实现一对多的查询。

 

目录

 一、一对一关联

 二、一对多的关联

 三、多对多的关联


  一、一对一关联

MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)_第1张图片

Employee.java

public class Employee implements Serializable{
	private int empId;
	private String empName;
    private Date empBirthDay;
	private String empSex;
	private Department dept;
    
    //Getters and Setters
    //consructor
 
 
}

 Department.java

public class Department {
	private int deptId;
	private String deptName;
	private List emps;
 
   //...
}

例:查询80后的员工有哪些

IEmployeeDao.java

package com.mybatisstudy.dao;

import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import org.apache.ibatis.annotations.One;
import com.mybatisstudy.model.Employee;

public interface IEmployeeDao {
	/*fetchType=FetchType.EAGER,如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中,如果是LAZY那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)。
	但是,在session外,就不能再取了。用EAGER时,因为在内存里,所以在session外也可以取。*/	
 @Results({@Result(column="empId",property="empId",id=true),//id=true,表示为主键
		@Result(column="empName",property="empName"),
		@Result(column="empBirthDay",property="empBirthDay"),
		@Result(column="empSex",property="empSex"),
	@Result(column="deptId",property="dept",one=@One(select="com.mybatisstudy.dao.IDepartmentDao.selectDeptById",fetchType=FetchType.EAGER))})
  @Select("SELECT * FROM tb_emp WHERE empBirthDay between #{startTime} and #{endTime} ;")
    public List selectEmpsByYears(HashMap argMap);
}

  IDepartmentDao.java

package com.mybatisstudy.dao;

import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.mybatisstudy.model.Department;

public interface IDepartmentDao {
 
  @Results({@Result(column="deptId",property="deptId",id=true),
	       @Result(column="deptName",property="deptName")})
  @Select(" SELECT * FROM tb_dept d WHERE d.deptId=#{deptId};")
  public Department selectDeptById(int deptId);
 
}

 单元测试:

//一对一,注解
	@Test
	//查询80后的员工有哪些
	void testSelectEmpsByYears() {
		HashMap argMap = new HashMap();
		argMap.put("startTime","1980-01-01");
		argMap.put("endTime","1990-00-00");
		List emps = employeeDao.selectEmpsByYears(argMap);
		for(Employee emp : emps) {
			System.out.println(emp);
		}
	}

    MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)_第2张图片

    关于在MyBatis中使用日志可参考:https://blog.csdn.net/qq_40348465/article/details/84396528                                                 

二、一对多的关联

   例:根据部门Id查询某一个部门的所有员工。

   IDepartmentDao.java

 //一对多
  @Results({@Result(id=true,column="deptId",property="deptId"),
	        @Result(column="deptName",property="deptName"),
	        @Result(column="deptId",property="emps",many=@Many(select="com.mybatisstudy.dao.IEmployeeDao.getEmployeeByDeptId",fetchType=FetchType.LAZY))})
  @Select("SELECT * FROM tb_dept WHERE deptId=#{deptId};")
  public Department getDeptById(int deptId);

 IDepartmentDao.java

 @Results({@Result(id=true,column="empId",property="empId"),
    	      @Result(column="empName",property="empName"),
    	      @Result(column="empBirthDay",property="empBirthDay"),
    	      @Result(column="empSex",property="empSex")})
    @Select("SELECT * FROM tb_emp  WHERE deptId=#{deptId};")
    public List getEmployeeByDeptId(int deptId);

 单元测试类

//一对多,注解
	@Test
	void testGetDeptById() {
		int deptId = 1;
		Department dept = departmentDao.getDeptById(deptId);
		List emps = dept.getEmps();
		for(Employee emp : emps) {
			System.out.println(emp);
		}
	}

  MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)_第3张图片

 三、多对多的关联

MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)_第4张图片

Goods.java

public class Goods {
	private int goodsId;
	private String name;
	private double price;
	private List orders;
    
    //getters and setters
    //constructor

}

 Order.java

public class Order {
	private int orderId;
	private double total;
	private Date orderDate;
	private List goodsList;
    
    //...
}

  例:根据商品Id查找所有相关的订单

  IGoodsDao.java

package com.mybatisstudy.dao;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import org.apache.ibatis.annotations.Many;
import com.mybatisstudy.model.Goods;

public interface IGoodsDao {
   //根据goodsId得到商品
   @Results({@Result(id=true,column="goodsId",property="goodsId"),
	   @Result(column="name",property="name"),
	   @Result(column="price",property="price"),
	   @Result(column="goodsId",property="orders",many=@Many(select="com.mybatisstudy.dao.IOrderDao.getAllOrderByGoodsId",fetchType=FetchType.LAZY)),})
   @Select("SELECT * FROM tb_goods WHERE goodsId=#{goodsId};")
   public Goods getGoodsById(int goodsId);
}

  IOrderDao.java

package com.mybatisstudy.dao;

import java.util.List;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.mybatisstudy.model.Order;

public interface IOrderDao {
   //根据商品的id,去查找所有相关的订单
   @Results({@Result(id=true,column="orderId",property="orderId"),
	   @Result(column="total",property="total"),
	   @Result(column="orderDate",property="orderDate")})
   @Select("SELECT * FROM tb_order WHERE orderId in(SELECT orderId FROM tb_goods_order WHERE goodsId=#{goodsId})")
   public List getAllOrderByGoodsId(int goodsId);
}

  单元测试:

 

//多对多
	@Test
	void testGetGoodsById() {
		int goodsId = 1;
		Goods goods = goodsDao.getGoodsById(goodsId);
		List orders = goods.getOrders();
		for(Order order : orders) {
			System.out.println(order);
		}
	}

  测试结果:

 MyBatis学习总结(十)---基于注解的多表查询(一对一,一对多,多对多)_第5张图片

你可能感兴趣的:(ORM框架之MyBatis)