• MyBatis 面试题(八)


    1. MyBatis-Plus 是什么框架?

    MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上进行了功能扩展和增强,旨在简化开发、提高效率。这个框架提供了许多方便的功能,如自动生成 MyBatis 的 mapper 接口以及对应的实现类,提供了一些通用的 CRUD(创建、读取、更新、删除)方法,支持 Lambda 表达式查询,提供了分页查询的功能,支持主键自动生成,以及提供了代码生成器,可以快速生成代码。

    MyBatis-Plus 的优点包括:

    1. 依赖少:仅仅依赖 MyBatis 以及 MyBatis-Spring。
    2. 损耗小:启动即会自动注入基本 CRUD,性能基本无损耗,直接面向对象操作。
    3. 预防 SQL 注入:内置 SQL 注入剥离器,有效预防 SQL 注入攻击。
    4. 通用 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。
    5. 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
    6. 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
    7. 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询问题。

    在使用 MyBatis-Plus 时,通常需要进行以下步骤:

    1. 配置数据源:在配置文件中配置数据库连接信息,如驱动、URL、用户名和密码等。
    2. 创建实体类:创建与数据库表对应的实体类,使用注解或 XML 配置实体类与数据库表的映射关系。
    3. 创建 Mapper 接口:创建继承 BaseMapper 接口的 Mapper 接口,并在方法上添加对应的注解,如 @Select@Update@Insert@Delete 等。
    4. 使用基本 CRUD 方法:使用 MyBatis-Plus 提供的基本 CRUD 方法,如 insertdeleteByIdupdateByIdselectById 等。
    5. 使用条件构造器:可以使用 MyBatis-Plus 提供的条件构造器来构建灵活的查询条件,如 WrapperQueryWrapperUpdateWrapper 等。

    总之,MyBatis-Plus 是一个功能强大且易于使用的 MyBatis 增强工具,它提供了许多方便的功能和特性,可以帮助开发者更高效地进行数据库操作。

    2. 什么是 JPA?

    JPA(Java Persistence API)是Java持久化API的缩写,它是一套由Sun Microsystems官方提出的Java持久化规范(即ORM映射规范)。JPA是在Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。它整合了ORM映射和JPA规范,很大程度上简化了现有Java应用的持久化开发。

    JPA的主要目标是提供一种简单的、统一的API来访问关系数据库。它把底层的数据访问逻辑从业务逻辑中解耦出来,使得开发者能够专注于业务逻辑的实现,而无需关心底层的数据库访问细节。通过JPA,开发者可以使用面向对象的方式来操作数据库,例如创建、读取、更新和删除数据,而无需编写大量的SQL语句。

    JPA还提供了一些高级特性,如事务管理、缓存和查询优化等,这些特性可以帮助开发者提高应用的性能和可维护性。此外,JPA还支持多种数据库和JDBC驱动,使得开发者能够灵活地选择适合自己项目需求的数据库和JDBC驱动。

    总之,JPA是一种强大的Java持久化规范,它提供了简单易用的API来访问关系数据库,帮助开发者实现高效的数据访问和管理。

    3. MyBatis 和JPA 有什么区别?

    MyBatis和JPA在多个方面存在明显的区别。

    1. 开发方式:MyBatis是一种SQL中心的开发方式,它允许开发者直接编写SQL语句,并提供强大的动态SQL功能,使得根据不同条件构建不同的SQL语句成为可能,提高了SQL语句的灵活性。而JPA则是一种对象中心的开发方式,它让开发者可以专注于业务逻辑和对象模型,而不需要关心SQL语句的细节。
    2. 事务管理:JPA支持事务管理,提供了一组注解和API来管理事务的起始、提交和回滚,确保数据的一致性和完整性。相比之下,MyBatis本身并不直接处理事务管理,它更多地关注于SQL的映射和执行,而事务管理通常是由调用者(如Spring框架)来处理的。
    3. 对象关系映射:JPA允许开发人员将Java对象映射到关系数据库的表结构中,实现简单的对象持久化。这可以通过注解或XML配置来定义对象与数据库表之间的映射关系。MyBatis虽然也支持对象与数据库的映射,但它更多地是通过XML或注解来定义SQL语句和参数,而不是直接处理对象与表之间的映射。
    4. 控制级别:JPA提供了更高层次的抽象和封装,使得开发者可以更加专注于业务逻辑。而MyBatis则提供了更低层次的控制和定制,允许开发者直接编写和优化SQL语句。
    5. 实现方式:JPA本身并不提供具体的实现,而是由如Hibernate、EclipseLink等框架来实现。MyBatis则是一个独立的框架,它提供了自己的API和工具。

    总结来说,MyBatis和JPA各有其特点和适用场景。MyBatis更适合那些需要直接控制SQL语句和需要高度定制化的场景,而JPA则更适合那些希望以对象为中心,减少直接编写SQL语句的场景。选择哪个框架取决于具体的项目需求和个人或团队的偏好。

    4. MyBatis 中 StatementHandler 和 MappedStatement 区别?

    MyBatis 是一个优秀的持久层框架,它封装了 JDBC 的底层操作细节,使得开发者能够更方便地进行数据库操作。在 MyBatis 中,StatementHandlerMappedStatement 都是重要的组件,但它们各自的角色和职责有所区别。

    1. StatementHandler

      • 角色:StatementHandler 是 MyBatis 中用于处理 JDBC Statement 的核心组件。
      • 职责:它负责处理 JDBC Statement 的创建、参数设置、SQL 语句执行以及结果集映射等工作。这意味着,当 MyBatis 需要与数据库进行交互时,它会通过 StatementHandler 来构建和执行相应的 SQL 语句,并将结果集转换为 Java 对象。
      • 实现:StatementHandler 接口有两个实现类,分别是 RoutingStatementHandler 和 BaseStatementHandler。其中,RoutingStatementHandler 会根据 MappedStatement 指定的 statementType 字段来创建对应的 StatementHandler 接口实现。
    2. MappedStatement

      • 角色:MappedStatement 是描述 Mapper 中 SQL 配置信息的关键组件。
      • 职责:它主要用于描述如何在数据库上执行 SQL。每一个