mybatis初识
mybatis避免几乎所有的JDBC代码和手动设置参数以及获取结果集 :使用简单的XML / 注解 来配置和映射原生类型、接口 和 Java 的POJO为数据库中的记录。
- 数据库
- mybatis-config.xml:连接数据库+后续还要注册每一个mapper
- MybatisUtil:获取SqlSession对象
- 实体类
- UserDao接口
万能map
resultMap
日志工厂
STDOUT_LOGGING
标准日志输出
- mybatis-config.xml
在mybatis核心配置文件中,配置我们的日志
LOG4J
1、通过使用Log4j,控制日志信息输送到控制台、文件、GUI组件; 2、控制每一条日志的输出格式; 3、控制每一条日志的级别 —— 更细致的控制日志的生成过程; 4、通过配置文件来灵活配置,而不修改代码。
mybatis-config.xml
导入依赖
配置文件log4j.properties
简单使用
在要Log4j的类中,导入包org.apache.log4j.Logger
生成日志对象
static Logger logger = Logger.getLogger(UserDaoTest.class);
日志级别
日志的输出
分页
Limit分页
RowBound分页
面向对象
接口
mapper.xml
测试
分页插件PageHelper
mybatis:面向注解开发
面向接口开发
接口
配置文件
测试
本质:反射机制实现
底层:动态代理
源码debug分析
使用注解CRUD
可以在工具类创建时 实现自动提交事务
编写接口,增加注解
注意:@Param()注解
- 基本类型的参数 / String类型,需要加上; 引用类型不必加入
测试类
注意:我们必须将接口注册到我们的核心配置文件中
映射器mappers
方式一:推荐使用
方式二:使用class文件绑定注册
- 接口和他的mapper配置文件必须同名
- 接口和他的mapper配置文件必须放在同一个包下
方式三:使用扫描包进行注入绑定
Lombok插件
复杂查询环境搭建:多对一
关联:对学生而言,多个学生关联一个老师
集合:对老师而言,一个老师集合很多学生JavaType:用来指定实体类中属性的类型
ofType:用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
Student、Teacher实体类
建立Mapper接口
建立 Mapper.xml 文件
改造后,teacher不为null:
在核心配置文件mybatis-spring.xml绑定我们的mapper接口 / 文件
测试查询是否成功
方式一:按照嵌套查询
- 类似 子查询
方式二:按照结果嵌套查询
- 类似 联表查询
复杂查询环境搭建:一对多
一个老师拥有多个学生
- 实体类
- 接口
方式一:按结果嵌套处理
TeacherMapper.xml
null:
按结果嵌套查询
测试
方式二:按查询嵌套处理
- TeacherMapper.xml
动态SQL
- 根据不同的条件生成不同的SQL语句:所谓的动态SQL,本质还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码
环境搭建
if语句
实现SQL的复用,避免重载
xml
测试
常用标签
trim(where,set)
where
- trim
- trim
set
- trim
choose
Foreach
SQL片段:将一些功能的部分抽出来,方便复用
使用SQL标签抽取公共部分
在需要的地方使用Include标签引用即可
- 注意事项
- 最好基于单表来定义 SQL片段
- 不要存在where标签
- 动态SQL的应用场景:对一个集合进行遍历,通常是在构建IN条件语句的时候
缓存
简介
- 放在内存中,减少和数据库交互的次数,解决了高并发的性能问题
一级缓存:本地会话缓存
缓存失效的情况
- 查询不同的东西
- 增删改的操作,可能会改变原来的数据,所以必须刷新缓存
- 查询不同的mapper.xml —— 二级缓存
- 手动清理缓存
- 一级缓存默认开启,只在一次sqlSession中有效,也就是拿到连接到关闭这个区间段。一级缓存:一个map
二级缓存:全局缓存
工作机制
- 一个会话查询一条数据,这个数据会被放在当前会话的一级缓存中
- 如果当前会话关闭了,这个会话对应的一级缓存就没了;但我们想要:会话关闭了,一级缓存中的数据被保存到二级缓存中
- 新的会话查询信息,就可以从二级缓存中获取内容
- 不同的mapper查出的数据会放在自己对应的缓存map中
步骤
开启全局缓存
- cacheEnabled:全局地开启 / 关闭配置文件中的 所有映射器已经配置的任何缓存 (默认:true)
在要使用二级缓存的mapper中开启
也可以自定义参数
- flushInterval
- size
- readOnly
- 提示:二级缓存是事务性的,这意味着:当sqlSession完成并提交时,或是完成并回滚,但没有执行flushCache=true的insert/update/delete语句时,缓存会获得更新。
测试
- 问题:我们需要将实体类 序列化,否则可能报错
- 问题:我们需要将实体类 序列化,否则可能报错
小结
- 只要开启了二级缓存,在同一个mapper下就有效
- 所有的数据都会先放在一级缓存中
- 只有当会话提交 / 关闭的时候,才会提交到二级缓存中
mybatis缓存原理
- 原理
- 调优使用
自定义缓存 Ehcache
- ehcache.xml
- UserMapper.xml:指定我们的ehcache实现