我是 javapub,一名 Markdown
程序员从,八股文种子选手。
《面试1v1》 连载中…
面试官: 祝贺你进到面试的最终一个环节!你对 MyBatis 比较熟悉吗?
提名人: 谢谢面试官!MyBatis 是我最喜欢且熟练使用的耐久层框架之一。
面试官: 那很好,咱们从根底开始问吧。什么是 MyBatis?
提名人: MyBatis 是一款优异的耐久层框架,它内部封装了 JDBC,使开发者只需要重视 SQL 句子本身,而不需要花费精力去处理加载驱动、创立衔接、创立 statement 等冗杂的进程。
面试官: MyBatis 的作业原理能说一下吗?
提名人: MyBatis 的作业原理如下:
- 依据 XML 或注解的装备文件得到映射句子(也便是 SQL)。
- 把要调用的映射句子的参数传入并解析出 statement 中对应的占位符。
- 履行映射句子并得到结果。
- 把结果映射为 Java 目标并返回。
整个进程中最要害的部份是映射文件及映射进程。只有把 SQL 的履行结果映射成 Java 目标,才能达到 ORM 的意图。
面试官: 那它的中心组件有哪些?
提名人: MyBatis 的中心组件主要有:
- SqlSessionFactoryBuilder:用于创立 SqlSessionFactory,gue有 XML 或注解来装备。
- SqlSessionFactory:SqlSession 的工厂,用于创立 SqlSession。
- SqlSession:用于履行映射句子并commit、rollback 业务。
- Mapper 接口:用于定义映射句子(也便是 SQL),下面会详细解说。
- 映射文件:包括了映射句子,可以是 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 的缓存机制和插件机制能说一下吗?
提名人:
- MyBatis 包括一级缓存和二级缓存。
- 一级缓存是 SqlSession 等级的缓
- 一级缓存是 SqlSession 等级的缓存,在同一个 SqlSession 中多次调用同一个 Mapper 的办法,MyBatis 会直接从缓存中获取数据。
- 二级缓存是 Mapper 等级的缓存,多个 SqlSession 去调用同一个 Mapper 的办法,MyBatis 会先去二级缓存中查找是否有数据,有的话直接返回,没有的话再查询数据库。
- 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