2024年 Java 面试八股文——Mybatis篇
创始人
2024-11-06 01:38:39
0

目录

1. 什么是Mybatis?

2. 说说Mybatis的优缺点

3. Xml映射文件中,都有哪些标签

4. #{}和&{}有什么区别

5. Mybatis是如何进行分页的,分页插件的原理是什么

6. Mybatis是如何将sql执行结果封装为目标对象并返回的?

7. Mybatis是怎么将mapper与xml联系起来的

8. 如何执行批量插入(SqlSessionFactory)

9. Mybatis通过jdk动态代理的原理

10. Mybatis的工作原理(重要)

11. Mybatis实现一对一、一对多有几种方式

12. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

13. 说说Mybatis的缓存机制


MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通的 Java 对象)为数据库中的记录。 

注:喜欢的朋友可以关注公众号“JAVA学习课堂”方便阅读,内容同步更新。

​​​​​​​

1. 什么是Mybatis?

Mybatis是持久层框架,半自动ORM框架,对JDBC操作数据库的过程进行了封装,使得开发者只需要关注sql本身。

JDBC操作数据库:加载JDBC驱动程序、提供JDBC连接的URL 、创建数据库的连接connection、创建一个Statement、执行SQL语句、处理结果、关闭JDBC对象

2. 说说Mybatis的优缺点

MyBatis 作为一个优秀的持久层框架,具有许多优点,但同时也存在一些潜在的缺点。以下是 MyBatis 的主要优缺点概述:

优点

  1. 灵活性:MyBatis 提供了非常灵活的方式来映射 SQL 语句到 Java 对象。通过 XML 配置文件或注解,你可以精确地控制 SQL 语句的生成,这使得在复杂或特定需求的场景中能够编写出精确的 SQL 语句。

  2. 避免 JDBC 编码:MyBatis 封装了 JDBC 的底层实现,开发者无需再编写大量的 JDBC 代码,如设置参数、处理结果集等,这大大减少了代码量,提高了开发效率。

  3. 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,允许你根据参数的不同动态地生成 SQL 语句。这使得在构建复杂查询时更加灵活和方便。

  4. 解耦:MyBatis 将 SQL 语句从 Java 代码中分离出来,放在 XML 配置文件中,这使得代码更加清晰、易于维护。同时,这也使得数据库层的修改可以独立于应用层进行。

  5. 插件机制:MyBatis 提供了插件机制,允许你编写自定义的插件来拦截和修改 SQL 语句的执行过程。这为扩展 MyBatis 的功能提供了很大的便利。

  6. 良好的性能:MyBatis 在处理大量数据时仍然能够保持较高的性能。它提供了缓存机制来缓存查询结果,避免重复执行相同的 SQL 语句。

缺点

  1. SQL 语句编写:虽然 MyBatis 提供了灵活的方式来映射 SQL 语句,但这也要求开发者具备一定的 SQL 编写能力。如果 SQL 语句编写不当,可能会影响性能或引发错误。

  2. XML 配置文件:MyBatis 的配置主要基于 XML 文件,这增加了配置文件的复杂性和维护成本。对于不熟悉 XML 的开发者来说,可能会感到有些困难。

  3. 错误处理:MyBatis 没有提供完整的错误处理机制。当 SQL 语句执行出错时,通常需要开发者自行处理错误并给出相应的提示。

  4. 学习曲线:对于初学者来说,MyBatis 的学习曲线可能比较陡峭。需要了解 MyBatis 的核心概念、配置方式、映射规则等。

  5. 与 ORM 框架的对比:与一些 ORM(对象关系映射)框架相比,MyBatis 需要手动编写 SQL 语句,这可能会增加一些工作量。ORM 框架通常能够自动处理数据库表与 Java 对象之间的映射关系,但在某些复杂场景下可能不够灵活。

  6. 依赖数据库:MyBatis 的 SQL 语句是针对特定数据库的,如果更换数据库,可能需要修改大量的 SQL 语句和映射配置。这增加了迁移数据库的难度。

3. Xml映射文件中,都有哪些标签

  1. :这是 XML 映射文件的根元素。它通常包含一个 namespace 属性,该属性指向映射文件对应的接口全限定路径。

  2. SELECT * FROM users WHERE id = #{id} INSERT INTO users (name, age) VALUES (#{name}, #{age})

    3. MyBatis 配置文件 

                                                                                                                                                                                                                                 

    4. SqlSessionFactory 与 SqlSession

    import org.apache.ibatis.io.Resources;   import org.apache.ibatis.session.SqlSession;   import org.apache.ibatis.session.SqlSessionFactory;   import org.apache.ibatis.session.SqlSessionFactoryBuilder;      import java.io.IOException;   import java.io.Reader;      public class MyBatisDemo {       public static void main(String[] args) {           String resource = "mybatis-config.xml";           try (Reader reader = Resources.getResourceAsReader(resource)) {               SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);                              try (SqlSession sqlSession = sqlSessionFactory.openSession()) {                   // ... 使用 sqlSession 调用 Mapper 接口的方法 ...               }           } catch (IOException e) {               e.printStackTrace();           }       }   }

    5. JDK 动态代理

    在 MyBatis 的内部实现中,当通过 sqlSession.getMapper(UserMapper.class) 获取 Mapper 接口的实例时,MyBatis 会使用 JDK 动态代理为 UserMapper 接口生成一个代理对象。但是,这部分代码是 MyBatis 框架内部实现的,我们不需要直接编写。

    6. 方法调用与 SQL 执行

    通过 sqlSession.getMapper(UserMapper.class) 获得的代理对象,我们可以像调用普通 Java 方法一样调用 Mapper 接口中的方法,MyBatis 会根据 XML 映射文件中的配置执行相应的 SQL 语句:

    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);       User user = userMapper.selectUserById(1); // 执行 SQL 查询

    10. Mybatis的工作原理(重要)

    MyBatis 的工作原理可以概括为以下几个重要步骤:

    1. mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(或者Java文件配置)来构建SqlSessionFactory(SqlSessionFactory是线程安全的)
    2. SqlSessionFactory实例通过openSession方法开启一个SqlSession
    3. 通过SqlSession实例的getMapper方法获得指定的Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession

    11. Mybatis实现一对一、一对多有几种方式

    1. 一对一
      1.  联合查询:联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成
      2.  嵌套查询:先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是
      3.  通过 association 配置,但另外一个表的查询通过 select 属性配置
    2. 一对多
      1.  联合查询:联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面配置 collection 节点配置一对一的类就可以完成
      2.  嵌套查询:先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是
      3.  通过 collection 配置,但另外一个表的查询通过 select 属性配置

    12. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

    MyBatis支持延迟加载

    延迟加载(Lazy Loading)是一种加载数据的策略,它只在真正需要数据时才进行加载,从而有助于提高系统性能和减少资源消耗。在MyBatis中,延迟加载的实现原理如下:

    1. 配置延迟加载:在MyBatis的配置文件或映射文件中,需要设置lazyLoadingEnabled=true来开启延迟加载功能。
    2. 生成代理对象:当主对象(如一个实体对象)被查询时,MyBatis会生成一个代理对象。这个代理对象包含了对关联对象的引用,但并不会立即加载关联对象的数据。
    3. 触发时机:当应用程序需要访问代理对象中的关联属性时,延迟加载机制会被触发。此时,MyBatis会创建一个新的SQL语句来查询关联对象的数据。
    4. 填充数据:查询完成后,MyBatis会将查询到的数据填充到代理对象中,使得关联属性变得可用。

    MyBatis的延迟加载主要有两种类型:

    • 全局延迟加载(全局懒加载):在MyBatis的配置文件中配置开启全局延迟加载。这样,对于所有的关联关系,都会按照配置进行延迟加载。
    • 按需延迟加载(按需懒加载):在映射文件中使用fetchType属性设置按需延迟加载。这样,只有在需要的时候才会进行延迟加载。

    通过配置全局延迟加载或按需延迟加载,可以根据实际业务需求灵活地使用延迟加载功能,从而提高系统性能。

    13. 说说Mybatis的缓存机制

    Mybatis 有两级缓存,一级缓存是 SqlSession 级别的,默认开启,无法关闭;二级缓 存是 Mapper 级别的,二级缓存默认是没有开启的,但是手动开启

    1. 一级缓存:基础 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,Session 中的所有 Cache 就将清空

    2. 二级缓存其存储作用域为 Mapper(Namespace),使用二级缓存属性类需要实现Serializable 序列化接口

    3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存 Namespaces)的进行了 C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有 select 中的缓存将被 clear.需要在 setting 全局参数中配置开启二级缓存,如下 conf.xml 配置:

      

    当我们的配置文件配置了 cacheEnabled=true 时,就会开启二级缓存,二级缓存是 mapper 级别的,如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓 存→数据库。

相关内容

热门资讯

科技通报(AAPOKEr)软件... 科技通报(AAPOKEr)软件透明挂黑科技(ai辅助工具)一直真的有挂(黑科技教程)-哔哩哔哩;1、...
透视教你!wepower有辅助... 透视教你!wepower有辅助软件软件透明挂,We辅poker助原来真的有挂,黑科技手筋(有挂教程)...
玩家攻略(德州机器人)软件透明... 玩家攻略(德州机器人)软件透明挂黑科技(辅助挂)果真真的有挂(黑科技教程)-哔哩哔哩德州机器人软件透...
透视必赢方法!wepokeai... 透视必赢方法!wepokeai辅助软件透明挂,Wpk一直真的有挂,黑科技秘籍(有挂机器人)1、金币登...
大家学习交流(线上wpk德州)... 大家学习交流(线上wpk德州)软件透明挂黑科技(辅助器)好像真的有挂(黑科技教程)-哔哩哔哩;1、超...
透视规律!wopoker轻量版... 透视规律!wopoker轻量版挂软件透明挂,aapokER好像真的有挂,黑科技手筋(有挂透视挂)暗藏...
一分钟带你了解(aAPOKER... 一分钟带你了解(aAPOKER)软件透明挂黑科技(发牌机制)原来真的有挂(透视教程)-哔哩哔哩1、完...
透视新!wepoke软件收费是... 透视新!wepoke软件收费是真的软件透明挂,wpK其实真的有挂,黑科技办法(有挂辅助)1、不需要A...
9分钟了解(手机德州)软件透明... 9分钟了解(手机德州)软件透明挂黑科技(起手牌胜率图)果然真的有挂(黑科技教程)-哔哩哔哩;1)手机...
透视总结!wopoker辅助v... 透视总结!wopoker辅助v3.0软件透明挂,WepOke的确真的有挂,黑科技方法(有挂智能ai)...