mybatis
2023-05-02 08:00:50 0 举报
AI智能生成
ssm书籍知识点整理
作者其他创作
大纲/内容
简介
Mybatis的前身
前身是iBatis,本是Apache的一个开源的项目
相关网站
官网
https://blog.mybatis.org/
Github
https://github.com/mybatis/mybatis-3/releases
中文文档
https://mybatis.org/mybatis-3/zh/index.html
mybatis
maven仓库
基础概念
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
持久化对象(persisent Object,PO)
持久化
就是将程序的数据在持久化状态和瞬时状态转化的过程。
内存
断电即失
数据库
io文件持久化
为什么需要持久化
有一些对象,不能让他丢掉
内存太贵了
持久层
Dao层,Service层,Controller层
完成持久层工作的代码块
层界限十分明显。
为什么需要Mybatis?
方便
传统的JDBC代码太复杂
优势
持久层框架之一,ORM框架(Object/Relational Mapping,对象关系映射)
实体类和SQL语句之间建立映射关系
解决的问题
1)在持久化对象上执行基本的增、删、改、查操作
2)对持久化对象提供一种查询语言或者API
3)对象关系映射工具
4) 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
作用
解决面向对象与关系型数据库中数据类型不匹配的技术
扩展
Hibernate(全表映射的框架,属于ORM)
理论
自动生成SQL语句,并自动执行
缺点
它在多表关联时,对SQL查询的支持较差
更新数据时,需要发送所有字段
不支持存储过程
不可以通过优化SQL来优化性能
Mybatis(半自动化映射)
优势
可以配置动态SQL并优化SQL
可以通过配置决定SQL的映射规则
他还支持存储过程
Mybatis的操作流程
Resources获取加载全局配置文件
实例化SqlSessionFactoryBuilder构造器
解析配置文件流XML ConfigBuilder
Configuration所有的配置信息
SqlSessionFactory实例化
transactional事务管理
创建executor执行器
创建sqlSession
实现CRUD
查看是否执行
执行成功,提交事务
关闭
Mybatis核心对象
SqlSessionFactoryBuilder
用过即丢
方法
build(InputStream inputStream, String environment, Properties properties)
InputStream(字节流)
build(Reader reader, String environment, Properties properties)
Reader(字符流)
build(Configuration config)
Configuration(类)
读取XML文件构造方式:
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSessionFactory(会话工厂)
SqlSessionFactory是每个MyBatis应用的核心
作用
创建SqlSession实例
作用域
Application
生命周期与应用的生命周期相同
单例模式
存在于整个应用运行时,并且同时只存在一个对象实例
SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);
SqlSession(会话对象)
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
方法
实例直接运行映射的SQL语句
sqlSession.selectList()
sqlSession.selectOne()
基于Mapper接口方式操作数据
调用sqlSession.getMapper(Mapper.class)执行DAO接口方法来实现对数据的查询操作
作用域
一个request请求期间
汇总
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is) ;
SqlSession sqlSession = factory.openSession();
Mybatis的工作原理
mybatis-config.xml(获取连接)
→mapper.xml(配置SQL)
→sqlSessionFactory(构建工厂)
→SqlSession(构造会话对象)
→Executor(执行器:接口)
→MapperStatement
解释
Executor
动态的生成需要执行的SQL语句,同时负责查询缓存的维护
MapperStatement
该信息是对映射信息的封装
用于存储要映射的SQL语句和id、参数
MyBatis的功能架构(3)
API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
使用
mybatis的普通使用
导入jar包
<dependencies>
<!--Mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--Mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--Mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--Mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
1、根据数据库中表创建好实体类
1、变量
2、get/set方法
3、toString()方法
4、构造方法
注意
关联关系
一对一
建表
引入对方主键作为外键
建实体类
在有外键的实体的实体类中设置对象实例化
一对多
建表
在多的一方,设置外键
建实体类
. . . 对象实例化集合
多对多
建表
产生中间关系表,引入两张表的主键作为外键,两个主键称为联合主键或使用新的字作为主键。
建实体类
两边都需要建立实例化集合
建实体类需要注意了解他们表之间的关联关系
结构
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
configuration
properties
environments
environment
transactionManager
dataSource(配置数据库连接池用的)
property
mappers
mapper
typeAliases
结构一
typeAlias
结构二
package
默认头
2、书写mybatis的配置文件mybatis-config.xml,主要是配置数据库的连接,开启别名等
properties
通过外部指定的方式(database.properties),实现动态配置
直接配置为xml,实现动态配置
方法
一
<properties resource="database.properties"/> <dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
二
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
settings
作用
修改 MyBatis 在运行时的行为方式
例如:开启二级缓存、开启延迟加载
主要是MyBatis的一些全局配置属性的设置
name
CacheEnabled
对在此配置文件下的所有cache (缓存)进行全局性开/关设置
默认值为false
lazyLoadingEnabled
全局性设置懒加载。如果设为‘false’,则所有相关联的都会被延迟加载
特定关联关系可以通过配置fetchType属性来覆盖该项开关状态
默认值为false
autoMappingBehavior
MyBatis对于resultMap自动映射匹配级别
默认值为PARTIAL
其他值
NONE
PARTIAL
默认//部分→全部
只会自动映射没有定义嵌套结果集映射的结果集。
FULL
全自动映射//包括collection,association也填充
defaultExecutoType
作用
配置默认执行器
值
SIMPLE
就是普通执行器
REUSE
执行器会重用预处理语句(prepared statements)
BATCH
执行器将重用语句并执行批量更新
默认值
SIMPLE
defaultStateTimeout
作用
设置超时时间
决定驱动等待数据库响应的秒数
mapUnderscoreToCamelCase
作用
是否开启自动驼峰命名规则(camel case)映射
默认值
false
jdbcTypeForNull
作用
当没有为参数提供指定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型。(null,varchar,Other)
默认值
other
aggressiveLazyLoading
作用
关联对象属性的延迟加载开关
启动时,所有延迟属性的调用会使带有延迟加载属性的对象完整加载。
关闭,则按需加载。
默认值:true
multipleResultSetsEnabled
作用
是否允许单一语句返回多结果集
默认值:true
useColumnLabel
作用
使用列标签代替列名。不同的驱动在这方法有不同的表现
观察
驱动文档
测试
默认值:true
userGenratedKeys
作用
允许JDBC支持自动生成,需要驱动兼容。
如果设置true,则这个设置强制使用自动生成主键,尽管一些驱动不兼容但仍可正常工作
默认值:true
lazyLoadTriggerMethods
作用
这个参数的含义是当调用配置中的方法时,加载全部的延迟加载数据。
默认值
“equals,clone,hashCode,toString”
value
属性的使用
1、MyBatis延迟加载的配置
作用
在一定程度上可以降低运行消耗并提高查询效率。
配置
<settings name=“lazyLoadingEnabled” value=“true”><setting name="lazyLoadingEnabled" value="true"></setting><setting name="aggressiveLazyLoading" value="false"></settings>
关联映射
<association>
<collection>
例子
<settings>
<setting name=”autoMappingBehavior” value=”NONE”/>//不自动填充
</settings>
typeAliases
typeAlias
作用
为java类型命名一个别名
type
包位置
alias
别名
默认别名
基本数据类型
映射类型首字母小写
普通:在前面添加_
特殊
_integer
int
包装数据类型
映射类型首字母大写
普通:就是小写首字母
特殊
integer
Integer
其他
date
Date
decimal
BIgDecimal
都是小写首字母
package
作用
指定包下JavaBean的非限定类名
name
typeHandlers
作用
类型处理器
将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型)。
或者从数据库取出结果时将jdbcType转换为javaType。
使用(自定义类处理器)
子标签
typeHandler
属性
handler
处理器的位置
package
属性
name
包的位置
objectFactory
作用
对象工厂
使用(自定义对象工厂)
1、实现接口或者继承DefaultObjectFactory类
2、在配置文件配置
objectFactory
属性
type
工厂类的位置
子标签
property
属性
name
取名
value
类名
plugins
作用
插件
拦截调用
environments
作用
表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
环境
属性
default
必须指定
environment
属性
id
汇总
<environments default="development">//默认的运行环境ID
<environment id="development"> //运行环境ID
<transactionManager type="JDBC"/>//事务管理器的配置
<dataSource type="POOLED">//数据源配置
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
……
</environment>
</environments>
transactionManager
事务管理器
<transactionManager type="[ JDBC | MANAGED(托管)]" />
JDBC
直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的 连接 来处理事务的作用域。
MANAGED
从配置从来不提交或回滚一个连接,而是让 容 器 来管理事务的整个生命周期。
默认情况下,他会关闭连接,如果不希望,则可以将closeConnection属性设置为false来阻止它默认的关闭行为。
注意
如果同时使用Spring+Mybatis
那么就不用再Mybatis使用事务管理器,因为Spring自带的管理器来实现事务管理。
dataSource
元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
<dataSource type=" [UNPOOLED | POOLED | JNDI]" />
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
还有一个
defaultTransactionIsolationLevel
默认的连接事务隔离级别
三种数据源类型
UNPOOLED
表示获取连接时不是从连接池中获取,而是直接new了一个连接返回。
缺点
每次被请求都会打开和关闭连接
POOLED
利用了连接池的思想
步骤
首先先判断空闲连接池内有没有空闲连接,如果还有则给你返回一个空闲连接。
如果没有空闲连接,则去活动连接池内看看还有没有位置,如果还有,则new一个连接给你返回
如果活动连接池没有位置了,则返回在活动连接池使用最久的连接。意思就是给你返回一个在活动连接池内待最久的连接。
优点
避免了在创建新的连接实例时所需要初始化和认证的时间,这种方式使得并发Web应用快速地响应请求,时当前留下地处理方式。
多的属性
poolMaximumActiveConnections
在任意时间可以存在的活动连接数量,默认值10
pooMaximumdleConnections
任意时间可能存在的空闲连接数
poolMaximumCheckoutTime
在被强制返回之前,池中连接被检出时间。默认值:20000.(20s)
poolTimeToWait
如果获取连接花费的时间较长,它会给连接池打印状态日志并重新尝试重新获取一个连接。默认值为20000.(20s)
poolPingQuery
发送到数据库的侦测查询,用于检索连接是否处于正常工作秩序中。默认是"NO PING QUERY SET",这会导致多数数据库驱动失败时,带有一定的错误信息。
poolPingEnabled
是否启用侦测查询。若开启,必须使用一个可执行的SQL语句设置poolPingQuery属性,默认值:false
poolPingConnectionsNotUsedFor
配置poolPingQuery的使用频度,可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(表示所有连接所有时刻都被侦测。)
JNDI
这个属性内部是使用了JNDI技术,每个服务器对应的连接池技术都不一样,比如tomcat服务器使用的dpcp连接池。这个属性值只能在web工程和maven的web工程中使用。
使用
可以在EJB或应用服务器等容器中使用
可以集中或在外部配置数据源,然后防止一个JNDI上下文引用。
属性
initial_context
主要用于寻找上下文
data_source
表示引用数据源实例位置的上下文的路径
注意
如果没有配置
在InitialContext
配置
在上下文
mappers
映射器
使用
方法一
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
使用类资源路径获取资源
sql
方法二
<mappers>
<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
<mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
</mappers>
使用URL获取资源
方法三(接口类引入)
<mapper class="com.yc.bean.mybatis"></mapper>
方法四(使用包名引入)
<package name="包的位置"></package>
3、书写映射文件,就是查询的时候对象跟数据库表中的数据如何对应。
结构
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mapper
语句
属性
id
parameterType
两种取值方式
#
$
resultType
resultMap
自定义返回类型
select
insert
update
delete
cache
cache-ref
resultMap
result
标签详情(重点)
mapper
resultMap(类中包含了其他的类)
属性
type
类
id
名字
autoMapping
true自动映射
false
标签
constructor
作用
类在实例化时,用来注入结果到构方法中
子标签
idArg
作用
ID参数;标记结果作为ID
arg
作用
注入到构造方法的一个普通结果
id
用于表示哪个列是主键
result
注入到字段或javaBean属性的普通结果
result
属性
property
属性
column
表列名字
collection(list等等,1对多)
属性
property
变量名
jdbcType
变量类型
一般是list,map
ofType
里面的类型
select
运行某语句获得
column
传参数
例如
{qid=id,sort=sort}
使用方法
直接从查询结果中获取值
<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="sort" property="sort" jdbcType="INTEGER" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.data.entity.QuestionOption">
<id column="o_id" property="id" jdbcType="VARCHAR" />
<result column="o_content" property="content" jdbcType="VARCHAR" />
<result column="o_sort" property="sort" jdbcType="INTEGER" />
</collection>
<!-- 列的别名 o_id,o_content,o_sort , 起别名是因为主子表都有这几个字段
这里要写 ofType, javaType还是可以不写 -->
</resultMap>
或者自己查询,获取值
<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="sort" property="sort" jdbcType="INTEGER" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.xxx.entity.QuestionOption"
select="com.xxx.modules.xxx.mapper.QuestionOptionMapper.selectList" column="{qid=id,sort=sort}" />
<!-- qid/sort是定义的变量名, id/sort是主表的字段id/sort,
先查出主表的结果, 然后主表记录数是几 就执行几次 collection 的select,
javaType和ofType 写不写都行,
select的值: 对应xml的namespace + 对应xml中的代码片段的id,
column作为select语句的参数传入,如果只传一个参数id可以简写: column="id" -->
</resultMap>
association(对象1对1,多对1)
属性
role
javaType
同上,两种方式
discriminator(使用结果值来决定使用哪个结果映射)
属性
javaType
子标签
case(基于某些值得结果映射)
属性
value
用途
主要用于处理一个单独得数据库查询返回很多不同数据类型结果集的情况
select
属性
id
parameterType
两种取值方式
#
$
resultType
resultMap
自定义返回类型
flushCache
在调用SQL语之后,是否需要MyBatis清空之前查询的本地缓存和二级缓存。
默认值
false
useCache
用于控制二级缓存的开启和关闭,其值为布尔类型
默认值
true
存入二级缓存
timeout
设置超时参数
fetchSize
获取记录的总条数设定
默认值
unset
依赖于驱动
statementType
用于设置MyBatis使用哪个JDBC的statement工作工作
值
分别对应
Statement
PreparedStatement
CallableStatement
STATEMENT
PREPARED
CALLABLE
resultSetType
表示结果集的类型
默认值
unset
值
FORWARD_ONLY
SCROLL_SENSITIVE
SCROLL_INSENSITIVE
insert
属性
插入或更新成功后获取主键值,通过这三个属性
只适用于更新和插入
注意,删除没有这三个属性
keyProperty
此属性的作用时将插入和更新的返回值赋值给po类的一个属性
例如
keyProperty=“id”
联合主键
可以在多个值之间用逗号隔开
例如
keyProperty=“id,key”
keyColumn
作用
设置第几行为主键
使用
当主键列不是表中的第一列时设置。
多个主键,用逗号隔开。
useGeneratedKeys
此属性会使Mybatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部产生的主键(如mysql自动递增的字段)
默认值
false
子标签
selectKey
作用
当数据库不支持自动增长,或者支持增长的数据库取消了主键自增规则。(使用这句话来自定义生成主键)
使用
<selectKey keyProperty="id" resultType="Integer" order="BEFORE">select if (max(id) , is null ,1,max(id)+1 ) as newId from t_customer</selectKey>
注意
当数据库没有记录时,则设置id为1
属性
keyProperty
resultType
order
值
BEFORE
那么它会首先执行<selectKey>元素中的配置来设置主键,然后执行插入语句
AFTER
设置为AFTER,那么它会先执行插入语句,然后执行<selectKey>元素的配置内容
statementType
动态sql
理论
基于OGNL表达式
标签
if
解决问题
参数为空
用途
用于参数判空
属性
test
条件
trim
用途
更灵活的去除多余关键字
添加where、set、values
删除and、,
属性
prefix前缀
Suffix后缀
prefixOverrides前缀覆盖
去除后面多余的,
suffixOverrides后缀覆盖
去除前面多余的,
where
问题
当只传入参数:用户角色,而不传入参数:用户名称的时候,控制台报SQL异常错误?
当有if成立,就加 where
set
问题
更新用户表数据时,若某个参数为null时,会导致更新错误
有if成立,加set
choose(条件添加语句)
子标签
when
属性
test
条件
otherwise
foreach(循环给值)
属性
item
元素别名
collection
循环类型
open
开头
separator
间隔
close
结束
语句中出现_parameter
作用
外面传一个参数
就是一个参数
传2+
就是map对象
4、通过mybatis访问数据库,获取结果
a.读取解析配置文件
b.通过配置文件创建SqlSessionFactory工厂
c.通过SqlSessionFactory工作获取SqlSession
d.SqlSession执行对应sql语句
分页的实现
方式一
limit 开始页,页数
方式二
java代码层实现分页
步骤
RowBounds rowBounds = new RowBounds(当前页,页数)
rowBounds在使用执行查询的方法的时候作为参数
selectList()
方式三
分页插件
Mybatis分页插件PageHelper
1、引入分页插件
两种方式
引入jar包
下载jar的方式
由于使用了sql解析工具
还需要下载jsplparser.jar
Maven方式
在pom.xml里面添加依赖
2、配置拦截器插件
1、在Mybatis配置xml中配置拦截器插件
新版拦截器com.github.pagehelper.PageInterceptor
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="param1" value="value1"></plugin></plugins>
2、Spring配置文件中配置拦截器插件
注解的开发
@Param("名字")
给参数命令
@Select("语句")
可以省略xml的配置
步骤
1、写@select()
2、绑定接口<mappers><mapper class="com.kuang.dao.UserMapper"></mappers>
3、测试
@Insert()
@Update()
@Delete()
经常查询并且不经常改变的数据
扩展
类
StatementHandler
缓存
简介
什么是缓存Cache?
存在内存中的临时数据
将用户经常查询的数据放在缓存(内存)中,用户就不用去磁盘查询了,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题
为什么要使用缓存?
减少和数据库的交互次数,减少系统开销,提高系统效率。
什么样的数据能使用缓存?
简单语句的效果
映射语句文件中的所有select语句的结果将会缓存
映射语句文件中所有insert,update和delete语句会刷新缓存
缓存会使用最近最少使用算法(LRU,Least Recently Used)算法来清除不需要的缓存
缓存不会定时进行刷新(也就是说,没有刷新间隔)。
缓存会保存列表或对象(无论查询方法)的1024个引用
缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或现场所做的潜在修改。
缓存只作用于cache标签所在的映射文件中的语句。如果你混合使用Java API和XML映射文件,在共用接口中的语句将不会被默认缓存。你需要使用@CacheNamespaceRef注解指定缓存作用域
二级缓存
只需要在映射文件中添加一行
<cache/>
属性
eviction
缓存的方法
flushInterval
刷新秒数
size
最多存储结果对象或列表的512引用
readOnly
步骤
显示的开启全局缓存
<setting name="cacheEnabled" value="true"></setting>
在要使用二级缓存的Mapper中开启
<cache/>
测试
工作机制
一个会话查询一条数据,这个数据就会被放在当前的一级缓存中
如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
新的会话查询信息,就可以从二级缓存中获取内容
不同的mapper查出的数据会放在自己对应的缓存(map)中
也可以在属性中关闭缓存
报错
Caused by: java.io.NotSerializableException: com.kuang.pojo.User
总结
只要开启了二级缓存,在同一个Mapper下就有效
所有数据一开始放在一级缓存中,只有当会话提交,或者关闭的时候,才会提交到二级缓存中!
缓存
先看二级缓存有没有
再看一级缓存有没有
查询数据库
mybatis缓存
Mybatis包含了一个非常强大的查询缓存特性,他可以非常方便地定制和配置缓存。
Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认
只有一级缓存开启
SqlSession级别的缓存,也称为本地缓存
二级缓存需要手动开启和配置,他是基于namespace级别的缓存。(mapper)
为了提供扩展性
Mybatis定义了缓存接口Cache。
我们可以通过实现Cache接口来自定义二级缓存
一开始使用Memcached
概念
当多个服务器操作一个数据库
高并发问题
当多个数据库
读写分离,主从复制
创建了一个FIFO缓存,每隔60秒刷新,最多可以存储结果对象或列表的512个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。
可用的清除策略
LRU
最近最少使用
移除最长时间不被使用的对象
FIFO
先进先出
按对象进入缓存的顺序来移除它们
SOFT
软引用
基于垃圾回收器状态和软引用规则移除对象
WEAK
弱引用
更积极地基于垃圾收集器状态和弱引用规则移除对象
默认的清除策略
LRU
属性
flushInterval
刷新间隔
size
引入数目
默认值
1024
readOnly
只读
默认值为false
二级缓存是事务性的
当没有执行flushCache=true的insert/delete/update语句时,缓存会获得更新
一级缓存
一级缓存也叫本地缓存
与数据库同一次会话期间查询到的数据会放在本地缓存中。
以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库
二级缓存
也叫全局缓存
工作机制
一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
新的会话查询信息,就可以从二级缓存中获取内容
日志观察
自定义缓存
Ehcache
纯Java的进程内缓存框架
是Hibernate中默认的CacheProvider
开源Java分布式缓存,主要面向通用缓存
程序中使用
导入
Mybatis Ehcache
在mapper中加入
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
创建文件ehcache.xml
第二种
实现Cache
一般使用Redis实现缓存
0 条评论
下一页