Mybatis的多表关联查询以及延迟加载(LazyLoad)

 Mybatis既然封装了JDBC,那么它一定能做到Mysql中的连接查询。

一、Mysql的连接查询

 简单回顾一下Mysql的连接查询:分为两种,一种是内连接,内连接又分为等值连接,非等值连接,自连接;另外一种是外

 连接,外连接分为左连接(left join)和右连接(right join),两种连接都是表达多个表之间的关系。二者在代码上依靠是否

 有left或者right来进行区分。

 等值连接基本语句:

 SQL92语法:(优点是语法简单)

Select a.ename, d.dname from emp e, dept d where e.deptno = d.deptno;

SQL99语法:(优点是on后面还可以接where关键字,进行多重判断,逻辑清晰)

Select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;

很可惜以上两种表达,在Mybatis不会用到,因为后续开发中,在高并发的条件下我们为了降低数据库的压力,会使用延迟加

载设置,而延迟加载是建立在单表查询之上的。

二、Mybatis中的多表关联查询:

 

1、工程截图:

Mybatis的多表关联查询以及延迟加载(LazyLoad)_第1张图片

2、bean层:

一共有两个类,一个country国家,一个minister部长,关系是:一个国家有多个部长。

country类成员变量:使用SET集合,表示部长无序不重复

private Integer cid;
private String cname;
//一个国家多个部长,设置一个集合
private Set ministers;

minister类:

private String mname;
private Integer mid;

3 Mysql数据库:

提供Mysql代码:

drop table if EXISTS minister;
create table minister(
		mid INT(12) PRIMARY key auto_increment,
		mname VARCHAR(32),;
		countryId INT(12)
)
drop table if EXISTS country;
create table country(
	cid INT(12) PRIMARY KEY auto_increment,
	cname VARCHAR(32)
)

insert minister(mname,countryId) VALUES("aa",1);
insert minister(mname,countryId) VALUES("bb",1);
insert minister(mname,countryId) VALUES("cc",1);
insert minister(mname,countryId) VALUES("dd",3);
insert minister(mname,countryId) VALUES("ee",2);

insert country(cname) VALUES("USA");
insert country(cname) VALUES("England");
insert country(cname) VALUES("China");

4 Dao层

  ICountryDao.java:只有一个方法,注意方法名字要和mapper文件中的select的id相同(详情可见动态代理)

public interface ICountryDao {
   country selectCountryById(int cid);
}

  mapper.xml文件:





	
		
		
		
	
	

	

我们需要理解他的执行顺序逻辑:

首先:根据ICountry中的方法寻找到selectCountryById的标签,并执行他的sql语句,把返回来的数据封装为id为CountryMap的

resultMap标签。这里的sql语句只是对country进行了查询,获取表中cid和id参数相等的数据,和minister并没有关系。

然后:找到CountryMap标签,根据id和result进行封装。因为country中的minister是一个set集合,因此使用collection进行封装,

前面说了之前执行的sql语句并没有对minister表进行查询。

之后:chazha查找collection中的select对应id标签,进行判断的参数是collection中的column

三、Mybatis中延迟查询:(lazyload)

3.1 概述

在Mybatis中执行查询语句有两种加载情况

1 直接加载:直接执行select的sql语句

2 延迟加载:

首先需要清楚查询语句分为主查询和关联查询,在第二点中的代码中: