Mybatis的二级缓存配置
Mybatis学习——Mybatis核心配置

Mybatis学习——Mybatis核⼼配置MyBatis的核⼼配置 在使⽤MyBatis框架时,设计两个核⼼的d对象:SqlSessionFactory和SqlSession.SqlsessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,其主要作⽤⽤来创建SqlSession对象,SqlSessionFactory实例对象是可以通过SqlSessionFactoryBulider对象来构建,⽽SqlSessionFactoryBulider对象可以通过XML⽂件或者Configuration实例来创建SqlSessionFactory实例,其代码如下://1.读取配置⽂件String resource ="mybatis-config.xml";InputStream inputStream=Resources.getResourceAsStream(resource);//2.获取会话⼯⼚对象SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); 注意:SqlSessionFactory对象是线性安全的,它⼀旦被创建,在整个应⽤程序间都会存在,如果我们多次的创建同⼀个SqlSessionFactory对象,那么数据库的资源很快就会被应⽤完,为了解决这个问题,通常,⼀个数据库是建⼀个SqlSessionFactory对象的。
SqlSession SqlSession对象是应⽤层和持久层之间进⾏数据库操作的⼀个单线程对象,其中主要作⽤是执⾏持久化操作,SqlSession对象中包含了所有执⾏数据库操作的⽅法,由于底层封装了JDBC的连接,所以可以直接使⽤SqlSession对象来执⾏已经映射的SQL语句。
注意:每⼀个线程都应该有⾃⼰的SqlSession实例,并且该SqlSession实例是不可共享的,同时,SqlSession是线程不安全的,因此,其使⽤范围最好是在⼀个请求中,或者⼀个⽅法中,绝对不能将其放⼊⼀个类的静态字段中,实例字段或者任何类型的管理范围中,使⽤完SqlSession后,要及时的关闭它,通常可以将其放⼊finally块中关闭。
Mybatis注解开发之@CacheNamespace:实现注解二级缓存的使用

Mybatis注解开发之@CacheNamespace:实现注解⼆级缓存的使⽤MyBatis⼆级缓存使⽤:官⽅建议在service使⽤缓存,但是你也可以直接在mapper层缓存,这⾥的⼆级缓存就是直接在Mapper层进⾏缓存操作Mybatis的⼆级缓存实现也⼗分简单,只要在springboot的配置⽂件打开⼆级缓存,即:mybatis-plus.configuration.cache-enabled=true在Dao接⼝上增加注解@CacheNamespace(implementation= MybatisPlusCache.class,eviction=MybatisPlusCache.class)public interface DictEntryDao extends BaseMapper<DictEntry> {}与controller同级新建configuration⽂件夹,在⽂件夹下添加MybatisPlusCache类,代码如下:package com.ljxx.app.configuration;import com.ljxx.app.utils.ApplicationContextUtil;import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.cache.Cache;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/*** @author zhongyushi* @date 2020/9/28 0028* @dec MybatisPlus缓存配置,使⽤redis作为缓存服务器*/@Slf4jpublic class MybatisPlusCache implements Cache {// 读写锁private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);//这⾥使⽤了redis缓存,使⽤springboot⾃动注⼊private RedisTemplate<String, Object> redisTemplate;private String id;//是mybatis必须要求的,必写。
缓存(一级缓存和二级缓存)

缓存(⼀级缓存和⼆级缓存)缓存可以将数据保存在内存中,是互联⽹系统常常⽤到的。
⽬前流⾏的缓存服务器有 MongoDB、Redis、Ehcache 等。
缓存是在计算机内存上保存的数据,读取时⽆需再从磁盘读⼊,因此具备快速读取和使⽤的特点。
和⼤多数持久化框架⼀样,MyBatis 提供了⼀级缓存和⼆级缓存的⽀持。
默认情况下,MyBatis 只开启⼀级缓存。
⼀级缓存⼀级缓存是基于 PerpetualCache(MyBatis⾃带)的 HashMap 本地缓存,作⽤范围为 session 域内。
当 session flush(刷新)或者close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。
在参数和 SQL 完全⼀样的情况下,我们使⽤同⼀个 SqlSession 对象调⽤同⼀个 mapper 的⽅法,往往只执⾏⼀次 SQL。
因为使⽤SqlSession 第⼀次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,⽽不会再次发送 SQL 到数据库。
由于 SqlSession 是相互隔离的,所以如果你使⽤不同的 SqlSession 对象,即使调⽤相同的 Mapper、参数和⽅法,MyBatis 还是会再次发送 SQL 到数据库执⾏,返回结果。
⽰例:WebsiteMapperpublic Website selectWebsiteById(int id);WebsiteMapper.xml<select id="selectWebsiteById"resultType="net.biancheng.po.Website">SELECT * FROM websiteWHERE id=#{id}</select>测试代码public class Test {public static Logger logger = Logger.getLogger(Test.class);public static void main(String[] args) throws IOException {InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置⽂件构建SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);SqlSession ss = ssf.openSession();Website site = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);logger.debug("使⽤同⼀个sqlsession再执⾏⼀次");Website site2 = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);// 请注意,当我们使⽤⼆级缓存的时候,sqlSession调⽤了 commit⽅法后才会⽣效mit();logger.debug("现在创建⼀个新的SqlSeesion对象在执⾏⼀次");SqlSession ss2 = ssf.openSession();Website site3 = ss2.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);// 请注意,当我们使⽤⼆级缓存的时候,sqlSession调⽤了 commit⽅法后才会⽣效mit();}}运⾏结果DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?DEBUG [main] - ==> Parameters: 1(Integer)DEBUG [main] - <== Total: 1DEBUG [main] - 使⽤同⼀个sqlsession再执⾏⼀次DEBUG [main] - 现在创建⼀个新的SqlSeesion对象在执⾏⼀次DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?DEBUG [main] - ==> Parameters: 1(Integer)DEBUG [main] - <== Total: 1从运⾏结果可以看出,第⼀个 SqlSession 实际只发⽣过⼀次查询,⽽第⼆次查询就从缓存中取出了,也就是 SqlSession 层⾯的⼀级缓存。
mybatis-plus 缓存

mybatis-plus 缓存Mybatis-Plus是一款mybatis工具包,它能够提供Mybatis所没有的自动化CRUD操作、以及自动代码生成等功能。
除此之外,Mybatis-Plus还有一个非常重要的特性,那就是缓存。
Mybatis-Plus中的缓存可以说是非常实用的,它可以大幅度提升Mybatis的查询效率。
在Mybatis-Plus中,缓存分成两种,即本地缓存(LocalStorage)和二级缓存(Second Cache)。
下面来逐一介绍这两种缓存。
一、本地缓存(LocalStorage)本地缓存,也就是Mybatis-Plus内置的一种缓存,它是应用于单次查询的结果集缓存,可以有效地提高单次查询的性能。
当我们执行相同的SQL语句时,Mybatis-Plus会直接从本地缓存中获取结果,而不是每次都去查询数据库。
开启本地缓存很简单,只需要在Mybatis配置文件中添加如下配置:```<configuration><settings><setting name="localCacheScope" value="SESSION"/></settings></configuration>```其中,value的取值有SESSION和STATEMENT两种,分别代表会话级别的缓存和语句级别的缓存。
这里我们选择会话级别的缓存。
二、二级缓存(Second Cache)二级缓存,顾名思义,是应用于多次查询的结果集缓存。
它可以缓存mapper.xml配置文件中的select语句执行的结果集,无论是应用程序的同一个线程、同一个会话甚至是不同的应用程序都可以共享这个缓存。
这对于提升查询性能和减轻数据库负荷有非常大的作用。
开启二级缓存也很简单,只需在mapper.xml中的select标签中添加如下代码:```<cache/>```这样,该select查询的结果集就会被缓存起来,当下次再次查询时,可以直接从缓存中获取数据。
ssm和ssh区别及对比

ssm和ssh区别及对⽐1.什么是ssh?SSH是 struts+spring+hibernate的⼀个集成,是⽬前⽐较流⾏的⼀种Web应⽤程序开源框架。
2.什么是ssm?SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,⽬前⽐较主流的Java EE企业级框架,适⽤于搭建各种⼤型的企业级应⽤系统。
1.Spring简介Spring是⼀个开源框架,Spring是于2003年兴起的⼀个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍⽣⽽来。
它是为了解决企业应⽤开发的复杂性⽽创建的。
Spring使⽤基本的JavaBean 来完成以前只可能由EJB完成的事情。
然⽽,Spring的⽤途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的⾓度⽽⾔,任何Java 应⽤都可以从Spring中受益。
简单来说,Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器框架。
A.控制反转(IOC)是什么呢?IOC:控制反转也叫依赖注⼊。
利⽤了⼯⼚模式将对象交给容器管理,你只需要在spring配置⽂件总配置相应的bean,以及设置相关的属性,让spring容器来⽣成类的实例对象以及管理对象。
在spring容器启动的时候,spring会把你在配置⽂件中配置的bean都初始化好,然后在你需要调⽤的时候,就把它已经初始化好的那些bean分配给你需要调⽤这些bean的类(假设这个类名是A),分配的⽅法就是调⽤A的setter ⽅法来注⼊,⽽不需要你在A⾥⾯new这些bean了。
[注意]:⾯试的时候,如果有条件,画图,这样更加显得你懂了B.⾯向切⾯(AOP)⼜是什么呢?⾸先,需要说明的⼀点,AOP只是Spring的特性,它就像OOP⼀样是⼀种编程思想,并不是某⼀种技术,AOP可以说是对OOP的补充和完善。
mybatis一级二级缓存原理

mybatis一级二级缓存原理
MyBatis 提供了两级缓存机制,即一级缓存和二级缓存。
这两级缓存的原理如下:
1. 一级缓存(SqlSession 级别的缓存):
一级缓存是在同一个 SqlSession 中,对于相同的查询条件,只会执行一次SQL 查询,查询结果被缓存起来,后续的相同查询可以直接从缓存中获取结果,避免了重复的数据库查询操作。
一级缓存是基于 SqlSession 对象的,也就是说,只要 SqlSession 不关闭,一级缓存就会一直存在。
2. 二级缓存(Mapper 级别的缓存):
二级缓存是跨 SqlSession 的,也就是说,即使在不同的 SqlSession 中,只要查询条件相同,就可以共享同一个查询结果。
二级缓存是基于 Mapper 接口的,可以在多个 Mapper 之间共享数据。
二级缓存可以配置为只对某些特定的 Mapper 或者全局启用。
MyBatis 的两级缓存机制可以有效地减少对数据库的访问次数,提高应用程序的性能。
但是需要注意的是,由于二级缓存是跨 SqlSession 的,因此在使用二级缓存时需要特别注意线程安全问题,以及在 SqlSession 关闭或者清空缓存时要正确地处理缓存数据。
MyBatis核心技术全解与项目实战读书笔记

《MyBatis核心技术全解与项目实战》读书笔记1. 第一章 MyBatis简介本章主要介绍了MyBatis的基本概念、特点和优势,以及其在Java企业级应用开发中的重要作用。
MyBatis是一个优秀的持久层框架,它将SQL语句与Java对象映射(POJO)相结合,使得开发人员可以更加方便地操作数据库。
MyBatis的主要目标是简化数据库操作,提高开发效率,同时也提供了良好的数据封装和安全性。
SqlSessionFactory:用于创建SqlSession对象,SqlSession是MyBatis中执行SQL语句的核心接口。
SqlSession:用于执行SQL语句的会话对象,可以通过它来执行增删改查等操作。
Mapper:映射器接口,用于定义SQL语句和Java对象之间的映射关系。
Configuration:MyBatis的全局配置类,用于配置各种属性,如缓存策略、事务管理等。
插件:MyBatis的插件机制,允许开发者自定义拦截器、类型处理器等组件,以实现对MyBatis的功能扩展。
灵活性:MyBatis支持多种存储结构,如JDBC、ODBC、JNDI等,同时还支持自定义类型处理器和插件,使得MyBatis能够满足各种复杂的数据库操作需求。
易用性:MyBatis提供了简洁的XML映射文件来描述SQL语句和Java对象之间的映射关系,使得开发者无需编写复杂的SQL语句即可完成数据库操作。
性能优化:MyBatis通过一级缓存和二级缓存机制来提高查询性能,同时还支持动态SQL、分页查询等功能,使得MyBatis能够在高并发环境下保持良好的性能表现。
安全性:MyBatis提供了严格的权限控制机制,可以限制不同用户对数据库的操作权限,保证数据的安全性。
1.1 MyBatis概念及特点MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
相比于传统的数据访问技术,MyBatis让开发者能够更加直接地与数据库交互,从而有效地避免了大量繁琐的SQL语句编写工作。
【Mybatis】Mybatis实战2(一对一、一对多、多对多的设计及实现,高级特性及二级缓存)

【Mybatis】Mybatis实战2(⼀对⼀、⼀对多、多对多的设计及实现,⾼级特性及⼆级缓存)6).多表查询-“⼀对多”(表设计、实体设计、DAO(mapper)设计)(1)关联关系操作(⼀对多)①表设计:以员⼯和部门表为例思想: 1个员⼯对应1个部门,1个部门对应多个员⼯添加数据原则:先添加没有外键的数据(部门信息),再添加存在外键的数据(员⼯信息)注意:将外键添加在n的⼀⽅部门表:create table t_dept(id varchar2(36) primary key,name varchar2(50));员⼯表:create table t_emp(id varchar2(36) primary key,name varchar2(50),age number(3),salary number(10,2),dept_id references t_dept(id));②实体设计a. 在实体中添加关系属性,来表⽰实体之间的关系(对应表数据的关系)b. 在N的⼀⽅添加1的⼀个关系属性。
c. 在1的⼀⽅添加N的⼀个List的关系属性DAO:(MyBatis如何查询两张表信息)需求1:查询员⼯信息(⼯号,名字,年龄,薪资,所属部门的编号和名称)根据员⼯⼯号?DAO接⼝⽅法:public Emp selectById(String id);Mapper⽂件:①SQL:select e.id,,e.age,e.salary,d.id, from t_emp e left join t_dept d on e.dept_id = d.id where e.id = '5';②参数③将查询结果映射成⼀个实体对象特点: 如果关系属性是”1” ,使⽤ <association></association>需求2:根据id查询部门信息,及其内部的所有员⼯信息?DAO接⼝⽅法:public Dept selectById(String id);Mapper⽂件中①SQL:select d.id,,e.id as eid, as ename,e.age as eage,e.salary as salary from t_dept d left join t_emp e on d.id = e.dept_idwhere d.id = ?;②参数绑定③结果映射:ReusultMap映射集合关系属性特点: 关系属性是”n”个的集合 ,使⽤ <collection></ collection >7).多表查询-“⼀对⼀”(表设计、实体设计、DAO(mapper)设计)关联关系操作(⼀对⼀)例如:需求: 学⽣电脑管理系统①库表设计表⽰1对1的关系a. 添加外键(那张表添加都可以)①从业务的⾓度分析,后添加的数据对应的表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的。
Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的Mapper 映射文件中添加一行:
<cache />
它将采用默认的行为进行缓存:
●映射文件中所有的select语句将被缓存
●映射文件中所有的insert、update和delete语句将刷新缓存
●缓存将使用LRU(Least Recently Used)最近最少使用策略算法来回
收
●刷新间隔(no Flush Interval,没有刷新间隔),缓存不会以任何时间顺
序来刷新
●缓存会存储列表集合和对象(无论查询方法返回什么)的1024个引用
●缓存会被视为read/write(可读/可写)的缓存,意味着对象检索不是共
享的,而且可以安全的被调用者修改,而不干扰其他调用者或者线程所
做的潜在修改
所有这些属性都可以通过缓存元素的属性来修改,比如:
<cache
eviction="FIFO"
flushInterval="10800000"
size="512"
readOnly="true"
/>
这个更高级的配置创建了一个FIFO缓存,并每隔3个小时刷新缓存,储存结果对象或列表的512个引用,而且返回的对象被认为是只读的,因此在不同线程
中的调用者之间修改他们会导致冲突。
可用的收回策略有:
●【默认】LRU——最近最少使用的:移除最长时间不被使用的对象
●FIFO——先进先出的:按对象进入缓存的顺序来移除他们
●SOFT——软引用:移除基于垃圾回收器状态和软引用规则的对象
●WEAK——弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的
对象。
flushInterval(刷新间隔)可以被设置为任意的正整数(60*60*1000这种形式是不允许的),而且它们代表一个合理的毫秒形式的时间段。
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。
默认值是1024.
readOnly(只读)属性可以被设置为true或false。
只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势。
可读写的缓存会返回缓存对象的拷贝(通过发序列化)。
这会慢一些,但是安全,因此默认是false。
配置完<cache/>表示该mapper映射文件中,所有的select语句都将被缓存,所有的insert、update和delete语句都将刷新缓存。
但是实际中,我们并是希望这样,有些select不想被缓存时,可以添加select的属性useCache=“false”;有些insert、update和delete不想让他刷新缓存时,添加属性
flushCache=”false ”。