Mybatis的二级缓存配置
- 格式:docx
- 大小:16.63 KB
- 文档页数:2
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⼆级缓存使⽤:官⽅建议在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工具包,它能够提供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区别及对⽐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 提供了两级缓存机制,即一级缓存和二级缓存。
这两级缓存的原理如下:
1. 一级缓存(SqlSession 级别的缓存):
一级缓存是在同一个 SqlSession 中,对于相同的查询条件,只会执行一次SQL 查询,查询结果被缓存起来,后续的相同查询可以直接从缓存中获取结果,避免了重复的数据库查询操作。
一级缓存是基于 SqlSession 对象的,也就是说,只要 SqlSession 不关闭,一级缓存就会一直存在。
2. 二级缓存(Mapper 级别的缓存):
二级缓存是跨 SqlSession 的,也就是说,即使在不同的 SqlSession 中,只要查询条件相同,就可以共享同一个查询结果。
二级缓存是基于 Mapper 接口的,可以在多个 Mapper 之间共享数据。
二级缓存可以配置为只对某些特定的 Mapper 或者全局启用。
MyBatis 的两级缓存机制可以有效地减少对数据库的访问次数,提高应用程序的性能。
但是需要注意的是,由于二级缓存是跨 SqlSession 的,因此在使用二级缓存时需要特别注意线程安全问题,以及在 SqlSession 关闭或者清空缓存时要正确地处理缓存数据。
《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(⼀对⼀、⼀对多、多对多的设计及实现,⾼级特性及⼆级缓存)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数据持久化框架》笔试题库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是一个优秀的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的二级缓存配置相当容易,要开启二级缓存,只需要在你的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 ”。