我是 javapub,一名 Markdown 程序员从‍,八股文种子选手。


面试1v1》 连载中…


面试官: 祝贺你进到面试的最终一个环节!你对 MyBatis 比较熟悉吗?

提名人: 谢谢面试官!MyBatis 是我最喜欢且熟练使用的耐久层框架之一。

面试官: 那很好,咱们从根底开始问吧。什么是 MyBatis?

提名人: MyBatis 是一款优异的耐久层框架,它内部封装了 JDBC,使开发者只需要重视 SQL 句子本身,而不需要花费精力去处理加载驱动、创立衔接、创立 statement 等冗杂的进程。

面试官: MyBatis 的作业原理能说一下吗?

提名人: MyBatis 的作业原理如下:

  1. 依据 XML 或注解的装备文件得到映射句子(也便是 SQL)。
  2. 把要调用的映射句子的参数传入并解析出 statement 中对应的占位符。
  3. 履行映射句子并得到结果。
  4. 把结果映射为 Java 目标并返回。

整个进程中最要害的部份是映射文件及映射进程。只有把 SQL 的履行结果映射成 Java 目标,才能达到 ORM 的意图。

面试官: 那它的中心组件有哪些?

提名人: MyBatis 的中心组件主要有:

  1. SqlSessionFactoryBuilder:用于创立 SqlSessionFactory,gue有 XML 或注解来装备。
  2. SqlSessionFactory:SqlSession 的工厂,用于创立 SqlSession。
  3. SqlSession:用于履行映射句子并commit、rollback 业务。
  4. Mapper 接口:用于定义映射句子(也便是 SQL),下面会详细解说。
  5. 映射文件:包括了映射句子,可以是 XML 或注解。

面试官: 已然你提到了 Mapper 接口,那它是什么?

提名人: Mapper 接口是 MyBatis 中非常重要的一个组件。它是由开发人员创立的接口,其间的办法直接对应映射文件中的 SQL 句子。
举个例子:

public interface UserMapper {
    User selectUser(int id);
} 

然后在映射文件中:

<select id="selectUser" resultType="User">
  select * from user where id = #{id}
</select>

之后咱们可以直接调用:

User user = session.getMapper(UserMapper.class).selectUser(1);

这样直接调用 Mapper 接口的办法就可以履行对应的 SQL 了,很方便。

面试官: 动态 SQL 又是什么?

提名人: MyBatis 的动态 SQL 是非常强大的一个功用。它答应开发人员在 XML 映射文件中直接插入一些逻辑,如:

  • if/else 分支
  • 动态选择部分内容
  • 提取重复代码块

举个例子:

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = 'ACTIVE' 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

这儿经过 标签完成了动态条件查询。只有在办法调用时传入了 title 参数,SQL 句子才会添加 title 的条件判别。
这样的动态 SQL 使得数据库交互愈加灵活,不需要在程序中进行很多的字符串拼接。

面试官: 最终两个问题,MyBatis 的缓存机制和插件机制能说一下吗?

提名人:

  1. MyBatis 包括一级缓存和二级缓存。
  • 一级缓存是 SqlSession 等级的缓
  • 一级缓存是 SqlSession 等级的缓存,在同一个 SqlSession 中多次调用同一个 Mapper 的办法,MyBatis 会直接从缓存中获取数据。
  • 二级缓存是 Mapper 等级的缓存,多个 SqlSession 去调用同一个 Mapper 的办法,MyBatis 会先去二级缓存中查找是否有数据,有的话直接返回,没有的话再查询数据库。
  1. MyBatis 的插件机制也很强大。咱们可以经过完成 Interceptor 接口来编写插件,用于履行一些增强操作,比方:
  • 分页帮手:经过阻拦履行的 SQL 句子完成物理分页
  • 监控日志:监控 SQL 履行时间过长等
  • 读写别离:依据办法的注解完成读写别离
    举个简单例子:
public class MyFirstPlugin implements Interceptor {
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    // 调用办法之前
    Object result = invocation.proceed();
    // 调用办法之后
    return result;
  }
}

然后在装备文件中进行装备:

<plugins>
  <plugin interceptor="org.mybatis.example.MyFirstPlugin"> 
    <property name="someProperty" value="100"/>
  </plugin> 
</plugins>

就可以启动对一切 SQL 履行的阻拦了。

面试官: MyBatis 的内容咱们就先讲到这儿,你对它的了解很深化,加油!等待你加入咱们团队!

提名人: 非常感谢面试官的赏识!我会继续努力学习,不断提高自己。也很等待加入贵团队一同成长!

最近我在更新《面试1v1》系列文章,主要以场景化的方式,解说咱们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以重视JavaPub追更!


《面试1v1》 连载中…


目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

javapub.net.cn