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方法的返回值类型。
代理Dao方式的增删改查
- #{}和${}的区别:
MyBatis参数详解
放在xml文件数据库上面sqlmapconfig文件
mybatis的连接池
- 什么是连接池:存储连接的容器
- 解决了什么问题:若果没有连接池,每次执行sql语句都会创建连接,浪费时间、影响程序性能。
- mybatis连接池的分类:datasource标签中的type属性由3个取值
缓存的概念
1.在内存中临时存储数据,速度快,可以减少数据库的访问次数 2.经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中 3jdbc缓存存储的是sql语句mybatis的一级缓存
- MyBatis的一级缓存也是SqlSession的缓存。
- 查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。
- Executor类用来连接数据库。
- 一级缓存底层使用的是Map集合,key存储的是执行的SQL语句,value存放的是查询的对象,对象是单例的。
- 实体类要实现序列化接口,因为数据存放在缓存中是打乱字符的,要实现序列化接口才能原封不动的封装回来
- 如果没有事务,一级缓存是没有意义的,每次查询之后,都要进行sqlsession的关闭,数据会被清空
- 一级缓存关闭后,数据会被写入二级缓存
一级缓存失效的情况
sqlsession不同
设置了两个sqlsessionsqlsession相同,查询语句不同
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(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象。
- 默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新。
- 可以被设置为任意正整数,要记住缓存的对象数目和运行环境的可用内存资源数目。默认值是1024 。
Mybatis缓存查询顺序
- 先查询二级缓存,因为二级缓存中可能会有其他程序查询出来的数据,可以直接拿来使用
- 如果二级缓存命中,再查询一级缓存
- 如果一级缓存也没有命中,则查询数据库
- SqlSession关闭之后,一级缓存的数据会写入二级缓存