Mybatis介绍 (三) 查询.调用存储过程与缓存

一.使用MyBatis查询
1.一对一关联
(1).提出需求
根据班级id查询班级信息(带老师的信息)
(2).创建表和数据
Mybatis介绍 (三) 查询.调用存储过程与缓存
(3).定义实体类
Classes类 Classes类是class表对应的实体类(班级表)
Mybatis介绍 (三) 查询.调用存储过程与缓存
Teacher类,Teacher类是teacher表对应的实体类(老师表)
Mybatis介绍 (三) 查询.调用存储过程与缓存
(4).、定义sql映射文件classMapper.xml
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
Mybatis介绍 (三) 查询.调用存储过程与缓存
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
Mybatis介绍 (三) 查询.调用存储过程与缓存
(5).在conf.xml文件中注册classMapper.xml
Mybatis介绍 (三) 查询.调用存储过程与缓存
(6).编写测试类
方式一:
Mybatis介绍 (三) 查询.调用存储过程与缓存
方式二:
Mybatis介绍 (三) 查询.调用存储过程与缓存
2.一对多关联
(1).提出需求
根据classId查询对应的班级信息,包括学生,老师
(2).创建表和数据
Mybatis介绍 (三) 查询.调用存储过程与缓存
(3).定义实体类
在上面的一对一关联查询演示中,我们已经创建了班级表和教师表,因此这里再创建一张学生表
Student类,Student类是student表对应的实体类(老师表)
Mybatis介绍 (三) 查询.调用存储过程与缓存
修改Classes类,添加一个List students属性,使用一个List集合属性表示班级拥有的学生,如下:
Mybatis介绍 (三) 查询.调用存储过程与缓存
(4).、修改sql映射文件classMapper.xml
方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
SELECT * FROM class c, teacher t,student s WHERE
c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
Mybatis介绍 (三) 查询.调用存储过程与缓存
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
SELECT * FROM student WHERE class_id=1 //1是第一个查询得到的c_id字段的值
Mybatis介绍 (三) 查询.调用存储过程与缓存
(6).编写测试类
方式一:
Mybatis介绍 (三) 查询.调用存储过程与缓存
方式二:
Mybatis介绍 (三) 查询.调用存储过程与缓存
重点:
**1.MyBatis中使用association标签来解决一对一的关联查询
association标签可用的属性如下:
(1) property:对象属性的名称
(2) javaType:对象属性的类型
(3) column:所对应的外键字段名称
(4) select:使用另一个查询封装的结果
2.yBatis中使用collection标签来解决一对多的关联查询
collection标签可用的属性如下:
(1) property:对象属性的名称
(2) ofType属性指定集合中元素的对象类型
(3) column:所对应的外键字段名称
(4) select:使用另一个查询封装的结果**
二.调用存储过程
1.提出需求:
查询得到男性或女性的数量, 如果传入的是0就女性否则是男性
2.准备数据库表和存储过程
创建数据库表和数据
Mybatis介绍 (三) 查询.调用存储过程与缓存
创建存储过程(查询得到男性或女性的数量, 如果传入的是0就女性否则是男性)
Mybatis介绍 (三) 查询.调用存储过程与缓存
调用存储过程(查询结果为2)
Mybatis介绍 (三) 查询.调用存储过程与缓存
3.编辑userMapper.xml
Mybatis介绍 (三) 查询.调用存储过程与缓存
4.在conf.xml文件中注册UserMapper.xml
Mybatis介绍 (三) 查询.调用存储过程与缓存
5.编写测试类
测试调用存储过程
Mybatis介绍 (三) 查询.调用存储过程与缓存
得到结果为2
**重点:
1.其中DELIMITER 定好结束符为”$$”, 然后最后又定义为”;”, MYSQL的默认结束符为”;”. 默认情况下,delimiter是分号;
2.调用存储过程 delimiter定义结束符为”;” SET赋初始值, 使用CALL调用 ,SELECT作用是输出**
三.Mybatis缓存
1.介绍:
(1) 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
(2) 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
(3) 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
2.Mybatis一级缓存测试
Mybatis介绍 (三) 查询.调用存储过程与缓存
注意如下:
Mybatis介绍 (三) 查询.调用存储过程与缓存
3.Mybatis二级缓存测试
(1) 开启二级缓存,在userMapper.xml文件中添加如下配置如下:


(2) 测试二级缓存
Mybatis介绍 (三) 查询.调用存储过程与缓存
**重点:
1.使用一级缓存注意的点
(1).必须是同一个Session,如果session对象已经close()过了就不可能用了
(2).查询条件是一样的
(3).没有执行过session.clearCache()清理缓存
(4).没有执行过增删改的操作(这些操作都会清理缓存)
2.使用一级缓存的点
(1). 映射语句文件中的所有select语句将会被缓存。
(2). 映射语句文件中的所有insert,update和delete语句会刷新缓存。
(3).缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
(4). 缓存会根据指定的时间间隔来刷新。
3.cache标签常用属性:
eviction=”FIFO” 回收策略为先进先出
flushInterval=”60000” 自动刷新时间60s
size=”512” 最多缓存512个引用对象
readOnly=”true 只读**