分页
目的:减少数据的处理量
方式一:使用limit实现分页,核心SQL
sql语法:select * from user limit startIndex,pageSize;
步骤:
1、接口
2、Mapper.xml
3、测试
方式二:使用注解开发
1、注解在接口上实现
Mybatis详细的执行流程
方法存在多个参数,所有的参数前面必须加上@Param(“id”)注解
- 基本类型的参数或String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略,但是建议大家都加上
- 我们在SQL中引用的就是我们这里的@Param(“id”)中设定的属性名
可以在工具类(utils)创建的时候实现自动提交事务
Lombok
偷懒省事!
1、在IDEA中安装Lombok插件(后来版本自带)
2、在项目中导入lombok的jar包
3、在实体类上加注解即可!
@Data:无参构造、get、set、toString、hashcode、equals
@AllArgsConstructor:有参构造
@NoArgsConstructor:无参构造
多对一处理
多个学生,对应一个老师
对于学生而言【多对一】:关联
对于老师而言【一对多】:集合
测试环境搭建
1、导入lombok
2、新建实体类Teacher、Student
3、建立Mapper接口
4、建立Mapper.xml文件
5、在核心配置文件中绑定注册我们的Mapper接口或者文件(多种方法)
6、测试查询是否能够成功
按照结果嵌套处理(联表查询)
按照查询嵌套处理(子查询)
一对多处理
对于老师而言,就是一对多的关系
按照结果嵌套处理
按照查询嵌套处理
小结
1、关联-association【多对一】
2、集合-collection【一对多】
3、javaType & ofType
①javaType用来指定实体类中属性的类型
②ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
动态SQL
- 根据不同的条件生成不同的SQL语句
- 所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL的层面,去执行一个逻辑代码
- 动态SQL就是在拼接SQL语句
创建一个基础工程
1、导包
2、编写配置文件
3、编写实体类
4、编写实体类对应Mapper接口和Mapper.xml文件
if
choose(when,otherwise)
trim(where,set)
foreach
SQL片段
有的时候,我们可能会将一些功能的部分抽取出来,方便复用!
1、使用SQL标签抽取公共的部分
2、在需要使用的地方使用Include标签引用即可
缓存
一级缓存
- 一级缓存也叫本地缓存:SqlSession级别
- 与数据库同一次会话期间查询到的数据会放在本地缓存中
- 以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库
缓存失效的情况:
1、查询不同的东西
2、增删改操作,可能会改变与原来的数据,所以必定会刷新缓存!
3、查询不同的Mapper.xml
4、手动清理缓存!sqlSession.clearCache();
小结:一级缓存是默认开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!
二级缓存
步骤:
1、开启全局缓存
2、在要使用二级缓存的Mapper中开启,也可以自定义参数
3、测试
遇到的问题:需要将实体类序列化,不然会报错!
小结:
- 只要开启了二级缓存,在同一个Mapper下就有效
- 所有数据都会先放在一级缓存中
- 只有当会话提交,或者关闭的时候,才会提交到二级缓存中!
缓存原理
缓存顺序:
1、先看二级缓存中有没有
2、再看一级缓存中有没有
3、都没有再查询数据库
自定义缓存(ehcache)
是一种开源Java分布式缓存
步骤:
1、导包
2、在mapper中指定用ehcache缓存
3、ehcache.xml