首页 > 其他分享 >Mybatis面试题汇总(36)

Mybatis面试题汇总(36)

时间:2024-01-16 16:24:34浏览次数:27  
标签:面试题 映射 对象 标签 36 MyBatis sql Mybatis

对MyBatis的认识[4]

简单介绍下MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis 与Hibernate,JdbcTemplate有哪些不同?

  1. 易用性:Hibernate > MyBatis > JdbcTemplate
  2. 性能:JdbcTemplate > MyBatis > Hibernate
  3. 灵活性:MyBatis > JdbcTemplate > Hibernate

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

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

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

  1. 延迟加载就是按需加载,在需要查询的时候再去查询,使用延迟加载可以避免表连接查询,表连接查询比单表查询的效率低,但是它需要多次与数据库进行交互,所以延迟加载并不是银弹,使用需谨慎。
  2. Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
  3. 原理:使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用A.getB().getName(),拦截器invoke()方法发现A.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用A.setB(b),于是a的对象b属性就有值了,接着完成A.getB().getName()方法的调用。这就是延迟加载的基本原理。

建立连接:线程和网络模型[5]

数据库连接池是什么?你们项目的数据库连接池配置了解吗

数据库连接池是池化思想的一种应用,他将创建和销毁成本都很大数据库连接池化复用,降低了系统资源的消耗。

我们项目用的是阿里云的druid数据库连接池

配置是用的默认的

初始化连接 1 最小连接 1 最大连接 20

数据库连接为什么要复用,成本大在什么地方?

  • 数据库连接大多数是基于tcp的,有三次握手和四次挥手
  • 连接时用户认证和鉴权

如何理解session和connection?

session指的是会话,是逻辑上的,connection指的是数据库连接,是建立在tcp上的物理连接。

在同一个方法中,Mybatis多次请求数据库,是否要创建多个SqlSession会话?

如果多个请求同一个事务中,那么多个请求都在共用一个SqlSession,反之每个请求都会创建一个SqlSession。

MyBatis什么时候建立和断开数据库连接?

这个要看是否使用了数据库连接池,如果没有的话,MyBatis 是在真正执行SQL前才去开启一个会话,然后去获取数据库连接执行SQL。

SQL解析[8]

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

  • ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。
  • {}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为?号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的?号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()。

Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还有哪些标签?

还有很多其他的标签,<resultMap><parameterMap><sql><include><selectKey>,加上动态 sql 的 9 个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为 sql 片段标签,通过<include>标签引入 sql 片段,<selectKey>为不支持自增的主键生成策略标签。

MyBatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?

MyBatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能,MyBatis 提供了 9 种动态 sql 标签 trim|where|set|foreach|if|choose|when|otherwise|bind。

其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

MyBatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?

虽然 MyBatis 解析 Xml 映射文件是按照顺序解析的,但是,被引用的 B 标签依然可以定义在任何地方,MyBatis 都可以正确识别。

原理是,MyBatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,MyBatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签,待所有标签解析完毕,MyBatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析完成了。

最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?

Dao 接口,就是人们常说的 Mapper接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中MappedStatement的 id 值,接口方法内的参数,就是传递给 sql 的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个MappedStatement

Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行 MappedStatement 所代表的 sql,然后将 sql 执行结果返回。

Dao 接口里的方法,参数不同时,方法能重载吗?

Dao 接口里的方法可以重载,但是Mybatis的XML里面的ID不允许重复。

Mybatis 的Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;毕竟 namespace 不是必须的,只是最佳实践而已。

原因就是 namespace+id 是作为 Map<String, MappedStatement> 的 key 使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。

简述 MyBatis 的 Xml 映射文件和 MyBatis 内部数据结构之间的映射关系?

MyBatis 将所有 Xml 配置信息都封装到 All-In-One 重量级对象 Configuration 内部。在 Xml 映射文件中, 标签会被解析为 ParameterMap 对象,其每个子元素会被解析为 ParameterMapping 对象。 标签会被解析为 ResultMap 对象,其每个子元素会被解析为 ResultMapping 对象。每一个

标签:面试题,映射,对象,标签,36,MyBatis,sql,Mybatis
From: https://www.cnblogs.com/lifan1998/p/17967937

相关文章

  • 7.Mybatis
    1.什么是MybatisMybatis是一个半ORM(对象关系映射)框架,内部封装JDBC,无需处理驱动加载、创建连接、创建statement等过程,只关注sql。Mybatis使用Xml或注解配置和映射原生信息,将POJO映射成数据库中的记录,避免JDBC代码和手动设置参数以及获取结果集。通过xml文件或注解的方式......
  • ABC336 F Rotation Puzzle 题解
    QuestionABC336FRotationPuzzle给出一个\(H\timesW\)的矩阵,里面填有数字,有一种操作选定一个\((x,y)\)交换\((i+x,j+y)\)和\((H-i+x,W-j+y)\)对于每一个\(1\lei\leH-1,1\lej\leW-1\)问,是否能经过\(20\)次以内的操作使得,最后的矩形变成\((i,j)=((i-1)\t......
  • AtCoder Beginner Contest 336
    B-CTZ难度:⭐题目大意给定一个数n,输出其二进制最后有几个连续的0;解题思路模拟一下就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'usingnamespacestd;......
  • abc336 E - Digit Sum Divisible 题解 数位DP
    题目链接:https://atcoder.jp/contests/abc336/tasks/abc336_e题目大意:我们定义一个整数\(n\)的数位和为\(n\)的十进制表示中的各位上的数字之和。比如:整数\(2024\)的数位和为\(2+0+2+4=8\)。一个正整数\(n\)被称作一个好数如果\(n\)能被它的数位和整除......
  • 面试题专辑
    hashmap:底层数据结构不同:1.7是数组加链表,1.8是红黑树加数组。为何用红黑树:,为何不上来直接树化,树化值为为啥是8,合适会树化,何时会退化为链表?1.红黑树为了避免dos攻击,防止性能下降,树化树偶然那个情况1.1哈希表查找时候,更新时间复杂度为o1,红黑树的查找时间复杂度为olog2n,TreeNo......
  • MySQL面试题(1):count
    InnoDB和MyISAM的count(*)有何不同MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数(无where条件)InnoDB执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数为什么InnoDB不跟MyISAM一样,也把数字存起来呢?因为......
  • springboot + mybatis plus 全局添加查询字段反引号
    配置文件添加: column-format:"`%s`"mybatis-plus:#启动时是否检查MyBatisXML文件是否存在check-config-location:true#MyBatis原生配置configuration:#字段名称下划线转驼峰命名map-underscore-to-camel-case:trueglobal-config:db-co......
  • 【前端面试】2024年前端面试题之JS篇
    请简述JavaScript中的thisJS中的this是一个相对复杂的概念,不是简单几句能解释清楚的。粗略地讲,函数的调用方式决定了this的值。我阅读了网上很多关于this的文章,ArnavAggrawal写的比较清楚。this取值符合以下规则:在调用函数时使用new关键字,函数内的this是一个全新的对......
  • 软件测试笔试面试题目完全汇总
    软件缺陷:1)软件未实现产品说明书要求的功能2)软件出现了产品说明书指明不应该出现的错误3)软件实现了产品说明书未提到的功能4)软件未实现产品说明书虽未明确提及但应该实现的目标5)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好。软件测试:为了发现......
  • 软件测试常考面试题-软件测试面试宝典(一篇足矣)
    软件测试常考面试题-软件测试面试宝典(一篇足矣) 介绍解决锻炼思维问题的思路和方法,从不同角度分析问题,让思维变强大,变宽广的同时在测试方面进行学习和方法的拓展,也会分享读书心得和问题思考。 问:软件测试的原则?答:软件测试的八个原则_山鬼谣弋痕夕的博客-CSDN博客_软件测试......