螺竹编程
发布于 2024-05-19 / 4 阅读
0

Java面试题/后端框架:Mybatis面试题

Mybatis简介

什么是 Mybatis?

MyBatis 是一个开源的持久层框架,它通过 XML 或注解的方式将 SQL 语句与 Java 对象关联起来,从而实现了简化 SQL 操作的目的。

Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。

MyBatis 框架适用场合

对性能的要求很高,或者需求变化较多的项目。

MyBatis 的优势是什么?

MyBatis 的优势主要包括:

  • 灵活性:MyBatis 支持使用 XML 或注解的方式进行配置,可以根据项目需求进行灵活配置。

  • 易于学习:MyBatis 的 API 设计简单明了,学习成本较低。

  • 易于调试:MyBatis 可以输出 SQL 语句及其执行时间,方便调试。

  • 与其他框架整合:MyBatis 可以与 Spring 等框架无缝整合,提高开发效率。

Myabtis解析和运行原理

MyBatis 的工作原理是什么?

MyBatis 的工作原理可以简单地概括为以下几个步骤:

  • 读取配置文件:MyBatis 会读取配置文件(mybatis-config.xml),并解析其中的配置信息。

  • 创建 SqlSessionFactory:根据配置文件中的信息,MyBatis 会创建 SqlSessionFactory 对象,该对象是 MyBatis 的核心对象,用于创建 SqlSession 对象。

  • 创建 SqlSession:SqlSession 是 MyBatis 与数据库交互的核心对象,它可以通过调用其中的 API 来执行 SQL 语句,并返回结果。

  • 执行 SQL 语句:SqlSession 可以执行 SQL 语句,并将结果封装成 Java 对象返回。

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

  • #{}:表示使用预编译语句,会将传入的参数进行占位符处理,安全性较高。

  • ${}:表示直接使用传入的参数值,不会进行占位符处理,存在 SQL 注入的风险。

Mybatis 是如何进行分页的?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的原理是什么?

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

MyBatis 中的一级缓存和二级缓存是什么?

  • 一级缓存:也称为本地缓存,指的是 SqlSession 级别的缓存。当执行一次查询操作后,查询的结果会被缓存到 SqlSession 的缓存中,下次查询相同的数据时,会先从缓存中获取,如果缓存中不存在,则再去数据库中查询。

  • 二级缓存:也称为全局缓存,指的是跨 SqlSession 的缓存。当执行一次查询操作后,查询的结果会被缓存到二级缓存中,下次查询相同的数据时,会先从二级缓存中获取,如果二级缓存中不存在,则再去 SqlSession 的缓存中查询,如果还是不存在,则去数据库中查询,并将查询的结果更新到缓存中。

MyBatis 中的动态 SQL 是什么?

动态 SQL 是指根据不同的条件生成不同的 SQL 语句。MyBatis 中通过使用 XML 中的动态标签来实现动态 SQL,例如 if、where、choose、foreach 等标签。

MyBatis 中的事务是如何管理的?

MyBatis 中的事务可以通过两种方式进行管理:

  • 编程式事务管理:即通过手动控制事务的提交和回滚来管理事务。

  • 声明式事务管理:即通过配置事务管理器来管理事务,常用的事务管理器包括 Spring 的事务管理器和 JTA 事务管理器。

ResultType和ResultMap的区别?

  • resultType是将单个列的结果映射到Java对象或基本数据类型的简单方式。它指定了返回结果的类型,可以是Java类的完全限定名或基本数据类型,例如StringInteger等。当查询返回的结果只涉及一个简单的列时,可以使用resultType进行映射。例如,如果查询返回一个整数值,你可以使用resultType="java.lang.Integer"将其映射到一个Integer对象。

  • 然而,对于复杂的查询结果,使用resultMap会更加灵活和强大。resultMap允许你定义一个映射规则,将查询结果的列映射到Java对象的属性或字段上。你可以通过配置resultMap来指定如何映射每个列,包括列名、属性名、列的JDBC类型等。这使得你能够处理多个列、嵌套查询以及一对一、一对多等复杂的关联关系。使用resultMap可以更准确地控制查询结果的映射过程,以满足特定的需求。