基于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注解,实现一对多的查询。
目录
一、一对一关联
二、一对多的关联
三、多对多的关联
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中使用日志可参考: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);
}
}
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);
}
}
测试结果: