• 【后端高频面试题--Mybatis篇】


    🚀 作者 :“码上有前”
    🚀 文章简介 :后端高频面试题
    🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

    在这里插入图片描述

    往期精彩内容

    【后端高频面试题–设计模式上篇】
    【后端高频面试题–设计模式下篇】
    【后端高频面试题–Linux篇】
    【后端高频面试题–Nginx篇】
    【后端高频面试题–Mybatis篇】
    【后端高频面试题–SpringBoot篇】

    什么是Mybatis?Mybatis的优缺点?

    MyBatis(原名为iBatis)是一种Java持久层框架,用于简化数据库访问的开发。它通过将数据库访问逻辑与业务逻辑分离,提供了一种灵活且简单的方式来进行数据库操作。

    MyBatis的主要特点包括:

    1. 简化SQL编写:MyBatis通过提供XML配置文件和注解方式,将SQL语句与Java代码分离,使得SQL编写更加清晰和可维护。

    2. 强大的映射功能:MyBatis支持将查询结果自动映射到Java对象,通过配置映射关系,可以方便地进行对象与数据库表之间的转换。

    3. 动态SQL支持:MyBatis提供了动态SQL功能,可以根据不同条件拼接SQL语句,简化了复杂查询的编写。

    4. 缓存支持:MyBatis内置了一级缓存和二级缓存,可以提高查询性能,减少数据库访问次数。

    5. 插件扩展机制:MyBatis提供了插件扩展机制,可以通过插件来扩展和定制MyBatis的功能,如自定义拦截器、修改SQL执行过程等。

    MyBatis的优点包括:

    1. 灵活性:MyBatis不强制使用特定的ORM模型,开发者可以自由地编写SQL和控制数据库访问逻辑,适用于复杂的业务需求。

    2. 性能优化:MyBatis提供了缓存机制和动态SQL支持,可以有效地提高数据库访问性能。

    3. 易于集成:MyBatis与Java应用集成简单,可以与各种主流的Java框架(如Spring)无缝集成,提供了丰富的整合支持。

    4. 易于学习和上手:相对于其他ORM框架,MyBatis学习曲线较为平缓,使用起来相对简单,容易上手。

    MyBatis的缺点包括:

    1. 配置较复杂:MyBatis需要编写XML配置文件来映射SQL语句和Java对象,对于简单的CRUD操作可能会增加一些额外的配置和工作量。

    2. SQL依赖:MyBatis需要开发者手动编写和维护SQL语句,对于不熟悉SQL的开发者来说,可能需要额外学习和掌握SQL的知识。

    3. 缺乏自动化:相对于全自动的ORM框架,MyBatis需要开发者手动编写SQL语句和映射关系,对于某些简单的业务需求,可能会显得繁琐。

    综上所述,MyBatis作为一种轻量级的持久层框架,在灵活性、性能优化和易于集成等方面具有优势,但在配置复杂和SQL依赖方面存在一些缺点。开发者可以根据项目需求和个人经验,评估是否选择使用MyBatis。

    Mybatis的特点

    MyBatis是一种开源的持久层框架,它具有以下几个特点:

    1. 简化数据库操作:MyBatis通过提供简洁的配置和灵活的映射方式,将数据库操作的细节隐藏起来,开发者只需关注SQL语句的编写和结果的映射,而无需手动处理数据库连接、事务和结果集等底层细节。

    2. 灵活的SQL编写:MyBatis支持使用原生的SQL语句,开发者可以编写和优化自己的SQL语句,灵活性较高。同时,MyBatis也提供了动态SQL的功能,可以根据条件动态拼接SQL语句,方便实现复杂的查询和更新操作。

    3. 强大的映射功能:MyBatis提供了丰富的映射功能,可以将查询结果自动映射到Java对象中,大大简化了结果集的处理。同时,MyBatis还支持一对一、一对多、多对一和多对多等复杂的关联关系映射,方便进行对象之间的关联查询。

    4. 缓存支持:MyBatis提供了缓存机制,可以将查询结果缓存起来,下次相同的查询可以直接从缓存中获取,提高查询性能。MyBatis提供了一级缓存和二级缓存两种缓存级别,可以根据需求选择合适的缓存策略。

    5. 插件扩展:MyBatis支持插件机制,可以通过自定义插件来扩展和定制框架的功能。开发者可以通过插件来拦截和修改MyBatis的SQL执行过程,例如添加自定义的日志、性能监控等功能。

    6. 跨数据库支持:MyBatis可以适配多种不同的关系型数据库,例如MySQL、Oracle、SQL Server等,开发者可以在不同的数据库之间切换而无需修改大量的代码。

    总体而言,MyBatis是一款灵活、简单且功能强大的持久层框架,它将数据库操作的细节封装起来,提供了便捷的配置和映射方式,同时支持自定义SQL和插件扩展,使得开发者可以更加高效地进行数据库操作。

    Mybatis框架适合场合

    MyBatis框架适用于以下场合:

    1. 需要灵活控制SQL语句:如果你需要对SQL语句进行细粒度的控制,包括编写复杂的查询语句、优化SQL性能或者使用数据库特定的高级功能,MyBatis是一个不错的选择。MyBatis允许你直接编写和优化原生SQL语句,同时提供了动态SQL的功能,方便根据条件拼接SQL语句。

    2. 需要高度可定制的映射:MyBatis提供了强大的结果映射功能,可以将查询结果自动映射到Java对象中。如果你的数据库结构与Java对象之间存在复杂的映射关系,例如一对一、一对多等关联关系,MyBatis可以很好地处理这些映射关系,并减少手动处理结果集的工作量。

    3. 需要对数据访问逻辑进行细粒度的控制:MyBatis允许你在SQL语句的执行过程中插入自定义的代码逻辑,包括拦截器、自定义类型处理器等。这样你可以对数据访问逻辑进行更细粒度的控制和定制,例如添加自定义的日志、缓存逻辑或者性能监控等。

    4. 需要细粒度地控制事务:MyBatis允许你对事务进行细粒度的控制,包括手动提交和回滚事务。如果你需要精确地控制事务边界,例如在一个方法中执行多个数据库操作,可以使用MyBatis的事务管理功能。

    5. 对性能有较高要求:MyBatis提供了一级缓存和二级缓存的支持,可以缓存查询结果,提高查询性能。通过合理配置和使用缓存,可以减少数据库访问次数,提高系统的响应速度和吞吐量。

    总的来说,MyBatis适用于对SQL语句和数据访问逻辑有较高要求的项目,它提供了灵活的SQL编写方式、强大的结果映射功能和可定制性,可以满足复杂的业务需求。但同时,也需要开发者对数据库操作和SQL语句有一定的了解和掌握。

    JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

    JDBC(Java Database Connectivity)是Java语言与数据库进行交互的标准接口,虽然它具有一定的优势,但也存在一些不足之处。以下是JDBC编程的一些不足之处以及MyBatis是如何解决这些问题的:

    1. 冗余的样板代码:JDBC编程需要大量的样板代码来处理数据库连接、事务管理、SQL语句的拼接和结果集的处理等。这些代码冗余且容易出错,增加了开发和维护的工作量。

      MyBatis解决方案:MyBatis通过提供SQL映射配置文件和自定义接口来减少冗余的样板代码。开发者只需编写少量的配置和接口代码,MyBatis会自动处理数据库连接、事务管理和结果集的映射,简化了开发流程。

    2. SQL与Java代码的混合:在JDBC编程中,SQL语句通常与Java代码混合在一起,导致SQL的可读性差、维护困难,并且在修改SQL时需要重新编译Java代码。

      MyBatis解决方案:MyBatis将SQL与Java代码分离,通过XML配置文件或注解方式来定义SQL语句,使得SQL可读性更高,便于维护和修改,无需重新编译Java代码。

    3. 数据库操作的细节:JDBC编程需要开发者手动处理数据库连接的获取和释放、事务管理和异常处理等细节,容易出现资源泄露和错误处理不当的问题。

      MyBatis解决方案:MyBatis封装了底层的数据库访问细节,自动管理数据库连接的获取和释放,提供了事务管理机制,简化了数据库操作的细节处理,减少了出错的可能性。

    4. 性能优化困难:JDBC编程需要开发者手动优化SQL语句、使用批处理和分页等技术来提高性能,这对于不熟悉数据库优化的开发者来说可能较为困难。

      MyBatis解决方案:MyBatis提供了缓存机制、动态SQL和插件扩展等功能,可以帮助开发者进行性能优化。它提供了一些优化技术,如缓存查询结果、动态拼接SQL语句和自定义插件,简化了性能优化的工作。

    综上所述,MyBatis通过提供SQL与Java代码分离、自动处理数据库连接和事务管理、性能优化等功能,解决了JDBC编程中存在的冗余代码、SQL与Java代码混合、细节处理和性能优化困难等问题,提供了更简洁、易于维护和优化的数据库访问解决方案。

    MyBatis与Hibernate有哪些不同?

    MyBatis和Hibernate是两个非常流行的Java持久层框架,它们在一些方面有着明显的不同:

    1. SQL控制方式:MyBatis采用基于SQL的方式,开发者需要手动编写和优化SQL语句,可以对SQL进行精确控制和优化。而Hibernate采用基于对象的方式,开发者不需要编写SQL语句,框架会自动将对象持久化到数据库中,或者从数据库中检索对象。

    2. 对象关系映射(ORM):MyBatis将查询结果映射到Java对象中,提供了灵活的结果映射功能,可以处理复杂的关联关系。但是,开发者需要手动编写SQL语句和结果映射规则。Hibernate则完全执行ORM,自动将数据库表和Java对象进行映射,无需手动编写SQL语句和映射规则。

    3. 查询灵活性:MyBatis提供了动态SQL的功能,可以根据条件动态拼接SQL语句,灵活性较高,适合复杂查询。Hibernate使用Hibernate Query Language(HQL)进行查询,它是一种面向对象的查询语言,类似于SQL,但语法更接近于Java,可以方便地进行对象导航和查询。

    4. 缓存机制:MyBatis提供了一级缓存和二级缓存的支持,可以缓存查询结果,提高查询性能。一级缓存是在会话级别缓存,而二级缓存是在应用程序级别缓存。Hibernate也提供了缓存机制,但缓存的粒度更细,包括对象级缓存、集合级缓存等。

    5. 对数据库的依赖:MyBatis相对于Hibernate对数据库的依赖较低,开发者需要手动编写SQL语句和处理数据库连接、事务等细节。Hibernate则对数据库的依赖较高,框架会自动处理SQL语句的生成、连接管理和事务控制。

    6. 学习曲线:MyBatis相对于Hibernate来说学习曲线较陡峭,需要开发者熟悉SQL语句的编写和优化。Hibernate则相对较简单,使用者只需了解框架提供的API和配置,无需关注SQL语句的编写。

    选择使用MyBatis还是Hibernate取决于项目的需求和开发者的偏好。如果对SQL的精确控制和灵活性有较高要求,或者需要处理复杂的关联关系,MyBatis可能是更好的选择。如果对开发速度和对象导航查询有较高要求,或者对SQL编写不熟悉,Hibernate可能更适合。

    # 谈一下你对 mybatis 缓存机制的理解?

    Mybatis中一级缓存与二级缓存

    MyBatis提供了两级缓存来提高查询性能:一级缓存和二级缓存。

    1. 一级缓存:

      • 一级缓存是MyBatis默认开启的,它是在SqlSession的生命周期内有效的。
      • 当SqlSession执行查询操作时,查询的结果会被缓存到一级缓存中,下次相同的查询可以直接从缓存中获取结果,避免了重复查询数据库的开销。
      • 一级缓存是基于对象引用的缓存,即当SqlSession关闭或执行了更新操作(插入、更新、删除)时,缓存将被清空,所有缓存的对象将失效。
    2. 二级缓存:

      • 二级缓存是跨SqlSession的缓存,可以被多个SqlSession共享。
      • 二级缓存需要手动配置并开启,在MyBatis的配置文件中进行配置。
      • 当SqlSession执行查询操作时,结果会被缓存到二级缓存中,其他的SqlSession可以从二级缓存中获取结果。
      • 二级缓存是基于缓存对象的序列化和反序列化,因此需要缓存的对象必须实现序列化接口。
      • 更新操作会导致二级缓存的失效,因为更新操作可能会改变缓存中的数据。

    需要注意的是,虽然缓存可以提高查询性能,但在某些场景下可能会导致数据不一致的问题。因此,对于经常变动的数据或者对数据强一致性要求较高的场景,建议谨慎使用缓存,或者在更新操作时手动刷新缓存。

    可以通过配置文件中的元素来配置二级缓存,通过:用于定义查询操作的 SQL 语句。

  • :用于定义插入操作的 SQL 语句。

  • :用于定义更新操作的 SQL 语句。

  • :用于定义删除操作的 SQL 语句。

  • :用于定义可重用的 SQL 片段,可以在其他 SQL 语句中引用。

  • :用于在 SQL 语句中进行条件判断和分支选择。

  • :用于引入外部的 SQL 片段,增强 SQL 的可重用性。

  • :用于循环遍历集合或数组,并在 SQL 语句中生成对应的参数。

  • 这些标签涵盖了 MyBatis 中常见的配置和映射操作,通过它们可以进行灵活的 SQL 编写和与数据库的交互。

    Mybatis执行流程?

    在这里插入图片描述
    MyBatis 的执行流程可以大致分为以下几个步骤:

    1. 加载配置文件:MyBatis 在启动时会加载配置文件(通常是 mybatis-config.xml),该配置文件包含了 MyBatis 的全局配置信息,如数据库连接信息、类型别名、映射文件等。

    2. 创建 SqlSessionFactory:通过配置文件,MyBatis 创建一个 SqlSessionFactory 对象,SqlSessionFactory 是 MyBatis 的核心对象,负责创建 SqlSession。

    3. 创建 SqlSession:通过 SqlSessionFactory 创建一个 SqlSession 对象,SqlSession 提供了与数据库交互的方法,包括执行 SQL 语句、获取映射器等。

    4. 获取映射器(Mapper):通过 SqlSession 获取映射器(Mapper)接口的实例,映射器接口定义了要执行的 SQL 操作。

    5. 执行 SQL 操作:通过映射器接口的方法执行 SQL 操作,可以执行查询、插入、更新、删除等操作。

    6. SQL 解析与执行:在执行 SQL 操作时,MyBatis 会解析映射器接口的方法名,并根据方法名找到对应的 SQL 语句。MyBatis 支持使用 XML 文件或注解的方式来定义 SQL 语句,根据配置的方式不同,解析的方式也会略有不同。

      • XML 方式:MyBatis 会根据映射器接口的名称和方法名,找到对应的 XML 映射文件,并解析其中定义的 SQL 语句。

      • 注解方式:MyBatis 会通过 Java 反射机制获取映射器接口上的注解信息,从而得到对应的 SQL 语句。

    7. 参数处理与绑定:MyBatis 会将方法参数与 SQL 语句中的参数进行绑定,将参数传递给 SQL 语句中的占位符。

    8. SQL 执行与结果映射:MyBatis 执行 SQL 语句,并将数据库返回的结果映射为 Java 对象,可以通过配置的 ResultMap 进行对象属性与结果集的映射。

    9. 事务管理:根据配置的事务管理方式,MyBatis 可能会在适当的时机开启、提交或回滚事务。

    10. 关闭 SqlSession:在完成数据库操作后,需要关闭 SqlSession,释放资源。

    这是一个基本的 MyBatis 执行流程,具体的执行细节和步骤可能会受到配置和使用方式的影响。通过以上的流程,MyBatis 实现了将 Java 对象与数据库之间的映射和交互,简化了与数据库的编程工作。
    都看到这了,点个赞吧🚀

  • 相关阅读:
    1.3 字符编码
    Transformer-2. 注意力分数
    YOLOv5改进 | 独家创新篇 | 利用DCNv3结合DLKA形成全新的注意力机制(全网独家创新)
    状压dp:Gym - 102832J
    adb shell settings高级指令设置系统属性所有的指令汇总+注释
    MySql中的锁
    【AI】PyTorch入门(五):构建神经模型
    FOXBORO FBM233 P0926GX控制脉冲模块
    一篇文章带你了解立仪点激光位移传感器
    JVM内存和垃圾回收-14.垃圾回收相关概念
  • 原文地址:https://blog.csdn.net/qq_45832651/article/details/136086426