2023年-Mybatis常见面试题

 什么是 0RM 框架

0RM(对象关系映射)它的作用是在关系型数据库和业务实体对象之间作一个映射,这样

我们在具体的操作业务对象的时候,就不需要再去和复杂的 SQL 语句打交道,只要像平时操

作对象一样操作它就可以了。比如咱们的 hibernate 和 mybatis 就是一个 orm 框架

什么是Mybatis

  1. 是一款非常优秀的持久层框架
  2. 支持自定义SQL(手动编写SQL语句),支持存储过程与高级映射(一对一,一对多,多对多)
  3. 免除了几乎所有的JDBC代码以及设置参数和封装结果集的工作
  4. 可以通过简单XML文件或者注解的方式来编写SQL语句
  5. 是一个ORM框架

mybatis 执行流程

1.项目启动加载 mybatis-config.xml, 读取 mybatis 运行环境,并且加载 mybatis 的 sq1 映射文件(配置操作数据库的 sql 语句和映射关系)

2.通过配置文件创建 SqlSessionFactory 工厂,用来创建 SqlSession

3.通过 SqlSession 来操作数据库的 crud

4.SqlSession 执 行 是 通 过 mybatis 底 层 定 义 的 Executor 执 行 器 来 执 行 sql 语句 (MappedStatement)

5.然后执行器执行 mybatis 底层封装的MappedStatement 对象.当前对象封装了 sql 映射的信息和输入、输出结果信息

(xxMapper. xm1 文件中一个 sql 对应一个 MappedStatment 对象)

mybatis 中 dao 层是否可可以重载

不可以,dao 层中接口的方法名与与 xml中的标签 id 值是致的,所以一旦出现方法重

载之后就会出现相同的方法名,xml 中的 id 也出现了重名的情况,一旦运行系统就会报错 .

Mapper 接口的全限名,就是映射文件中的 namespace 的值,接口的方法名就是映射

文件中 MappedStatement 的 id 值,接口方法内的参数,就是传递给 sql 的参数。Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯

一定位个 MappedStatement,因为是使用全限名+方法名的保存和寻找策略。

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

Mybatis 的级、二级缓存:

它只开启一级缓存,一级缓存只是相对于同一个 Sq1Session 而言。所以在参数和 SQL

完全一样的情况下,我们使用同一个 SqlSession 对象调用个 Mapper 方法,往往只执行一次SQL,因为使用 SelSession 第一次查询后 ,MyBatis 会将其放在缓存中,以后再查询的时候, 如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据, 而不会再次发送 SQL 到数据库。SqlSessionFactory 层面上的二级缓存默认是不开启的,范围较大,一般借助第三方缓存技术,比如 redis

Mybaits的优缺点:

(1)优点:

① 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

② 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

③ 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

④ 能够与Spring很好的集成;

⑤ 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

(2)缺点:

① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

JDBC、Hibernate、 Mybatis 区别

Hibernate 属于全自动,Mybatis 属于半自动,Jdbc 属于手动,从开发效率上讲 hibernate

较高, Mybatis 居中,jdbc 较低,从执行效率上讲 hibernate 较低,Mybatis 居中,jdbc 较高,因为 jdbc 是纯手工编写 sql 语句,开发效率极低,Mybatis 对 sql 的控制能力相对灵活,可以根据业务需要进行优化,而 hibernate 因为高度封装所开发效率相对较高,但正因为这个原因,所以程序员在对 sql 语句的控制和优化方面相对比较弱。

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

        不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;原因就是namespace+id是作为Map的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

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

答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。

Mybatis有哪些动态的SQL? 执行原理?有哪些动态的SQL?

  答:

       1.  Mybatis的动态SQL可以在XML映射文件内,以标签的形式编写动态SQL,执行原理是根据表达式的值,完成逻辑判断并动态拼接sql的功能。

       2.  Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose | when | otherwise | bind

为什么说MyBatis是半ORM框架?与Hibernate有哪些不同?

  1. ORM,它的意思是指对象和关系之间的映射,包括【对象->关系的映射】和【关系->对象的映射】两个方面。
  2. Hibernate是个完整的ORM框架,它实现了这两个方面的功能。而MyBatis只完成了【关系->对象的映射】,准确地说,MyBatis是SQL映射框架而不是ORM框架,因为它仅有字段映射,对象数据以及对象的实际关系仍然需要通过手写SQL来实现。
  3. MyBatis可以直接编写原生SQL,可严格控制SQL的执行性能,灵活度比较高。Hibernate只能通过编写HQL来实现数据库查询。

MyBatis的接口绑定是什么?有哪些绑定方式?

  1. 接口绑定,就是在MyBatis中定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口中的方法就可以操作数据库了。这样比起直接使用SqlSession对象提供的原生态的方法,更加灵活与简单。
  2. 接口绑定主要有两种实现方式:(1)第一种是通过注解绑定,也就是说 在接口的方法上面加上 @Select、@Update 等注解,注解里面包含SQL语句来进行绑定。这种方式可以省去SQL的 xml 映射文件,对于简单的SQL来说比较适用,后期维护比较困难,平时在业务中基本不怎么使用。(2)第二种是通过在SQL的xml 映射文件里面写SQL来进行绑定, 在这种情况下,要指定 xml 映射文件里面的 namespace 参数必须为接口的全类名。不管是SQL简单还是复杂,xml 文件的方式 都比较简单高效,也是最常用的。

你可能感兴趣的:(mybatis,java,spring)