Mybatis既然封装了JDBC,那么它一定能做到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不会用到,因为后续开发中,在高并发的条件下我们为了降低数据库的压力,会使用延迟加
载设置,而延迟加载是建立在单表查询之上的。
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
3.1 概述
在Mybatis中执行查询语句有两种加载情况
1 直接加载:直接执行select的sql语句
2 延迟加载:
首先需要清楚查询语句分为主查询和关联查询,在第二点中的代码中:
延迟查询分为:分为深度延迟和侵入式延迟.下面分别介绍
3.2 深度延迟
关联查询不会直接进行,只有当你使用了管理查询对应的数据时,才会执行对应关联插叙的sql语句.
代码:只需要在myBatis.xml文件中进行setting配置:
测试1:我们在35\36行处添加断点.getcname是主查询的操作,getminister是关联查询的操作
可以看见,程序执行完34行,在控制台日志中,只执行了一个sql语句,也就是主查询的sql语句,关联查询没有执行.
测试2:
可以看见,当我们执行到关联查询的操作getminister后,控制台出现了第二句sql语句,这就是延迟加载.
3. 3 侵入式延迟
侵入式就是关联查询的详情侵入到了主查询的详情中,他会在调用主查询相关操作的时候,执行关联查询语句.
代码;注意必须要先把开关打开,这是前提条件。
测试1:
可以看到,它只进行了主查询语句.
测试二:
他在调用主查询相关操作的时候,才执行了关联查询语句.
---以上
下面的空白去不掉,逼死强迫症...................