MyBatis高级查询
一:MyBatis关联查询【联合查询、多个表之间的查询】一个对象含有另一个对应引用时候会用到关联查询
1、联合查询【多表联合查询】
*map配置文件
*测试代码
*打印信息
2、构造查询【联合查询的一个变种,就是当我们为对象当中的引用来赋值的时候采用构造函数的一种形式】
*map配置文件,这里的也是采用resultMap配置属性和列名,不同的是association标记中不是直接配的id和result,而是配置constructor标记,具体如下:
*在作者pojo类中配置所需的构造函数,注意mybatis往往会用系统默认的构造函数构建对象,所有配置自己的构造函数的同时还需要配置类的原始构造函数
*测试方法,和上一个联合查询的方法一样,因为map配置文件中select标记的id没变,还是selectAuthorJoin
*打印信息正常,和上边一样,就不写了。
3、子查询【联合查询都可以用子查询来代替,往往都说子查询效率不高,其实它有一些特殊机制,例如:懒加载机制】
(1)子查询形式的关联,例如:select * from author where userID in(select * from user)
(2)如何通过userID构建User对象,mybatis解决这个问题方案是:建立一个普通的select查询(子查询语句)如下:
select * from user这个查询已经在UserMapper.xml中建立了,如下图:
(3)建立完子查询后再建立主查询,主查询会应用到一个resultMap,这个resultMap不同的是association当中是没有主体的,只有一个select属性,这个select属性指引的是子查询中的id,也就是上图中的id=”findById”具体写法如下图:
map配置文件:
(4)测试代码【现在使用的mybatis是持久层框架,持久层框架有种机制叫懒加载机制,就是说需要的时候我就去查询,不需要就不查询】
*懒加载机制设置:懒加载默认是不开启的,开启是在基本配置文件中添加setting标记,懒加载加载在别名之前,具体如下:
*具体测试代码如下
懒加载机制说明:如下图所示,一开始执行的select * from author语句,在就执行懒加载应用了,第二条sql语句并没有执行,第二条sql语句执行是在用到User时调用list2.getUser().getUsername()后才执行的,所以打印用户名是在懒加载应用后面执行select * from user where id=?这条sql语句,所以设置懒加载后两条sql语句的执行点就不同了,如何没有懒加载两条sql语句是一起执行的。
二:集合查询:一个对象含有另一个对象的引用集合
(1)为了学习集合查询,数据库首先建立一个访问记录表visit,visit表用于保存用户的登录信息,字段visitID、userID、visitDate(登录时间)、visitIP(登录ip),具体如下
(2)修改pojo类,添加Visit类,添加get、set方法,并在User中加入visitList属性
(3)向数据库visit表中插入数据,因为visit表中存在userID,所以当插入visit数据前,需要先插入用户具体如下:
VisitMapper.xml配置:
测试代码:
(4)集合查询用到collection标记,这个标记是在resultMap定义的,它有property、column、ofType属性,在UserMapper.xml中添加resultMap和select标记。
(5)集合查询测试代码
(6)打印信息