Mybatis的二级缓存配置

合集下载

Mybatis学习——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注解开发之@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-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区别及对比

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一级二级缓存原理
MyBatis 提供了两级缓存机制,即一级缓存和二级缓存。

这两级缓存的原理如下:
1. 一级缓存(SqlSession 级别的缓存):
一级缓存是在同一个 SqlSession 中,对于相同的查询条件,只会执行一次SQL 查询,查询结果被缓存起来,后续的相同查询可以直接从缓存中获取结果,避免了重复的数据库查询操作。

一级缓存是基于 SqlSession 对象的,也就是说,只要 SqlSession 不关闭,一级缓存就会一直存在。

2. 二级缓存(Mapper 级别的缓存):
二级缓存是跨 SqlSession 的,也就是说,即使在不同的 SqlSession 中,只要查询条件相同,就可以共享同一个查询结果。

二级缓存是基于 Mapper 接口的,可以在多个 Mapper 之间共享数据。

二级缓存可以配置为只对某些特定的 Mapper 或者全局启用。

MyBatis 的两级缓存机制可以有效地减少对数据库的访问次数,提高应用程序的性能。

但是需要注意的是,由于二级缓存是跨 SqlSession 的,因此在使用二级缓存时需要特别注意线程安全问题,以及在 SqlSession 关闭或者清空缓存时要正确地处理缓存数据。

MyBatis核心技术全解与项目实战读书笔记

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(一对一、一对多、多对多的设计及实现,高级特性及二级缓存)

【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. 添加外键(那张表添加都可以)①从业务的⾓度分析,后添加的数据对应的表。

《MyBatis数据持久化框架》笔试题库

《MyBatis数据持久化框架》笔试题库

《MyBatis数据持久化框架》笔试题库1. 在MyBatis中,开发Mybatis不需要下列哪些步骤添加Mybatis核心包配置mybatis配置文件mybatis-config.xml配置全局属性、数据源和实体包的别名实现静态列表html页面(正确答案)2. 在MyBatis中对JDBC访问数据库的代码进行封装,从而大大简化了数据访问层的重复性代码,它是针对三层架构中()的解决方案表现层业务逻辑层持久化层(正确答案)数据库系统3. 在MyBatis中,关于log4j日志级别不包含以下那种update(正确答案)ERRORTRACEDEBUG4. 在MyBatis中,操作数据库的核心类是()SqlSessionFactorySqlSession(正确答案)SessionSqlSessionFactoryBuilder5. 在MyBatis中,将以下划线命名的数据库列映射到Java对象的驼峰命名属性的配置是什么()sqlSessionFactorypropertymapUnderscoreToCamelCase(正确答案)jdbcType6. 在MyBatis中,查询列前缀属性为propertyjavaTypeColumnPrefix(正确答案)ColumnBefore7. Mybaits中的前身是()IBATIS(正确答案)BeginClintonApache8. 在MyBatis中对结果集的配置使用的标签是以下()<result><resultMap>(正确答案)<map><collection>9. 在MyBatis中,删除具有主从关系的主表记录时会出现删除异常,可以使用什么解决方式()【选两项】设置从表的删除时规则为“置为NULL”(正确答案)设置主表的删除时规则为“置为NULL”设置从表的删除时规则为“置为级联”(正确答案)设置主表的删除时规则为“置为级联”10. 在MyBatis中,执行以下代码生成结果变量result代表的含义是什么intresult=userMapper.deleteUserById(id);()删除消耗时间删除数据字段数量数据删除受影响的行数(正确答案)数据库剩余数据行数11. 在MyBatis数据库操作时,需要编写()和对应的xml文件,其中xml文件中编写的是对应Sql语句接口和抽象方法(正确答案)普通类和普通方法抽象类和抽象方法普通类和抽象方法12. 在MyBatis中,@SelectKey(statement="select last_insert_id()",keyProperty="id",resultType=Long.class, before=false)注解的作用是什么()返回值为最后一次插入数据的id值(正确答案)查询数据库中最大的id值查询当前数据库中id的数量查询数据库中是否存在相同id13. 在MyBatis中,以下哪项不属于xml映射文件标签resultMapparameter(正确答案)include14. 在MyBatis中用于表示返回结果类型的属性名称是resultType(正确答案)parameterTypecollectionreturnType15. 在MyBatis中用于表示输入类型的属性名称是resultTypeparameterType(正确答案)collectionreturnType16. 在 MyBatis 的配置文件中,通过()标签来设置实体类的别名propertiessettingstypeAliases(正确答案)dataSource17. 在MyBatis中,以下哪项不属于Mybatis全局配置文件中的标签propertiesdata(正确答案)typealiases18. 在MyBatis中,以下哪项不属于resultMap的自动映射级别NONEPARTIALFULLANY(正确答案)19. 在MyBatis中,以下说法错误的是Mapper接口方法名和mapper.xml中定义的每个sql的id可以不同(正确答案)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType 的类型相同Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同Mapper.xml文件中的namespace即是mapper接口的类路径20. 在MyBatis中,用于取出由数据库内部生成主键的属性是()keyPropertyuseGeneratedKeys(正确答案)keyColumndataBaseid21. 在MyBatis中,更新数据的Mapper.xml的标签是什么InsertSelectUpdate(正确答案)Delete22. 在MyBatis中,使用jdbc方式返回主键自增的值需要设置<insert>标签的什么属性()idparameterTypekeyPropertyuseGeneratedKeys(正确答案)23. 在Mybatis中实现DML操作的标签有哪些()【选三项】<insert>(正确答案)<update>(正确答案)<delete>(正确答案)<provider>24. 在Mybatis中接口方法中只有一个参数时,在映射器XML可用的参数是什么(){param}{param0}{arg0}(正确答案){arg1}25. 在Mybatis中接口绑定的方式有哪两种【选两项】注解绑定(正确答案)直接绑定XML里面写SQL绑定(正确答案)XML里面写方法绑定26. 在mapper中如何传递多个参数【选两项】使用占位符的思想(正确答案)使用数组传递使用map集合作为参数来装载(正确答案)无法实现27. 在Mybatis中,设置自动生成主键后通过什么属性获取自动生成的(主)键值设置resultMap设置useGeneratedKeys设置keyProperty(正确答案)设置Property28. 在Mybatis的ORM映射中,表中的列名需要和()进行映射?类名类中的属性名(正确答案)类的包名id29. 在Mybatis中,Mapper接口的方法名需要和Mapper对应XML文件中的()对应标签名id(正确答案)参数名parameterType30. 在MyBatis中,以下关于MyBatis集合类型参数的处理,说法错误的是()当参数为Collection接口,转化为Map,Map的Key为collection当参数类型为List接口时,除了collection的值外,list作为key如果参数为数组,也会转化为Map,Map的key为array如果参数为数组,也会转化为Map,Map的key为list(正确答案)31. 在MyBatis中,以下哪项不属于MyBatis的API SqlSessionFactoryBuilderSqlSessionFactoryExecutor(正确答案)SqlSession32. 在使用MyBatis的select标签查询客户(customer)的电话信息时,如果客户实体中电话的属性名为mobile,而客户表所对应的字段名为phone,则正确的写法是()select phone from customerselect mobile from customerselect mobile as phone from customerselect phone as mobile from customer(正确答案)33. 在MyBatis中,<collection>标签支持的属性值以及属性的作用和<association>标签完全相同,分别有哪些()【选两项】resultTypecolumnPrefix(正确答案)property(正确答案)parameterType34. 在MyBatis中,子标签<association>配置已经有的结果集时使用哪个属性()propertyjavaTyperesultType(正确答案)columnPrefix35. 在MyBatis中,以下不属于<association>标签嵌套查询常用属性的是()show(正确答案)selectcolumnfetchType36. 在Mybatis中使用collection标签来解决一对多关联,哪项不属于其属性properties(正确答案)ofTypecolumnselect37. 在 MyBatis 中,配置结果映射时,使用()标签实现1对多的关联many-oneone-manyassociationcollection(正确答案)38. 在 MyBatis 中,配置结果映射时,使用()标签实现多对1的关联many-oneone-manyassociation(正确答案)collection39. 在MyBatis中,.映射一对一使用的标签是many-oneone-manyassociation(正确答案)collection40. 在mybatis中,映射一对多时使用的常用属性是实体对象ConnectionResultSetList(正确答案)41. 在Mybatis中,Mapper.xml中用于设置返回值类型和结果字段映射关系的是accociationselectresultMap(正确答案)constructor42. 在MyBatis中,mybatis指定配置文件的根元素使用的是什么<sqlMapConfig><configration>(正确答案)<setting><environments>43. 在MyBatis中,<foreach>标签可以实现对象遍历的用法,适用对象不包括下列哪一个()数组MapListMath(正确答案)44. 在MyBatis中,以下属于choose标签内部标签的是【选两项】when(正确答案)selectotherwise(正确答案)if45. 在MyBatis中,以下不属于Mybatis动态sql标签的是?trimforeachsetthan(正确答案)46. 在Myabtis的XML映射文件中,除了常见的增删改查标签之外,还有哪些标签【选两项】codeparametersinclude(正确答案)selectKey(正确答案)47. 在MyBatis中,以下哪个属性作用为:当trim元素包含内容时,会把内容中匹配的前缀字符串去掉prefixprefixOverrides(正确答案)suffixsuffixOverrides48. 在MyBatis中,以下哪项不属于Mybatis动态sql标签ifchoosewhenget(正确答案)49. 在MyBatis中,实现对象遍历标签是foreach(正确答案)ifchoosetrim50. 在MyBatis中,以下不属于MyBatis动态标签的是【选两项】forwhen(正确答案)set(正确答案)while51. 在 MyBatis 动态 SQL 中,没有使用下列()标签for(正确答案)ifchoosewhere52. 下列关于Mybatis的描述错误的是()mybatis可以实现全自动的数据库操作,大大简化了开发工作量(正确答案) mybatis虽然实现了ORM,但是需要自己编写SQL语句mybatis内部其实是封装了jdbc进行数据库操作mybatis不仅支持sql,还能支持存储过程53. 在MyBatis中,<foreach>标签不包含以下哪些属性()【选两项】indexofitem(正确答案)index(正确答案)trim54. 在Mybatis中的foreach使用时,用于对应循环数据的别名属性是()closeitem(正确答案)collectionend55. 在MyBatis中,主要用于更新时的mybatis动态sql标签是Choose(when/otherwise)Set(正确答案)WhereForeach56. 在Mybatis中,想实现批量删除的动态sql的标记可选择choose(when/otherwise)setwhereforeach(正确答案)57. 在MyBatis中,动态SQL标签<choose>标签中最少可以有几个<when>标签()1(正确答案)23以上都不对58. 在MyBatis中,动态SQL标签<choose>标签中关于<otherwise>标签描述正确的是()<otherwise>标签可以有0个(正确答案)<otherwise>标签只能有1个<otherwise>标签可以有2个以上都不对59. 在MyBatis中,以下不属于Mybatis的动态标签的是()<if><while>(正确答案)<choose><where>60. 在MyBatis中,动态SQL标签<if>判断String类型的字段是否为空字符串的正确用法是()<if test="userName != null and userName != '' "></if>(正确答案)<if test="userName != null userName != '' "></if><if test="userName != null or userName != '' "></if><if test="userName != null || userName != '' "></if>61. 在MyBatis中,为实现批量输入和动态更新可以使用以下哪个动态SQL标签()<foreach>(正确答案)<if><choose><set>62. 在Mybatis中,当接口功能方法有多个参数时,可使用如下哪个注解为参数进行指定名称@set@Map@Param(正确答案)@value63. 在MyBatis中,二级缓存的默认效果有哪些()【选两项】二级缓存默认是关闭的(正确答案)映射语句文件中所有的insert语句、update语句和delete语句会刷新缓存(正确答案)缓存永远不会被回收如果没有设置刷新时间间隔,缓存会随时刷新64. 在以下场景中,不推荐使用二级缓存的是()以更新数据为主的应用中,查询业务较少(正确答案)以查询为主的应用中,尽可能少的更新操作查询业务绝大多数都是对单表进行操作的应用可以按业务划分对表进行分组时,关联表非常少65. 在MyBatis中,关于mybatis缓存的描述错误的是()一般提到Mybatis缓存的时候,都是指二级缓存一级缓存默认会启用一级缓存不能控制二级缓存不能控制(正确答案)66. 在MyBatis中,一般提到Mybatis缓存的时候指的是()二级缓存(正确答案)一级缓存本地缓存三级缓存67. 在MyBatis中,配置Mybatis Generator时,要求不会生成Examp相关的方法,需要设置targetRuntime为什么()Mybatis3Simple(正确答案)Mybatis3Mybatis3x以上都不对68. 在MyBatis中,使用MyBatis Generator自动工具生成的文件不包含()Entity(正确答案)DAO类SqlMap.xmlMapper XML69. 在MyBatis中,配置Mybatis Generator时,<table>标签可以配置几个()0个1个或多个(正确答案)仅能设置1个必须设置多个70. 在MyBatis中,MyBatis注解中怎么给参数一个名字()@Param("C11")(正确答案)@SelectOptions@Results71. 在MyBatis中,配置Mybatis Generator时,要生成数据库内所有表<table>标签中的tableName应该设置成什么()!#%(正确答案)$72. 在MyBatis中,以下Mybatis核心接口中用于设置入参设置是哪一个()ParameterHandler(正确答案)ResultSetHandlerExecutorStatementHandler73. 在MyBatis中,创建日志插件时应该通过拦截哪一个接口来完成ParameterHandlerResultSetHandlerStatementHandlerExecutor(正确答案)74. 在MyBatis中,Mybatis允许使用插件来拦截的核心接口有哪些()【选三项】Executor(正确答案)ParameterHandler(正确答案)ResultSetHandler(正确答案)ResultSet75. 在MyBatis中,以下哪项是可能造成JavaBean中字段与数据库列无法映射的原因【选两项】字段与数据库列名不一致(正确答案)没有对应的getter/setter方法(正确答案)未导入jar包项目搭建出错76. 下列关于Mybatis说法正确的是()【选两项】mybatis不能处理多表关联查询mybatis可以实现批量数据操作(正确答案)mybatis的一级缓存默认开启的(正确答案)mybatis不能针对视图进行操作77. 在MyBatis中,SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder ().build(resourceAsStream);这行代码代码主要做了哪些事呢,以下说法错误的是主要就涉及到了三个类SqlSessionFactoryBuilder、XMLConfigBuilder、XPathParser Build方法首先都是用XML配置文件构建一个XMLConfigBuilder类,XMLConfigBuilder通过parse方法返回一个Configuration配置类Configuration设置到SqlSessionFactory默认实现DefaultSqlSessionFactory的configuration属性并返回创建SqlSessionFactory对象是通过SqlSessionFactoryBuilder的build方法,他会返回它的默认实现类SqlSessionFactory(正确答案)78. 在MyBatis中,使用select映射查询含有部门详细信息的员工信息,下列关于返回类型的说法,正确的是()只能是resultType只能是resultMap(正确答案)可以是resultType或resultMap以上说法都不正确79. 在MyBatis中,以下不属于Mybatis优秀特性的是()支持自定义SQL查询支持存储过程支持高级映射支持XML注解(正确答案)80. 在MyBatis中,JDBC编程有哪些不足之处,Mybatis是如何解决这些问题的,描述正确的是()【选两项】mybatis替代了jdbc实现数据库操作将SQL语句配置在mapper.xml文件中与java代码分离(正确答案)mybatis避免了和数据库的直接连接Mbatis自动将SQL执行结果映射到java对象(正确答案)81. 在数据库操作中,事务的特性不包括下列原子性一致性高效性(正确答案)持久性82. 在MyBatis中,以下双方属于多对多关系的是权限-角色(正确答案)用户-银行卡用户-手机号学生-语文成绩83. 在MyBatis中,在使用MyBatis的时候,除了可以使用@Param注解来实现多参数不同类型入参,还可以用()传递多个参数值用Map对象可以实现传递多参数值(正确答案)用List对象可以实现传递多参数值用数组的方式传递用Set集合的方式传递84. 在MyBatis中,不属于MyBatis二级缓存默认效果有哪些映射语句文件中的所有select语句会被缓存映射语句文件中的所有insert、update、delete语句会刷新缓存缓存会使用LRU算法收回未设置缓存时间间隔,缓存会以任意时间顺序刷新(正确答案)85. 在MyBatis中,关于MyBatis映射器,说法错误的是()映射器定义了数据访问接口映射器是接口映射器中的方法是抽象方法,需要实现(正确答案)映射器类似于DAO接口,但仅需声明其中的方法,编程人员无须编码实现86. 在MyBatis中,以下哪项不属于MyBatis框架的优点易于上手和掌握解除sql与程序代码的耦合不支持级联更新(正确答案)提供xml标签,支持编写动态sql87. 在MyBatis中,以下属于MyBatis缓存级别的是【选两项】一级缓存(正确答案)二级缓存(正确答案)三级缓存无缓存88. 在MyBatis中,Mybatis的表关联的映射描述错误的是()一对多时可以使用collection标签进行关联映射多对一时可以使用association标签进行关联映射一对一时可以使用association标签进行关联映射mybatis不能处理多对多关联(正确答案)89. 在MyBatis中,mapper.xml的SQL语句中的占位符${}和#{}描述错误的是()一般会采用#{},#{}在mybatis中,最后会被解析为?,其实就是Jdbc的PreparedStatement中的?占位符,它有预编译的过程,可以防止SQL注入#{}中的变量名可以任意,如果入参类型是pojo,比如是Student类那么#{name}表示取入参对象Student中的name属性${}取对象的属性使用的是OGNL(Object Graph Navigation Language)表达式${}不会做类型解析,但不存在SQL注入的风险(正确答案)90. 在MyBatis中,MyBatis是那一层的框架业务逻辑层表示层持久层(正确答案)数据库层91. 在MyBatis中,关于MyBatis中传递多参数的情况,如果参数封装成Java Bean,应该怎么获取属性值通过#{参数名.属性名}通过#{arg0}来获得通过#{arg1}来获得通过#{成员属性}来获得(正确答案)92. 在MyBatis中,关于MyBatis中传递多参数的情况,如果参数封装成了Student 类,那么在Mapper.xml中获取数据,应该怎么操作条件获取数据可以通过#{属性名}来获得(正确答案)条件获取数据可以通过#{arg0}来获得条件获取数据可以通过#{arg1}来获得条件获取数据可以通过#{属性名}或者#{arg0}来获得93. 在MyBatis中,以下对MyBatis主配置文件描述错误的是()它主要提供数据库连接信息引用sql映射文件在其中定义具体的sql映射信息(正确答案)在其中定义了影响MyBatis行为的设置及其相关的属性信息94. 在MyBatis中,什么是DAO模式数据库访问对象(正确答案)关系对象对象持久化业务逻辑处理95. 在MyBatis中,持久层设计要考虑的范畴有哪些【选两项】数据存储逻辑分离(正确答案)数据访问底层实现的分离(正确答案)界面操作的易用性UI设计和数据库搭配96. 在MyBatis中,MyBatis如何执行批处理使用BatchExecutor完成批处理(正确答案)使用SimpleExecutor完成批处理任一executor均可实现无法进行批处理97. 在MyBatis中,不同的XML映射文件,id是否可以重复任何情况都不能重复不管陪不配置namespace,id均不可以重复如果配置namespace,id可以重复(正确答案)以上均不对98. 在MyBatis 中,映射器是中最重要、最复杂的组件,它由一个接口和对应的XML 文件(或注解)组成。

mybatis中的一二级缓存的实现原理

mybatis中的一二级缓存的实现原理

mybatis中的一二级缓存的实现原理Mybatis是一个优秀的ORM(ObjectRelationalMapping)框架,它提供了一种简单的方式来访问数据库。

在Mybatis中,缓存是一个非常重要的概念,它可以提高应用程序的性能。

Mybatis中的缓存分为一级缓存和二级缓存,下面将详细介绍它们的实现原理。

一级缓存Mybatis中的一级缓存是指在同一个SqlSession中执行相同的SQL语句时,返回的结果会被缓存起来,下一次执行相同的SQL语句时,可以直接从缓存中获取结果,而不需要再次查询数据库。

一级缓存的实现是基于内存的,缓存的生命周期与SqlSession的生命周期一致。

一级缓存是Mybatis默认开启的,可以通过SqlSession的clearCache()方法来清空一级缓存。

二级缓存Mybatis中的二级缓存是指在同一个应用程序中多个SqlSession之间共享缓存数据,它的作用是提高应用程序的性能。

二级缓存的实现是基于缓存机制的,缓存的生命周期与应用程序的生命周期一致。

二级缓存是通过使用单独的缓存空间来实现的,可以使用第三方缓存框架如Ehcache、Redis等来实现。

Mybatis中的二级缓存的使用需要注意以下几点:1. Mapper文件中需要配置开启二级缓存<cacheeviction='LRU'flushInterval='100000'size='1024'readOnly='true'/>2. 对于需要缓存的对象,需要实现Serializable接口3. 在不同的SqlSession中使用同一个Mapper,才能共享缓存数据4. 对于更新、插入、删除操作,会清空相关的缓存总结:Mybatis中的缓存是提高应用程序性能的重要手段,一级缓存和二级缓存的实现原理不同,使用时需要注意它们的区别和限制条件。

mybatis之脏数据产生与避免

mybatis之脏数据产生与避免

mybatis之脏数据产⽣与避免⼀、脏数据产⽣ ⼆级缓存虽然能提⾼应⽤效率,减轻数据库服务器的压⼒,但是如果使⽤不当,很容易产脏数据,这些脏数据会在不知不觉中影响业务逻辑,影响应⽤的实效,所以我们需要了解在MyBat 缓存中脏数据是如何产⽣的,也要掌握避免脏数据的技巧。

MyBatis⼆级缓存是和命名空间绑定的,所以通常情况下每 Mapper 映射⽂件都拥有⾃⼰的⼆级缓存,不同 Mapper ⼆级缓存互不影。

在常见的数据库操作中,多表联合查询⾮常常见,由于关系型数据库的设计使得很多时候需要关联多个表才能获得想要的数据。

在关联多表查询时肯定会将该查询放到某个命名空间下的映射⽂件中,这样⼀个多表的查询就会缓存在该命名空间的⼆级缓存中。

涉及这些表的增、删、改操作通常不在个映射⽂件中,它们的命名空间不同,当有数据变时,多表查询的缓存未必会被清空,这种情况下就会产⽣脏数据。

现在我们先来模拟⼀下脏数据是如何产⽣的。

1. 准备⼯作:UserMapper.xml和RoleMapper.xml中分别设置⼆级缓存:<mapper namespace="erMapper"><cacheeviction="FIFO"flushInterval="6000"size="512"readOnly="false"/></mapper><mapper namespace="com.example.simple.mapper.RoleMapper"><cacheeviction="FIFO"flushInterval="6000"size="512"readOnly="false"/></mapper>SysRole.java和SysUser.java序列化实现:public class SysUser implements Serializable {private static final long serialVersionUID = 6320941908222932112L ;}public class SysRole implements Serializable {private static final long serialVersionUID = 6320941908222932112L ;}2. 准备代码测试:@Testpublic void testDirtyDate(){SqlSession sqlSession = getSqlSession();try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);SysUser user = userMapper.selectUserAndRoleById(1001L);Assert.assertEquals("普通⽤户",user.getRole().getRoleName());System.out.println("⾓⾊名:" + user.getRole().getRoleName());}finally {sqlSession.close();}System.out.println("开启⼀个新的session");sqlSession = getSqlSession();try{RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);SysRole role = roleMapper.selectById(2L);role.setRoleName("脏数据");//提交修改mit();}finally {sqlSession.close();}System.out.println("开启第⼆个新的session");sqlSession = getSqlSession();try{UserMapper userMapper = sqlSession.getMapper(UserMapper.class);RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);SysUser user = userMapper.selectUserAndRoleById(1001L);SysRole role = roleMapper.selectById(2l);Assert.assertEquals("普通⽤户" , user.getRole().getRoleName());Assert.assertEquals("脏数据" , role.getRoleName());;System.out.println("⾓⾊名:" + user.getRole().getRoleName());//还原数据role.setRoleName("普通⽤户");roleMapper.updateById(role);mit();}finally {sqlSession.close();}}测试后结果:DEBUG [main] - Cache Hit Ratio [erMapper]: 0.0DEBUG [main] - ==> Preparing: select u.id, er_name userName, er_password userPassword, er_email userEmail ,er_info userInfo , u.head_img headImg, u.create_time createTime , r.id "role.id", r.role_name "role.roleName" , r.enabled "role.enabled" , r.create_by "role.createBy", r.create_time "role.createTime" from sys_user u inner join sys_user_role ur on u.id = er_id inner joinsys_role r on ur.role_id = r.id where u.id = ?DEBUG [main] - ==> Parameters: 1001(Long)TRACE [main] - <== Columns: id, userName, userPassword, userEmail, userInfo, headImg, createTime, role.id, role.roleName,role.enabled, role.createBy, role.createTimeTRACE [main] - <== Row: 1001, test, 123456, test@, <<BLOB>>, <<BLOB>>, 2020-12-01 20:05:01, 2, 普通⽤户, 1, 1, 2020-12-01 20:05:04DEBUG [main] - <== Total: 1⾓⾊名:普通⽤户开启⼀个新的sessionDEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.0DEBUG [main] - ==> Preparing: select id, role_name,enabled,create_by,create_time from sys_role where id = ?DEBUG [main] - ==> Parameters: 2(Long)TRACE [main] - <== Columns: id, role_name, enabled, create_by, create_timeTRACE [main] - <== Row: 2, 普通⽤户, 1, 1, 2020-12-01 20:05:04DEBUG [main] - <== Total: 1开启第⼆个新的sessionDEBUG [main] - Cache Hit Ratio [erMapper]: 0.5DEBUG [main] - Cache Hit Ratio [com.example.simple.mapper.RoleMapper]: 0.5⾓⾊名:普通⽤户DEBUG [main] - ==> Preparing: update sys_role set enabled = ? where id = ?DEBUG [main] - ==> Parameters: 1(Integer), 2(Long)DEBUG [main] - <== Updates: 1测试的思路和脏数据产⽣分析是:第⼀个sqlSession负责先关联⽤户表和⾓⾊表将user_id = 1001L的⽤户信息和⾓⾊信息查询出来;第⼆个sqlSession负责将上⼀个sqlSession中查询到的⾓⾊信息对应的role_id进⾏再查询,并对role_name进⾏赋值,使得role_name被赋予新值;第三个sqlSession分别通过SysUser类和SysRole类获取⾓⾊name,发现两者取出来的值并不⼀样,这时就出现了脏数据,这时因为UserMapper.xml和RoleMapper.xml中分别设置的⼆级缓存互不影响,这时就出现了同⼀⾓⾊对应两个name。

mybatis一级缓存和二级缓存原理

mybatis一级缓存和二级缓存原理

mybatis一级缓存和二级缓存原理
MyBatis一级缓存和二级缓存是MyBatis框架提供的两种缓存机制,用于提高数据读取性能。

一级缓存是指在MyBatis中SqlSession级别的缓存,它是默认开启的。

当SqlSession执行某个查询语句时,查询结果会被缓存到一级缓存中。

当再次执行同样的查询语句时,MyBatis会先从一级缓存中查找结果,如果存在,则直接返回缓存中的结果,否则再去数据库中查询。

一级缓存的生命周期与SqlSession的生命周期一致,只有在SqlSession关闭或清空缓存时才会失效。

二级缓存是指在MyBatis中全局范围的缓存,它是需要手动配置的。

当SqlSession执行某个查询语句时,查询结果会被缓存到二级缓存中。

当再次执行同样的查询语句时,MyBatis会先从二级缓存中查找结果,如果存在,则直接返回缓存中的结果,否则再去数据库中查询。

二级缓存的生命周期与应用程序的生命周期一致,只要应用程序没有关闭,二级缓存就会一直存在。

需要注意的是,一级缓存和二级缓存并不是完全相同的机制。

一级缓存是在SqlSession级别的缓存,而二级缓存是在全局范围的缓存。

一级缓存是默认开启的,而二级缓存需要手动配置。

另外,一级缓存只能用于同一个SqlSession中的查询,而二级缓存可以跨SqlSession共享缓存。

不过,由于二级缓存是全局缓存,所以需要考虑并发访问的问题,仅在数据更新不频繁且数据量较小的情况下才适用。

缓存--java三级缓存、Mybatis的二级缓存

缓存--java三级缓存、Mybatis的二级缓存
二级缓存
mapper.第一次调用mapper去查存入,第一次调用namespace下的mapper去查.
所谓缓存即每次读取数据先去缓存中读没有再去数据库里找以此来提高性能与效率
缓存 --java三级缓存、 Mybatis的二级缓存
Java缓存和Mybatis缓存 每一次的笔记都是当初面试官给我的打击...... 所谓缓存,即每次读取数据先去缓存中读,没有再去数据库里找,以此来提高性能与效率
Java缓存
一级缓存
栈:一级缓存,用完即释放
二级缓存
堆:二级缓存,垃圾回收算法进行回收
三级缓存三级缓存: 1Fra bibliotek内存缓存(LRUCache最近最少引用算法) 2.本地缓存(File存储) 3.网络缓存(网络下载获取)
Mybatis缓存
一级缓存
存入SQLSession.若两次查询中发生了CRUD操作,则要清空SQLSession(以此保证数据一致性)

解析Mybatis延迟加载问题

解析Mybatis延迟加载问题

解析Mybatis延迟加载问题延迟加载问题MyBatis针对关联表中的数据⽀持延迟加载。

延迟加载其实就是将数据加载时机推迟,⽐如推迟嵌套查询的执⾏时机。

延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,⼀定程度上提⾼了效率。

<settings><!-- 启⽤延迟加载特性,不配置默认关闭该特性--><setting name="lazyLoadingEnabled" value="true" /><!-- 按需加载: false:使⽤关联属性时才进⾏加载; true加载对象,则加载所有属性 --><setting name="aggressiveLazyLoading" value="false"/></settings>lazyLoadingEnabled:是否启⽤延迟加载,默认值为false,不启⽤延迟加载。

lazyLoadingEnabled属性控制全局是否使⽤延迟加载,特殊关联关系也可以通过嵌套查询中fetchType属性单独配置(fetchType属性值可以是lazy或者eager)aggressiveLazyLoading:是否按需加载属性,默认值false,lazyLoadingEnabled属性启⽤时只要加载对象,就会加载该对象的所有属性;关闭该属性则会按需加载,即使⽤到某关联属性时,实时执⾏嵌套查询加载该属性对⼀<resultMap id="ExtResultMap" type="er" extends="BaseResultMap"><association property="role" select="com.yan.dao.RoleMapper.selectByPrimaryKey" column="role_id"/></resultMap>如果不访问role属性,则不会执⾏t_roles表的查询。

通用源码阅读指导书——mybatis源码详解

通用源码阅读指导书——mybatis源码详解

通用源码阅读指导书——mybatis源码详解Mybatis是一款优秀的ORM框架,广泛应用于Java项目中。

但是,对于很多Java开发者来说,mybatis源码还是一个难题。

本指导书将带您深入了解mybatis源码,帮助您更好地理解该框架的底层原理。

第一章:mybatis框架简介1.1 mybatis框架的概念1.2 mybatis框架的优点1.3 mybatis框架的缺点第二章:mybatis的体系结构2.1 mybatis的整体架构2.2 mybatis的主要组成部分2.3 mybatis的工作流程第三章:mybatis源码结构3.1 mybatis源码的目录结构3.2 mybatis源码的包结构3.3 mybatis源码的重要类解析第四章:mybatis的配置解析4.1 mybatis的配置文件4.2 mybatis的配置加载过程4.3 mybatis的配置解析流程第五章:mybatis的Mapper解析5.1 mybatis的Mapper文件5.2 mybatis的Mapper文件解析5.3 mybatis的Mapper文件与Java接口的映射第六章:mybatis的核心流程分析6.1 mybatis的核心组件6.2 mybatis的数据源管理6.3 mybatis的SqlSessionFactory6.4 mybatis的SqlSession6.5 mybatis的MapperProxy6.6 mybatis的Executor第七章:mybatis的插件机制7.1 mybatis的插件机制简介7.2 mybatis的插件实现方式7.3 mybatis的插件使用方法第八章:mybatis的缓存机制8.1 mybatis的缓存机制简介8.2 mybatis的一级缓存8.3 mybatis的二级缓存8.4 mybatis的缓存机制配置第九章:mybatis的优化与扩展9.1 mybatis的性能优化9.2 mybatis的扩展机制9.3 mybatis的自定义类型处理器结语:mybatis源码解读的意义通过本指导书的学习,您将深入了解mybatis源码的底层原理,掌握mybatis的核心组件、插件机制、缓存机制等内容,为您的日常开发工作提供帮助。

Mybatis的一级缓存和二级缓存的理解以及用法

Mybatis的一级缓存和二级缓存的理解以及用法

Mybatis的⼀级缓存和⼆级缓存的理解以及⽤法 程序中为什么使⽤缓存? 先了解⼀下缓存的概念:原始意义是指访问速度⽐⼀般随机存取存储器快的⼀种RAM,通常它不像系统主存那样使⽤DRAM技术,⽽使⽤昂贵但较快速的SRAM技术。

对于我们编程来说,所谓的缓存,就是将程序或系统经常要调⽤的对象(临时数据)存在内存中,⼀遍其使⽤时可以快速调⽤,不必再去创建新的重复的实例。

这样做可以减少系统的开销,提⾼效率。

对缓存有了⼀定的了解以后就知道了使⽤缓存是为了减少和数据库的交互次数,提⾼执⾏效率。

那么下⼀个问题来了。

什么样的数据能使⽤缓存,什么样的数据不能使⽤? 这是我们使⽤缓存必须要明确的事情,实际上适⽤于缓存的数据:经常查询并且不经常改变的,并且的数据的正确与否对最终结果影响不⼤的、不适⽤于缓存的数据:经常改变的数据,数据的正确与否对最终结果影响很⼤的。

Mybatis中的⼀级缓存和⼆级缓存到底缓存了什么,缓存了以后⼜有什么效果,缓存的数据什么时候会被清空? ⼀级缓存:它指的是Mybatis中sqlSession对象的缓存,当我们执⾏查询以后,查询的结果会同时存⼊到SqlSession为我们提供的⼀块区域中,该区域的结构是⼀个Map,当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,的话直接拿出来⽤,当SqlSession对象消失时,mybatis的⼀级缓存也就消失了,同时⼀级缓存是SqlSession范围的缓存,当调⽤SqlSession的修改、添加、删除、commit(),close等⽅法时,就会清空⼀级缓存。

⼆级缓存:他值得是Mybatis中SqlSessionFactory对象的缓存,由同⼀个SqlSessionFactory对象创建的SqlSession共享其缓存,但是其中缓存的是数据⽽不是对象,所以从⼆级缓存再次查询出得结果的对象与第⼀次存⼊的对象是不⼀样的。

通过简单的例⼦来加深理解⼀级缓存和⼆级缓存。

信思智学java三阶段考试试题

信思智学java三阶段考试试题

一、单项选择题(每题2分,共40分)1.如果要告知Mybatis,创建的资源文件的路径,下列哪组标签格式正确(B)A <mapping resource="sram/beans/UserMapper.xml"/>B <mapper resource="sram/beans/UserMapper.xml" />C <property resource="sram/beans/UserMapper.xml" />D <mapping resource="erMapper.xml"/>2.实体类的映射文件UserMapper.xml中的<insert> 标签中INSERT语句中要获取User对象的属性,下列哪种格式正确(D)A (username)B {username}C #(username)D #{username}erMapper.xml执行查询语句SELECT * FROM t_user 有返回结果,如何表示(B)A property ="er"B resultType="er"C parameterType="er"D result="er"4.Mybatis与数据库打交道的核心对象是C)A SessionB SessionFactoryC SqlSessionD SqlSessionFactory5.当向数据库中插入User对象时,Mybatis如何找到映射文件中的INSERT语句(A)A 通过命名空间下的id 来找到要执行的映射文件中的sql语句B 通过命名空间下的name 来找到要执行的映射文件中的sql语句C 通过映射文件中对应SQL语句的id直接执行对应的语句D 通过映射文件中对应SQL语句的name直接执行对应的语句6.下列代码运行会报错的是(B)A @Insert("INSERT INTO t_user (username) V ALUES (#{username})")public abstract void save(User user);B @Update("UPDATE t_user SET username = #{username} WHERE id = #{id}")public abstract void update(User user);C @Select("SELECT * FROM t_user")public abstract User getAllUsers();D @Select("SELECT * FROM t_user WHERE id = #{id}")public abstract User load(int id);7.对以下代码解释错误的是(C)A 这段代码是XML配置文件和Mapper配合使用B 在测试时可以通过mapper.save(user)来插入对象C UserMapper对应的插入方法名字可以是add()D 单独使用XML配置的时候namespace="er"8.当传递两个参数时,XML配置如下,下列Mapper中对应的方法正确的是(D)A public abstract User getUser(String username,String password);B public abstract User getUser(@Param("username")Stringusername,@Param("pass")String password);C public abstract User getUserByUsernameAndPassword(String username,String password);D public abstract UsergetUserByUsernameAndPassword(@Param("username")String username,@Param("pass")String password);9.对下列代码解释正确的是(D)A 如果前两个when条件都成立,那么otherwise条件也一定会执行B 当要有一个when条件成立,其余when条件也做执行C 如果choose中条件都为空,打印出的SQL语句为SELECT * FROM t_user WHERE id = ? AND realname = ?D 如果用户名和密码都存在,打印出的SQL语句为SELECT * FROM t_user WHERE id = ? AND username= ? AND password=?10.动态的添加WHERE 条件,如果username不为空,则对应的SQL语句为(B)A SELECT * FROM t_user WHERE username = ?B SELECT * FROM t_user AND username = ?C SELECT * FROM t_user WHERE AND username = ?D SELECT * FROM t_user WHERE username = ? AND password=? AND realname=?11.UPDATE 语句中,如果username不为空,则打印出来的SQL语句为(C)A UPDATE t_user username = ? WHERE id = ?B UPDATE t_user SET username = ? WHERE id = ?C UPDATE t_user SET username = ?, WHERE id = ?D UPDATE t_user SET username = ? AND password=? WHERE id = ?12.Mybatis的二级缓存中在配置文件中出现如下代码,解释错误的是(D)A eviction="LRU" 代表缓存算法,默认值,可以不写B flushInterval="6000" 代表刷新间隔时间,单位为毫秒C size="1024"代表缓存的对象个数D readOnly="true" 代表如果当前缓存一部分数据,再次获取这部分数据时从数据库中取13.在SpringMVC-servlet.xml中配置MyController类的正确代码是(A)A <bean id="/SpringMVC" class="sram.controller.MyController"></bean>B <bean name="/SpringMVC" class="sram.controller.MyController"></bean>C <mapper id="/SpringMVC"class="sram.controller.MyController"></mapper >D <mapper name="/SpringMVC"class="sram.controller.MyController"></mapper >14.下列代码为基于注解的请求映射,解释错误的是(D)A @RequestMapping("/user")代表添加一个全局的请求路径B @RequestMapping("/userAdd")代表给某个方法映射请求路径C 基于注解的请求映射MyController 类不再需要继承MultiActionControllerD 以上代码中的@RequestMapping都可以省略15.以下是一位同学写的一段Rest风格接收参数代码,说法错误的是(C)A {userId}相当于占位符的意思B ("userId")前面应该加路径变量注解C 代码有误,@Param应修改为@PathVariableD 代码有误,应该把@Param去掉16.以下关于方法请求映射路径正确的是(A)A @RequestMapping(value={"userAdd/**"})地址栏访问此方法userAdd/abc userAdd/abc/defB @RequestMapping(value={"userAdd/*"})地址栏只能通过userAdd/a来访问C @RequestMapping(value={"userAdd?"}) userAdd后面可以跟一个或多个字符D @RequestMapping(value={"userAdd*"}) userAdd后面必须跟一个或多个字符17.对以下代码分析正确的是(D)A 地址栏通过param1?str=zs可以访问,不会报错B 地址栏通过param1?str=zs&a=10,a接收不到数据C 把int换成Integer,地址栏通过param1?str=zs可以访问D 把int换成Integer,地址栏通过param1?str=zs,后台a得到zs~~018.对以下代码分析错误的是(D)A @RequestParam代表请求参数B required=false,默认为true,必须要传递该参数,改为false则可以不用传C defaultValue="admin",当设置false时可以手动绑定一个默认值D value="user" 有或者没有value值时,传递过来的参数名称可以都为str19.关于文件上传的说法错误的是(C)A 需要导入commons-fileupload-1.2.2.jar和commons-io-2.4.jar两个jar包B 需要在springMVC-servlet.xml中配置上传解析器C 上传文件时可以不用加请求参数@RequestParam("file")D 多文件上传时用数组接收,循环判断接收20.不是Mybatis配置文件中的主要元素是(D)A propertiesB transactionManagerC mappersD bean二、判断题(每题1分,共10分)1.实体类的映射文件XXXMapper.xml中的<insert> 标签中的parameterType属性表示参数类型,是执行insert语句时传递过来的XXX对象(✔)2.Mybatis中如果要使用注解配置,则要提供一个UserMapper类(✔)3.当需要执行不同的SQL语句时,可以通过标签条件,动态的调整SQL语句(✔)4.Mybatis的缓存机制中,如果第二次执行相同语句时会再次查询数据库(✖)5.设置是否使用缓存,可以在语句select标签中添加useCache=”true”(✖)6.在视图解析器中<property name="prefix" value="/abc/">代表增加后缀(✔)7.@RequestMapping给方法映射请求路径时可以一个请求映射不同的路径(✔)8.SpringMVC处理数据默认为转发(✔)(不确定)9.当出现错误信息时最好转发到错误界面(✔)10.SpringMVC的拦截器可以在Controller与jsp界面的任何地方实行拦截(✖)三、填空题(每空1分,共10分)1.Spring set注入对象的注解是_____@Autowired_____或者___@Qualifier_______。

SpringBootvsMyBatis面试题集

SpringBootvsMyBatis面试题集

SpringBootvsMyBatis面试题集Spring Boot vs MyBatis 面试题集在面试过程中,Spring Boot 和 MyBatis 是两个经常涉及的主题。

以下是一些常见的 Spring Boot 和 MyBatis 面试题,旨在帮助你更好地理解和应对这两个技术的问题。

1. 什么是 Spring Boot?Spring Boot 是一个用于开发现代化和生产级别的 Java 应用程序的框架。

它通过提供自动化和约定大于配置的原则,简化了 Spring 应用程序的搭建和部署过程。

Spring Boot 集成了大量常用的第三方库和框架,并且具有内置的容器,可快速开发和运行应用程序。

2. 什么是 MyBatis?MyBatis 是一个开源的 Java 持久化框架,它简化了数据库操作的开发过程。

MyBatis 通过将 SQL 语句与代码分离,提供了一种优雅的方式来管理数据库查询。

它支持定制化 SQL、存储过程和高级映射。

3. Spring Boot 和 MyBatis 有什么区别?Spring Boot 是一个应用程序框架,提供了自动化配置和开箱即用的功能,而 MyBatis 是一个持久化框架,用于执行和管理数据库操作。

Spring Boot 提供了与 MyBatis 的集成支持,使得在使用 MyBatis 时更加便捷。

4. 如何在 Spring Boot 中集成 MyBatis?在 Spring Boot 中集成 MyBatis 非常简单。

只需添加相关依赖,配置数据源和 MyBatis 的相关属性即可。

可以通过在 application.properties 或 application.yml 文件中配置数据库连接信息和 MyBatis 相关属性。

然后,为 MyBatis 的 Mapper 接口添加 @Mapper 注解,从而将其扫描并纳入 Spring Boot 的上下文中。

5. 什么是 Spring Data JPA?Spring Data JPA 是 Spring Framework 提供的用于简化数据库操作的模块。

mybatis 二级缓存实现原理

mybatis 二级缓存实现原理

mybatis 二级缓存实现原理MyBatis是一个流行的持久层框架,它提供了二级缓存来提高数据库访问性能。

二级缓存可以在多个会话之间共享数据,从而减少数据库访问次数,提高系统性能。

下面我将从多个角度来解释MyBatis二级缓存的实现原理。

1. 缓存范围,MyBatis的二级缓存是SessionFactory级别的缓存,也就是说,多个SqlSession共享同一个二级缓存。

当多个会话对同一数据进行操作时,第一个会话查询的数据会被放入二级缓存中,后续的会话可以直接从缓存中获取数据,而不需要再次访问数据库。

2. 缓存实现机制,MyBatis的二级缓存是通过Cache接口来实现的,它提供了缓存数据的存储、读取和移除等操作。

MyBatis默认使用PerpetualCache作为二级缓存的实现,它采用HashMap来存储缓存数据。

3. 缓存更新策略,MyBatis的二级缓存采用了基于时间戳和事务的缓存更新策略。

当一个会话对数据进行了更新、插入或删除操作时,会清空该数据对应的缓存项,从而保证缓存数据的一致性。

此外,MyBatis还提供了flushCache属性来控制是否在执行SQL语句后清空缓存。

4. 缓存配置,MyBatis的二级缓存可以通过配置文件进行开启和关闭。

在MyBatis的配置文件中,可以使用<setting>元素的<setting name="cacheEnabled" value="true"/>来开启二级缓存。

5. 缓存失效,MyBatis的二级缓存可以通过配置缓存的失效时间来控制缓存数据的有效期。

当缓存中的数据超过设定的时间没有被访问时,数据将失效并被移除。

总的来说,MyBatis的二级缓存实现原理是通过缓存范围、缓存实现机制、缓存更新策略、缓存配置和缓存失效等多个方面来保证数据的一致性和有效性,从而提高系统的性能和并发访问能力。

MyBatis经典面试题及答案

MyBatis经典面试题及答案

MyBatis经典⾯试题及答案1、什么是MyBatis?答:MyBatis是⼀个可以⾃定义SQL、存储过程和⾼级映射的持久层框架。

2、讲下MyBatis的缓存答:MyBatis的缓存分为⼀级缓存和⼆级缓存,⼀级缓存放在session⾥⾯,默认就有,⼆级缓存放在它的命名空间⾥,默认是不打开的,使⽤⼆级缓存属性类需要实现Serializable序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置<cache/>1、⼀级缓存的⽣命周期有多长?a、MyBatis在开启⼀个数据库会话时,会创建⼀个新的SqlSession对象,SqlSession对象中会有⼀个新的Executor对象。

Executor对象中持有⼀个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也⼀并释放掉。

b、如果SqlSession调⽤了close()⽅法,会释放掉⼀级缓存PerpetualCache对象,⼀级缓存将不可⽤。

c、如果SqlSession调⽤了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使⽤。

d、SqlSession中执⾏了任何⼀个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使⽤2、怎么判断某两次查询是完全相同的查询?mybatis认为,对于两次查询,如果以下条件都完全⼀样,那么就认为它们是完全相同的两次查询。

2.1 传⼊的statementId2.2 查询时要求的结果集中的结果范围2.3. 这次查询所产⽣的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )2.4 传递给java.sql.Statement要设置的参数值如果我们配置了⼆级缓存就意味着:映射语句⽂件中的所有select语句将会被缓存。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ”。

相关文档
最新文档