Bootstrap

掌握MyBatis:从入门到精通的全方位指南

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入门程序

  1. mapper namespace="com.qcbyjy.mapper.UserMapper",叫名称空间,表明以后查找UserMapper接口中的findAll的方法。
  2. select id="findAll"中的id属性编写的UserMapper接口中的方法的名称,固定的。
  3. 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的一级缓存

  1. MyBatis的一级缓存也是SqlSession的缓存。
  2. 查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库。
  1. Executor类用来连接数据库。
  2. 一级缓存底层使用的是Map集合,key存储的是执行的SQL语句,value存放的是查询的对象,对象是单例的。
总结:当只创建了一个sqlseesion时执行两条相同的SQL语句时,SQL语句只执行了一次,第二次的SQL语句是从缓存中获取的
  1. 实体类要实现序列化接口,因为数据存放在缓存中是打乱字符的,要实现序列化接口才能原封不动的封装回来
  2. 如果没有事务,一级缓存是没有意义的,每次查询之后,都要进行sqlsession的关闭,数据会被清空
  3. 一级缓存关闭后,数据会被写入二级缓存

一级缓存失效的情况

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关闭之后,一级缓存的数据会写入二级缓存
;