首页 > 编程语言 >程序员的30大Mybatis面试问题及答案

程序员的30大Mybatis面试问题及答案

时间:2024-01-04 11:04:25浏览次数:39  
标签:xml 插件 缓存 映射 30 程序员 sql Mybatis



文章目录

  • 1.什么是Mybatis?
  • 2.Hibernate优点?
  • 3.Hibernate缺点?
  • 4.Mybatis优点?
  • 5.Mybatis缺点?
  • 6.什么时候用Mybatis?
  • 7.Mybatis的核心组件有哪些?分别是?
  • 8.#{}和${}的区别是什么?
  • 9.Mybatis中9个动态标签是?
  • 10.xml映射文件中,有哪些标签?
  • 11.Mybatis支持注解吗?优点?缺点?
  • 12.Mybatis动态sql?
  • 13.**Mybatis 是如何进行分页的?分页插件的原理是什么?**
  • 14.如何获取自增主键?
  • 15.为什么Mapper接口没有实现类,却能被正常调用?
  • 16.用注解好还是xml好?
  • 17.如果不想手动指定别名,如何用驼峰的形式自动映射?
  • 18.当实体属性名和表中字段不一致,怎么办?
  • 19.嵌套查询用什么标签?
  • 20.like模糊查询怎么写?
  • 21.Mybatis支持枚举吗?
  • 22.SqlSessionFactoryBuilder生命周期?
  • 23.一级缓存的结构?如何开启一级缓存?如何不使用一级缓存?
  • 24.二级缓存如何配置?
  • 25.**简述 Mybatis 的插件运行原理,以及如何编写一个插件?**
  • 26.二级缓存的回收策略有哪些?
  • 27.Mybatis的Xml文件中id可以重复吗?
  • 28. 和Mybatis搭配java框架中比较好用的缓存框架?有哪些特点?
  • 29.说一下resultMap和resultType
  • 30.Mybatis动态sql有什么用?执行原理?有哪些动态sql?


1.什么是Mybatis?

MyBatis 是一款优秀的支持自定义 SQL 查询、存储过程和高级映射的持久层框架,消除了 几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索 。 MyBatis 可以使用 XML 或注解进 行配置和映射, MyBatis 通过将参数映射到配置的 SQL 形成最终执行的 SQL 语句 ,最后将执行 SQL 的结果映射成 Java对象返回。

2.Hibernate优点?

Hibernate建立在POJO和数据库表模型的直接映射关系上。通过xml或注解即可和数据库表做映射。通过pojo直接可以操作数据库的数据。它提供的是全表的映射模型。

  • 消除代码映射规则,被分离到xml或注解里配置。
  • 无需在管理数据库连接,配置在xml中即可。
  • 一个会话中,不要操作多个对象,只要操作Session对象即可。
  • 关闭资源只需关闭Session即可。

3.Hibernate缺点?

  • 全表映射带来的不便,比如更新需要发送所有的字段。
  • 无法根据不同的条件组装不同的sql。
  • 对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据组成pojo。
  • 不能有效支持存储过程。
  • 虽然有hql,但是性能较差,大型互联网需要优化sql,而hibernate做不到。

4.Mybatis优点?

  1. 小巧,学习成本低,会写sql上手就很快了。
  2. 比jdbc,基本上配置好了,大部分的工作量就专注在sql的部分。
  3. 方便维护管理,sql不需要在Java代码中找,sql代码可以分离出来,重用。
  4. 接近jdbc,灵活,支持动态sql。
  5. 支持对象与数据库orm字段关系映射。

5.Mybatis缺点?

  • 由于工作量在sql上,需要 sql的熟练度高。
  • 移植性差。sql语法依赖数据库。不同数据库的切换会因语法差异,会报错。

6.什么时候用Mybatis?

如果你需要一个灵活的、可以动态生成映射关系的框架。目前来说,因为适合,互联网项目用Mybatis的比例还是很高滴。

7.Mybatis的核心组件有哪些?分别是?

SqlSessionFactoryBuilder(构造器) :它会根据配置信息或者代码来生成SqlSessionFactory。

SqlSessionFactory(工厂接口):依靠工厂来生成SqlSession。

SqlSession(会话):是一个既可以发送 sql去执行返回结果,也可以获取Mapper接口。

SQL Mapper:它是新设计的组件,是由一个Java接口和XML文件(或注解)构成的。需要给出对象的SQl和映射规则。它负责发送SQL去执行,并返回结果。

8.#{}和${}的区别是什么?

${}是字符串替换,#{}是预编译处理。一般用#{}防止 sql注入问题。

9.Mybatis中9个动态标签是?

  • if
  • choose (when 、 oterwise)
  • trim (where、 set)
  • foreach
  • bind

10.xml映射文件中,有哪些标签?

select|insert|updae|delete|resultMap|parameterMap|sql|include|selectKey 加上9个动态标签,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

11.Mybatis支持注解吗?优点?缺点?

支持。

优点:对于需求简单sql逻辑简单的系统,效率较高。

缺点: 当sql变化需要重新编译代码,sql复杂时,写起来更不方便,不好维护。

12.Mybatis动态sql?

Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑
判断和动态拼接 sql 的功能

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

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

14.如何获取自增主键?

注解:

@Options(useGeneratedKeys =true, keyProperty =”id”)

int insert( );

Xml:

<insert id=”insert” useGeneratedKeys=”true” keyProperty=” id”>

sql

</insert>

15.为什么Mapper接口没有实现类,却能被正常调用?

这是因为MyBatis在Mapper接口上使用了动态代理。

16.用注解好还是xml好?

简单的增删改查可以注解。

复杂的sql还是用xml,官方也比较推荐xml方式。

xml的方式更便于统一维护管理代码。

17.如果不想手动指定别名,如何用驼峰的形式自动映射?

mapUnderscoreToCamelCase=true

18.当实体属性名和表中字段不一致,怎么办?

一、别名: 比如 order_num

select order_num orderNum

二、通过做映射

<result property = “order_Num" column =”order_num"/>

三、如果是驼峰注解用17问的方式。

19.嵌套查询用什么标签?

association 标签的嵌套查询常用的属性如下 。

select:另一个映射查询的 id, MyBatis会额外执行这个查询获取嵌套对象的结果。

column:列名(或别名),将主查询中列的结果作为嵌套查询的 参数,配置 方式如 column={propl=coll , prop2=col2}, propl 和 prop2 将作为嵌套查询的参数。

fetch Type:数据加载方式,可选值为 lazy 和 eager,分别为延迟加载和积极加载, 这个配置会覆盖全局的 lazyLoadingEnabled 配置 。

20.like模糊查询怎么写?

(1)‘%${value}%’ 不推荐

(2)CONCAT(‘%’,#{value},‘%’) 推荐

(3) like ‘%’|| #{value} || ‘%’

(4)使用bind

LIKE #{pattern}

21.Mybatis支持枚举吗?

支持。有转换器EnumTypeHandler和EnumOrdinalTypeHandler

<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="枚举类(com.xx.StateEnum)"/>
</typeHandlers>

22.SqlSessionFactoryBuilder生命周期?

利用xml或者Java代码获得资源构建SqlSessionFactoryBuilder,它可以创建多个SessionFactory,一旦构建成功SessionFactory,就可以回收它了。

23.一级缓存的结构?如何开启一级缓存?如何不使用一级缓存?

Map 。默认情况下,一级缓存是开启的。< select >标签内加属性flushCache=true。

24.二级缓存如何配置?

<settings>
〈 !一其他自己直一 〉
<setting name=” cacheEnabled” value=” true ” />
</settings>

这个参数是二级缓存的全局开关,默认值是 true,初始状态 为启用状态 。 如果把这个参数设置为 false,即使有后面 的 二级缓 存配置,也不会生效 。

25.简述 Mybatis 的插件运行原理,以及如何编写一个插件?

1)Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、
Executor 这 4 种接口的插件,Mybatis 通过动态代理,为需要拦截的接口生成代理对象以实
现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是
InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
2)实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给插件编写注解,指定
要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

26.二级缓存的回收策略有哪些?

eviction (收回策略)

LRU(最近最少使用的) : 移除最长时间不被使用的对象,这是默认值 。

IFO(先进先出〉 : 按对象进入缓存的顺序来移除它们 。

SOFT(软引用) : 移除基于垃圾回收器状态和软引用规则的对象 。

WEAK (弱引用) : 更积极地移除基于垃圾收集器状态和弱引用规则的对象 。

27.Mybatis的Xml文件中id可以重复吗?

同一namespace下,id不可重复。不同namespace下,可以重复。

28. 和Mybatis搭配java框架中比较好用的缓存框架?有哪些特点?

EhCache是一个纯牌的 Java进程内的缓存框架,具有快速、精干等特点。

具体来说, EhCache主要的特性如下 。

  • 快速。
  • 简单。
  • 多种缓存策略 。
  • 缓存数据有内存和磁盘两级,无须担心容量问题 。
  • 缓存数据会在虚拟机重启 的过程中写入磁盘。
  • 可 以通过 RMI、可插入 API 等方式进行分布式缓存。
  • .具有缓存和缓存管理器的侦 昕接口。
  • 支持多缓存管理器实例 以及一个实例的多个缓存区域。

29.说一下resultMap和resultType

resultmap是手动提交,人为提交,resulttype是自动提交
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
1.当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
2.当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

30.Mybatis动态sql有什么用?执行原理?有哪些动态sql?

有九种动态sql标签:trim,where,set,foreach,if,choose,when,bind,otherwise
Mybatis的动态sql可以在xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值,完成逻辑判断并动态拼接sql的功能!

释怀太难只能等着烂在回忆里


标签:xml,插件,缓存,映射,30,程序员,sql,Mybatis
From: https://blog.51cto.com/u_14452299/9097020

相关文章

  • 假如你现在开始准备春招,拿到offer时,不敢相信你该会是一个多么快乐的程序员
    还有一个月就要过年了,过完年回来就是春招和金三银四的面试季了,秋招还没拿到意向offer,春招要怎么提前准备,才更有胜算呢?,今天分享一下面试前的准备技巧和一些Android面试要点,这篇文章适用于所有需要就业的小伙伴,不管你是名校毕业,还是双非出身,我相信这篇文章能给你带来一点点的小的收获......
  • 程序员这个职业终将无法被取代,即使AI再怎么发展也不行
    前言程序员这个职业终将无法被取代,即使AI再怎么发展也不行,你可能会说为什么?那么你首先想想AI的数据模型,AI的算法,AI的代码是谁写的?难道是凭空产生的吗?只要还是程序员写的,那么AI就一定会受到限制。即使有一天AI真的发展到可以完全取代程序员的那一步,那这个世界又会变成什么样子?AI再怎......
  • Cisco Secure Client 5.0.03072 (macOS, Linux, Windows & iOS, Andrord)
    CiscoSecureClient5.0.03072(macOS,Linux,Windows&iOS,Andrord)思科安全客户端(包括AnyConnect)作者主页:sysin.orgCiscoSecureClient(includingAnyConnect)思科安全客户端(包括AnyConnect)安全访问只是开始您的团队需要轻松访问公司资源和私有应用程序。您需要确保您的......
  • GB18030-2022 标准学习
    GB18030-2022标准学习下载https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=A1931A578FE14957104988029B0833D3感觉挺大:240MB简单学习......
  • VMware Horizon 8 2306 - 虚拟桌面基础架构 (VDI) 和应用软件
    VMwareHorizon82306-虚拟桌面基础架构(VDI)和应用软件作者主页:sysin.orgVersion2306DocumentationReleaseNotesReleaseDate2023-07-06虚拟桌面基础架构(VDI)和应用软件VMwareHorizon通过高效安全地将虚拟桌面和应用从本地部署环境交付到云端,提升数字化工作空间体验......
  • macOS Sonoma 14 beta 4 (23A5301g) ISO、IPSW、PKG 下载
    macOSSonoma14beta4(23A5301g)ISO、IPSW、PKG下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。作者主页:sysin.orgmacOSSonoma推出全新功能,全面......
  • 揭开大龄程序员的职场密码:永葆青春的秘诀!
    前言说说失业感受吧,今年34,工作7年(这盛世如你所愿),感觉要告别这个行业了。失业一个月面试了好多,基本都是一轮游,有些感觉回答的挺好的,最后也没啥机会了,后面我都会问面试官招聘HC有多少,基本上是一两个,所以别看岗位不少,招的人真不多!好多公司连面试机会都不给了,像阿里、京东、百度、腾讯......
  • dell R730服务器报MEM0001错误
    dellR730服务器报MEM0001错误发布时间:2022-03-23点击数:1223dellR730服务器报MEM0001Multi-bitmemoryerroronDimm-B2.ReseatMemory错误解决方案:这个提示是报位于B2槽位的内存条发生多位错误,可以断电后把内存用橡皮清洁金手指再插上,再试,如果还是报这个,是内存挂了。可以先......
  • Mybatis-Wrapper导致的生产事故
    近期遭遇了一次生产环境的严重告警,涉及慢接口和CPU过载。经过排查,发现问题根源在于一段使用MyBatis的查询代码。当传入空列表作为查询条件时,MyBatis会忽略该条件,导致全表扫描,进而引发系统资源耗尽和频繁的FullGC灾难回顾前两天晚上,正在收拾包准备下班,电脑刚放进包里,我的手机......
  • #yyds干货盘点# LeetCode程序员面试金典:赎金信
    给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。 示例1:输入:ransomNote="a",magazine="b"输出:false示例2:输入:ransomNot......