JavaWeb编程面试题——MyBatis

JavaWeb编程面试题

面试题持续更新中…

1.什么是 MyBatis?(简述题)
(1)MyBatis 是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态 SQL,可以严格控制SQL执行性能,灵活度高。
(2)MyBatis 可以使用 XML或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
(3)通过 XML 文件或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL并将结果映射为Java对象并返回。(从执行SQL到返回result的过程)

2.MyBatis 优缺点?(简述题)
优点:
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 中,解除SQL与程序代码的耦合,便于统一管理。提供 XML 标签,支持编写动态SQL语句,并可重用;
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库 MyBatis都支持);
(4)能够与Spring 很好的集成(MyBatis官方提供与Spring的整合包);
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

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

3.MyBatis 框架适用场合?(简述题)
MyBatis专注于SQL自身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,例如Web项目,互联网项目等等,MyBatis都是不错的选择。

4.MyBatis 框架原理?(简述题)
JavaWeb编程面试题——MyBatis_第1张图片

  1. mybatis 配置:SqlMapConfig.xml,此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。mapper.xml 文件即 sql 映射文件,文件中配置了操作数据库的 sql 语句。此文件需要在 SqlMapConfig.xml 中加载。
  2. 通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂。
  3. 由会话工厂创建 sqlSession 即会话,操作数据库需要通过 sqlSession 进行。
  4. mybatis 底层自定义了 Executor 执行器接口操作数据库,Executor 接口有两个实现,一个是基本执行器、一个是缓存执行器。
  5. Mapped Statement 也是 mybatis 一个底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。mapper.xml 文件中一个sql 对应一个 Mapped Statement 对象,sql 的 id 即是 Mapped statement 的 id。
  6. Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数。
  7. Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中,输出结果映射过程相当于 jdbc 编程中对结果的解析处理过程。

5.MyBatis 和 Hibernate 的区别?(简述题)
(1)MyBatis 和 Hibernate 不同,它不是一个完全的 ORM 框架,因为 MyBatis 需要程序员自己编写 SQL 语句;
(2)MyBatis 直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一旦有需求变化可以迅速输出成果。但是灵活的前提是 MyBatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套SQL映射文件,工作量大。
(3)Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用Hibernate开发可以节省很多代码,提高效率。

6.MyBatis 有哪些动态标签?(简述题)

  • if标签:判断是否符合条件
  • foreach标签:对一个集合进行遍历
  • where标签:补充响应的where的SQL语句
  • sql标签:定义可重用的SQL代码段,可以包含在其他语句中。

7.mybatis中一对一如何实现?(简述题)
在映射文件中 resultMap元素里配置 association节点,配置一对一的类就可以完成。

8.mybatis中一对多如何实现?(简述题)
在映射文件中 resultMap 里面配置 collection 节点,配置一对多的类就可以完成。

9.mybatis编程步骤?(简述题)

  1. 创建 SqlSessionFactory 会话工厂
  2. 通过 SqlSessionFactory创建SqlSession 会话
  3. 通过 sqlSession 执行数据库操作
  4. 通过 session.commit() 提交事务
  5. 调用 session.close() 关闭会话

10.简述MyBatis的一级缓存和二级缓存?(简述题)

  • Mybatis首先会到缓存中查询结果集,如果没有则查询数据库,如果有则直接从缓存取出结果集。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象。
  • Mybatis的一级缓存即本地缓存,它的作用域是一个sqlSession会话,即在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
  • Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询相同的sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

11.#{} 和 ${} 区别?(简述题)

  • #{}表示一个占位符号,可以有效防止sql注入。
  • ${}表示拼接sql串,在低版本中括号中只能是value。
  • #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。
  • #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
  • ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转 换
  • ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,低版本中${}括号中只能是value。

12.Mybatis的mapper.xml文件中常用标签有哪些?(简述题)