mysql缓存:根据sql语句进入缓存,如果sql语句多加一个空格就进入不到同一个缓存,另外数据库数据发生了更新,缓存中的数据不会同步。
延迟加载:先查询基本信息,再查询其他信息(相亲网站),而不是一次就查询出来。
mybatis的框架概述
数据库厂商都会有自己的驱动包,上面一层对jdbc进行接口规范(
对jdbc进行封装),再上一层mybatis框架
MyBatis是一个优秀的基于Java的持久层框架,内部对JDBC做了封装,
使开发者只需要关注SQL语句,而不用关注JDBC的代码,使开发变得更加的简单。(
由之前的7个步骤变成了mapper接口和一个sqlmapconfig.xml文件)
MyBatis通过XML或者注解的方式将要执行的各种Statement对象配置,通过Java对象和statement中SQL的动态参数进行映射,并最终执行SQL语句。执行SQL后,最终将结果以Java对象返回。
采用了ORM的思想。
o:javabean对象
r:表的结构
m:映射mapping(xml文件)
mybatis入门程序
- mapper namespace="com.qcbyjy.mapper.UserMapper",叫名称空间,表明以后查找UserMapper接口中的findAll的方法。
- select id="findAll"中的id属性编写的UserMapper接口中的方法的名称,固定的。
- resultType="com.qcbyjy.domain.User"表明的是findAll方法的返回值类型。
mybatis的核心文件:sqlmapconfig.xml文件
environments:配置环境们,设置默认值
environment:设置数据库环境
transactionManager:设置事务
dataSource:配置连接池,
<mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers>
测试类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
创建sql会话,通过绘画创建sqlsession对象
不创建代理对象,直接使用会话
代理Dao方式的增删改查
- #{}和${}的区别:
相当于pret的statement和普通的statement,一个防止sql注入一个不防止
#{}是一个占位符,会自动加上%,'%${value}%'不能修改,固定写法。
#将传入的数据都当成是一个字符串,会对传入的数据加一个双引号
排序使用order by动态参数时使用$不使用#
拿到新增那条数据的主键
MyBatis参数详解
放在xml文件数据库上面
sqlmapconfig文件
mybatis的连接池
- 什么是连接池:存储连接的容器
- 解决了什么问题:若果没有连接池,每次执行sql语句都会创建连接,浪费时间、影响程序性能。
- mybatis连接池的分类:datasource标签中的type属性由3个取值
POOLED----使用连接池,UNPOOLED-----不是使用连接池,JNDI------使用JNDI实现连接池
缓存的概念
1.在内存中临时存储数据,速度快,可以减少数据库的访问次数
2.经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中
3jdbc缓存存储的是sql语句
mybatis的一级缓存
- MyBatis的一级缓存也是SqlSession的缓存。
- 查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。
- Executor类用来连接数据库。
- 一级缓存底层使用的是Map集合,key存储的是执行的SQL语句,value存放的是查询的对象,对象是单例的。
总结:当只创建了一个sqlseesion时执行两条相同的SQL语句时,SQL语句只执行了一次,第二次的SQL语句是从缓存中获取的
- 实体类要实现序列化接口,因为数据存放在缓存中是打乱字符的,要实现序列化接口才能原封不动的封装回来
- 如果没有事务,一级缓存是没有意义的,每次查询之后,都要进行sqlsession的关闭,数据会被清空
- 一级缓存关闭后,数据会被写入二级缓存
一级缓存失效的情况
sqlsession不同
设置了两个sqlsession
sqlsession相同,查询语句不同
sqlsession相同,两次相同的查询语句之间执行了update、insert、delete、commit和close的操作
sqlSession相同,手动清除一级缓存
session.clearCache();
二级缓存
二级缓存是SqlSessionFactory级别,是指dao层(持久层);
常用于用户对查询结果实时性要求不高
二级缓存的开启
在核心配置文件中,设置全局属性cacheEnable="true",sqlmapconfig文件
在映射文件中设置,xxxmapper.xml文件
实体类必须实现序列化接口,序列化是为了缓存数据
二级缓存必须在SQL session(一级缓存)关闭或提交之后有效
二级缓存失效情况
两次查询之间执行了增删改操作
每个mapper都有自己的二级缓存区(namespace),如果mapper相同那么他们使用的是同一个二级缓存区。
二级缓存存储的不是对象是数据本身,一级缓存存储的是对象,二级缓存是工厂级别
Catch参数的具体细节
eviction(收回策略)
- LRU(最近最少使用的):移除最长时间不被使用的对象,这是默认值。
- FIFO(先进先出):按对象进入缓存的顺序来移除它们。
- SOFT(软引用):移除基于垃圾回收器状态和软引用规则的对象。
- WEAK(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushinterval(刷新间隔)
可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。
- 默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新。
size(引用数目)
- 可以被设置为任意正整数,要记住缓存的对象数目和运行环境的可用内存资源数目。默认值是1024 。
readOnly(只读)
属性可以被设置为 true / false。
Mybatis缓存查询顺序
- 先查询二级缓存,因为二级缓存中可能会有其他程序查询出来的数据,可以直接拿来使用
- 如果二级缓存命中,再查询一级缓存
- 如果一级缓存也没有命中,则查询数据库
- SqlSession关闭之后,一级缓存的数据会写入二级缓存