redis一级缓存和二级缓存_面试官让面试者先回去

redis一级缓存和二级缓存_面试官让面试者先回去说起mybatis,大家可能都知道它是一个优秀的久层框架,它支持定制化SQL、存储过程以及高级映射。面试中都会问起mybatis一级缓存和二级缓存,它体现出你对mybatis这个开发中的理解,如果照着答案背的话只能拿到一个及格分,所以今天咱们就好好聊聊mybatis。另外本人整理了20年面试题大全,包含spring、并发、数据库、Redis、分布式、dubbo、JVM、微服务等方面总结,下图是部分截图,需要的话点这里点这里,暗号CSDN。1.首先,什么是Mybatis?MyBatis是一.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

说起mybatis,大家可能都知道它是一个优秀的久层框架,它支持定制化SQL、存储过程以及高级映射。面试中都会问起mybatis一级缓存和二级缓存,它体现出你对mybatis这个开发中的理解,如果照着答案背的话只能拿到一个及格分,所以今天咱们就好好聊聊mybatis。
在这里插入图片描述

另外本人整理了20年面试题大全,包含spring、并发、数据库、Redis、分布式、dubbo、JVM、微服务等方面总结,下图是部分截图,需要的话点这里点这里,暗号CSDN。

在这里插入图片描述

1.首先,什么是Mybatis?

  • MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。

  • 我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。

2.mybatis的框架

在这里插入图片描述

3.重点来了,讲下 MyBatis 的缓存

在这里插入图片描述

Mybatis对缓存提供支持,一级缓存是默认使用的,二级缓存需要手动开启。

区别:

  • 一级缓存的作用域是一个sqlsession内;
  • 二级缓存作用域是针对mapper进行缓存;

一级缓存:

在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
一级缓存简单示意图
一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。

二级缓存:

二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

在这里插入图片描述
1、在配置文件中 开启二级缓存的总开关

<setting name="cacheEnabled" value="true" />

2、 在mapper映射文件中开启二级缓存

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

参数名属性eviction收回策略flushInterval刷新间隔size引用数目readOnly只读

关于eviction的各个参数属性:

  • 参数名属性eviction=”LRU”最近最少使用的:移除最长时间不被使用的对象。
  • (默认)eviction=”FIFO”先进先出:按对象进入缓存的顺序来移除它们。
  • eviction=”SOFT”软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • eviction=”WEAK”弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

3、实体类实现Serializable

禁用缓存

如测试sql语句性能时缓存会影响测试准确性 需要禁用在映射文件中:默认值是true useCache=”false”

<select id="findAllPets" resultMap="petsMap" useCache="false">
 select * from pets
</select>

刷新缓存

在映射文件中:属性:flushCache=”true”刷新缓存,在查询语句中,默认值是false,在新增删除修改语句中,默认值是true(清空缓存)

4.Mybatis 是如何进行分页的?分页插件的原理是什么?

答:

  • Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql 实现分页,也可以使用Mybatis 的分页插件。
  • 分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql。
  • 举例:select * from student,拦截 sql 后重写为:select t.* from (select * from student)tlimit 0,10

5.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

答:

  • Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。

6.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

在这里插入图片描述

答:

  • Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
  • 它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。

7.MyBatis 与 Hibernate 有哪些不同?

答:

  • Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对象。
  • Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。
  • Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

8.MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?

答:MyBatis 里面的动态 Sql 一般是通过 if 节点来实现,通过 OGNL 语法来实现,但是如果要
写的完整,必须配合 where,trim 节点,where 节点是判断包含节点有内容就插入 where,否则不
插入,trim 节点是用来判断如果动态语句是以 and 或 or 开始,那么会自动把这个 and 或者 or
取掉。

9.Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

答:
第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对象属性名一般是 name,小写,但是列名不区分大小写,Mybatis 会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成 T_NAME AS NaMe,Mybatis 一样可以正常工作。

有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

10.当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?

答:
1)通过在查询的 sql 语句中定义字段名的别名。
2)通过来映射字段名和实体类属性名的一一对应的关系。

11.模糊查询 like 语句该怎么写

答:
1)在 java 中拼接通配符,通过#{}赋值
2)在 Sql 语句中拼接通配符 (不安全 会引起 Sql 注入)

最后:

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2020收集的一些大厂的面试真题(都整理成文档,小部分截图),有需要的可以点击进入暗号CSDN

在这里插入图片描述
最后的惯例:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191389.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java Calendar 日历类的时间操作 Timestamp Date Calendar 相互转换

    Java Calendar 日历类的时间操作 Timestamp Date Calendar 相互转换JavaCalendar日历类的时间操作,这也许是Java环境下创建和管理日历及操作时间最简单的一个方案了,示范代码也很简单。演示了获取时间,日期时间的累加和累减,以及日期时间的比较。原文地址:blog.csdn.net/joyous/article/details/9630893注意事项:Calendar的month从0开始,也就是全年12个月由0~1…

  • wireshark抓包分析——TCP/IP协议[通俗易懂]

    wireshark抓包分析——TCP/IP协议[通俗易懂]本文来自网易云社区当我们需要跟踪网络有关的信息时,经常会说“抓包”。这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通过wireshark抓包分析。Wireshark是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。Wireshark下载安装,略。注意,若在Windows系统安装Wireshar…

  • VMware虚拟机安装DOS6.22

    VMware虚拟机安装DOS6.22

  • 关于charles抓包https乱码的设置[通俗易懂]

    关于charles抓包https乱码的设置[通俗易懂]关于charles抓包https乱码的设置charles安装本地证书首先我们点击help->SSLProxying->InstallCharlesRootCertificate安装证书。默认安装证书是不受信任的,双击打开证书,打开信任选择项,将使用此证书时这是为始终信任。安装手机证书点击help->SSLProxying->Inst…

  • minicom指令_如何优雅地使用minicom

    minicom指令_如何优雅地使用minicomminicom简介安装minicom是linux下一款常用的串口调试工具。ubuntu环境下,使用如下命令安装sudoapt-getinstallminicom配置使用前需要进行配置,执行sudominicom-s可打开minicom并进入配置模式,使用方向键,选择需要配置的项目,如Serialportsetup,回车进入配置,可以看到多个配置项,此时光标在最下方。需要修改某个配…

  • 自定义 QTreeView

    自定义 QTreeView自定义QTreeView交替行的背景色可以使用下面样式代码来定义:QTreeView{alternate-background-color:yellow;}123123当鼠标划过item时,如果要提供一个特殊的背景色,可以使用 ::item 辅助控制,例如:QTreeView{show-decoration-selected:1;}

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号