Mybatis面试大全

Posted 最小的帆也能远航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis面试大全相关的知识,希望对你有一定的参考价值。

1.Mybatis是什么?

  • Mybatis是一款优秀的持久层框架

  • 它支持定制化 SQL、存储过程以及高级映射

  • 与传统的jdbc相比, MyBatis避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集

2 .ORM是什么?

  • ORM(Object Relational Mapping)对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。
  • ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

 3. 传统JDBC开发存在的问题?

  • 代码繁琐,重复度高,冗余度高
  • 数据库的连接对象的多次创建,造成系统资源的浪费
  • 代码维护难度高,需要修改的代码难度大(牵一发动全身)

 4 .请说说MyBatis的工作原理? 

  • 通过IO流读取 MyBatis配置文件:解析mybatis-config.xml配置文件, 配置了 MyBatis的运行环境等信息,例如数据库连接信息。
  • 加载映射文件。映射文件即 SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在 MyBatis 配置文件 mybatis-config.xml中加载。
  • 构造会话工厂:通过 MyBatis的环境等配置信息构建会话工厂 SqlSessionFactory。
  • 创建会话对象:由会话工厂创建 SqlSession对象,该对象中包含了执行SQL 语句的所有方法。
  • Executor执行器:MyBatis 底层定义了一个 Executor接口来操作数据库,它将根据 SqlSession传递的参数动态地生成需要执行的 SQL语句,同时负责查询缓存的维护。
  • MappedStatement对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL语句的 id、参数等信息。
  • 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO类型。
  • 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和POJO类型。

5 .Mybatis都有哪些Executor执行器?它们之间的区别是什么?

  • SimpleExecutor:就开启一个Statement对象,用完立刻关闭Statement对象
  • ReuseExecutor(重复):开启Statement对象后,并不立即关闭该对象,重复利用该对象
  • BatchExecutor(批处理):将Statement对象依次添加,统一处理

 6.MyBatis编程步骤?

  • 创建SqlSessionFactory
  • 通过SqlSessionFactory创建SqlSession
  • 通过sqlsession执行数据库操作
  • 调用session.commit()提交事务
  • 调用session.close关闭会话

7.MyBatis的优缺点 ?

MyBatis的优点

  • 基于SQL语句编程,相当灵活。SQL写在XML中,解除sql与程序代码的耦合,便于统一管理。提供XML标签,支持编写动态SQL语句,并可重用
  • 消除了 JDBC 大量冗余的代码,不需要手动开关连接;
  • 很好的与各种数据库兼容
  • 能够与 Spring 很好的集成;
  • 提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

MyBatis框架的缺点

  • SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。
  • SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

8.MyBatis与Hibernate有哪些不同

  • MyBatis是一个半ORM框架,需要自己编写sql语句,灵活性高,但是需要自定义多套sql映射文件,工作量大
  • Hibernate数据库无关性好,节省代码,提高效率

 9. #{}和${}的区别?

  • #{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理
  • #{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL注入
  • 变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’

 10. 如何获取生成的主键?

  • useGeneratedKeys="true" keyProperty="userId" 开启主键自增自动回填

11. 当实体类中的属性名和表中的字段名不一样 ,怎么办?

  • 别名法
  • 通过resultMap来映射字段名和实体类属性名的一一对应的关系。

 12.Mybatis都有哪些动态sql?能简述一下动态sql的执行原理不?

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

  • 原理:sql语句的拼接

 13.MyBatis实现一对一,一对多有几种方式,怎么操作的?

  • 方式: 联合查询和嵌套查询
  • association(联系):单个关联查询association
  • collection(集合):多个关联查询 collection

 14.说说Mybatis的一级、二级缓存?

  • 一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!
  • 只要开启了二级缓存,在同一个Mapper下就有效
     <!<setting name="cacheEnabled" value="true"/>

 15.常见的分页方式?

  • 使用Limit分页
  • RowBounds分页
  • 分页插件

16. 谈一谈生命周期和作用域?

SqlSessionFactoryBuilder

  • 一旦创建了SqlSessionFactory,就不再需要它了
  • 局部变量

SqlSessionFactory

  • 说白了就是可以想象为 :数据库连接池
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
  • 因此 SqlSessionFactory 的最佳作用域是应用作用域。
  • 最简单的就是使用单例模式或者静态单例模式。

SqlSession

  • 连接到连接池的一个请求!
  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 用完之后需要赶紧关闭,否则资源被占用!
  • 这里面的每一个Mapper,就代表一个具体的业务!

17.通常一个Xml映射文件,都会写一个Dao接口与之对应。那么Dao接口的工作原理是什么?

Dao接口就是Mapper接口。

  • 接口的全限定名就是映射文件的namespace的值
  • 接口的方法名就是映射文件中Mapper的Statement的id值
  • 接口方法内的参数就是传递给sql的参数

Mapper接口是没有实现类的,当调用接口方法的时候,接口的全限定名+方法名拼接字符串作为key值,可以唯一定位一个MapperStatement。

以上是关于Mybatis面试大全的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis超强大的动态SQL大全

Mybatis超强大的动态SQL大全

常见的Mybatis面试题详细讲解大全

Mybatis超强大的动态 SQL 大全

动态 SQL 语句大全

VSCode自定义代码片段3——url大全