mybatis面试题

news/发布时间2024/5/20 7:53:18

MyBatis

  1. MyBatis基本要素:
    ·configuration.xml 全局配置文件【SqlMapConfig.xml文件】
    · xml映射文件(mapper)—实体类
    ·SqlSession接口

2.mybatis的主要执行流程?

mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的 信息。
mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。
通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。
SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。
该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。
3、MyBatis的生命周期
Mybatis组件生命周期如图所示:

1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去作用,所以它只能存在于创建SqlSessionFactory的方法中,而不要让其长期存在。

2、SqlSessionFactory
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不在使用MyBatis应用,所以可以认为SqlSessionFactory的生命周期就等同与MyBatis的应用周期。

由于SqlSessionFactory是对一个数据库的连接池,所以它占据着数据库的连接资源。如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,不利于对数据库资源的控制,也将导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免出现这种情况。因此在一般的应用中,我们往往希望SqlSessionFactory作为一个单例,让它在应用中被共享。

3、SqlSession
如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(Connection对象),我们可以在一个事务中执行多条SQL,然后通过它的commit、rollback等方法,提交或回滚事务。所以SqlSession应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源将被耗光,系统瘫痪,所以使用try...catch...finally语句来保证SqlSession正确关闭。

4、Mapper
Mapper是一个接口,它由SqlSession所创建,所以它的最大生命周期至多和SqlSession保持一致,当SqlSession关闭时,Mapper的数据库连接资源也会消失,所以Mapper的生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关业务,就应该废弃它。

{} 和 ${} 的区别?
·#{}是占位符,进行预编译处理,${}是字符串替换,不进行预编译处理。
·Mybatis 在处理时,#{}传入参数是以字符串传入,会将 SQL 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。
·#{} 可以有效的防止 SQL 注入,提高系统安全性;${} 不能防止 SQL 注入
·#{} 的变量替换是在 DBMS 中;${} 的变量替换是在 DBMS 外

5.在mybatis中,resultType和resultMap的区别是什么?
·当数据库结果集的列名与封装实体的属性名一致的话使用result Type属性
·当数据库结果集的列名与封装实体的属性名不一致的情况使用resultMap属性,通过resultMap手动建立对象关系映射,要配置表和类的一一对应关系。即表的字段名和实体类的属性名可以不一样。

6.mybatis中你知道的动态SQL的标签有哪些?分别的作用是什么?
·if用作判断
·where标签可以用来做动态拼接查询条件,和if标签配合的时候不用显示的声明类型。
·foreach标签对传入的集合进行遍历,然后把每一项的内容作为参数传到SQL语句。
·set标签主要用在动态更新的时候,进行校验
·includ标签减少重复代码的编写。

7.说一下 MyBatis 的一级、二级缓存?
这个问题比较复杂,我们可以从几个方面来说明一下:
·首先mybatis里面设计了二级缓存机制来提升数据的一个检索效率,避免每一次数据的检索都去查询数据库。
·一级缓存是SQL Session级别的一个缓存,也叫本地缓存,因为每一个用户在执行查询的时候都需要使用SQL Session来执行,为了避免每一次数据的检索都去查询数据库,mybatis把查询出来的数据缓存到SQL Session的本地缓存里面,后续的SQL如果在命中缓存的情况下就可以直接在本地缓存中取,如果想实现跨SQL Session级别的一个缓存,那么一级缓存是无法做到的,所以引入了二级缓存的一个设计。
·当多个用户在查询数据的时候只要有如何一个SQL Session拿到了数据,就会放到二级缓存里面去,其他的SQL Session就可以在二级缓存里面去加载数据。
实现原理:
·一级缓存:在SQL Session里面会持有一个Executor,每一个Executor里面会有一个叫Local Cache的一个对象,当用户发起查询的时候,mybatis会根据执行语句在Local Cache里面去查找,如果名中了就直接把这个数据返回,如果没有则去数据库里面查询出来,再写到Local Cache里面去。
·二级缓存:在一级缓存的Executor上去做了一个装饰,引入了叫Caching Executor的装饰器,在进入一级缓存的查询之前会先通过Caching Executor进行二级缓存的查询,开启二级缓存之后会被多个SQL Session共享,即是一个全局的缓存,查询流程就变成了先查二级缓存--->一级缓存---->数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/65446646.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Linux Shell 脚本专题

本文介绍了Linux Shell环境变量和脚本使用的常用知识点。V1.0 2024年5月8日 发布于博客园目录常用环境变量一、环境变量的概念1、环境变量的含义2、环境变量的分类3、Linux环境变量二、常用的环境变量1、查看环境变量2、常用的环境变量三、设置环境量1、系统环境变量2、用户环境…

注册表延长Windows更新时间

打开注册表【Win】+【R】打开运行窗口输入regedit在输入框中输入计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings后回车在右侧空白处选择新建->DWORD(32位)值(D)命名为FlightSettingsMaxPauseDays,选中10进制数据数值为暂停更新的天数。 确定后关…

El-Upload组件上传图片并添加水印

背景 有的时候我们需要在上传图片中添加一些水印标识,然后上传至服务器 效果图代码 <template><div class="app"><!-- 需求:1. 点击直接预览图片,而不需要使用dialog2. 上传图片添加水印后才预览图片思路:上传图片文件添加水印。使用watermark…

Windows平台git clone文件路径太长报错

解决文件路径太长导致的报错问题问题描述 在Windows下拉取一些比较大的开源项目经常会提示文件路径太长(filename too long),然后死活都不成功 解决办法 1.配置git git config --system core.longpaths true2.修改文件C:\Program Files\Git\etc\gitconfig(需要以管理员身份…

docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群

docker搭建redis集群(三主三从)及重启redis集群 一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤: docker pull redis:6.0.82、查看本地拉取到镜像文件docker images 看到图上标识,就说明当前…

ISCC线上赛2023

ISCC线上赛2023 web web1双重base解码得到flag web3 F12控制台查看可找到loveStory.php Enc.php download.php,loveStory.php为反序列源码 boy::__destruct() -->girl()::__call()-->helper()::__isset()-->boy()::__toString()-->helper()::__get()-->love_st…