mybatis面试题

news/2024/5/20 7:21:11

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.hjln.cn/news/29719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

一文搞懂 ARM 64 系列: ADC

一文搞懂 ARM 64 系列: ADC1 指令语法 adc <Xd>, <Xn>, <Xm>2 指令语义 adc就是带「进位」加法,指令中的c就是英文carry。 整个指令等价于: (Xd, _) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器X…

Linux Shell 脚本专题

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

OpenDiary 24.5

我去!五月了我去!五月了 一亿年没更日寄了pixiv 100277433四月后日谈 鉴于整个四月基本没记日记,有必要开展一次考古活动 因为考古是比较困难的事情,所以想到什么就写什么了打了一整月的 p5r,四月下旬全都在高强度 p5r,每天都情不自禁打很长很长时间 一个月打了 93h 之多…

第八章——软件工程基础知识

软件工程概述,软件开发模型,软件开发方法,需求分析,系统设计,系统测试,软件开发项目管理,软件质量,软件度量第八章——软件工程基础知识 软件工程概述 软件开发模型 软件开发方法 需求分析 系统设计 系统测试 软件开发项目管理 软件质量 软件度量

Linux 中如何设置每个特定的时间执行特定的程序

那会突然想到一个问题,如何每隔一段时间执行特定的程序。想到了如下的一种方法: 测试如下: 一个小问题,比如 每隔5秒统计一个特定文件的行数 001、[b20223040323@admin1 test]$ ls false.gff pan.fna pan.fna.fai record.sh true.gff variable.gff x_variable_protei…

TextMeshPro - 艺术字(图片字)

1、首先要有一张包含了图片字的图集,每个图片字一个Spirte 2、然后右键 -> 创建创建好的TMP_Sprite Asset 3、编辑Sprite Character Table 调整顺序,将index和图片数字对上 修改下Unicode值(默认都是0xFFFE),比如9的Unicode为0x0039。(注意:填写完后,按Enter没用,…

注册表延长Windows更新时间

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

Face Detection API

一个针对图像中的人脸进行识别的底层加速平台组件<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0…