基于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);
}
}
测试结果: