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

时间:2024-11-07 08:02:11

基于XML的多表联合查询可参考:/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注解,实现一对多的查询。

 

目录

 一、一对一关联

 二、一对多的关联

 三、多对多的关联


  一、一对一关联

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

 

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

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

package ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

public interface IEmployeeDao {
	/*fetchType=,如果是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="",fetchType=))})
  @Select("SELECT * FROM tb_emp WHERE empBirthDay between #{startTime} and #{endTime} ;")
    public List<Employee> selectEmpsByYears(HashMap<String,Object> argMap);
}

 

package ;

import ;
import ;
import ;
import ;
import ;

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

 单元测试:

//一对一,注解
	@Test
	//查询80后的员工有哪些
	void testSelectEmpsByYears() {
		HashMap<String,Object> argMap = new HashMap<String,Object>();
		("startTime","1980-01-01");
		("endTime","1990-00-00");
		List<Employee> emps = (argMap);
		for(Employee emp : emps) {
			(emp);
		}
	}

    

    关于在MyBatis中使用日志可参考:/qq_40348465/article/details/84396528                                                 

二、一对多的关联

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

  

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

 

 @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<Employee> getEmployeeByDeptId(int deptId);

 单元测试类

//一对多,注解
	@Test
	void testGetDeptById() {
		int deptId = 1;
		Department dept = (deptId);
		List<Employee> emps = ();
		for(Employee emp : emps) {
			(emp);
		}
	}

  

 三、多对多的关联

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

}

 

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

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

 

package ;

import ;
import ;
import ;
import ;
import ;
import ;

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="",fetchType=)),})
   @Select("SELECT * FROM tb_goods WHERE goodsId=#{goodsId};")
   public Goods getGoodsById(int goodsId);
}

  

package ;

import ;

import ;
import ;
import ;

import ;

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<Order> getAllOrderByGoodsId(int goodsId);
}

  单元测试:

 

//多对多
	@Test
	void testGetGoodsById() {
		int goodsId = 1;
		Goods goods = (goodsId);
		List<Order> orders = ();
		for(Order order : orders) {
			(order);
		}
	}

  测试结果: