面试题总结
1、MyBatis 解决了什么问题?
或:为什么要用 MyBatis?
或:MyBatis 的核心特性?
1)资源管理(底层对象封装和支持数据源)
2)结果集自动映射
3)SQL 与代码分离,集中管理
4)参数映射和动态 SQL
5)其他:缓存、插件等
2、MyBatis 编程式开发中的核心对象及其作用?
SqlSessionFactoryBuilder 创建工厂类
SqlSessionFactory 创建会话
SqlSession 提供操作接口
MapperProxy 代理 Mapper 接口后,用于找到 SQL 执行
3、Java 类型和数据库类型怎么实现相互映射?
通过 TypeHandler,例如 Java 类型中的 String 要保存成 varchar,就会自动调
用相应的 Handler。如果没有系统自带的 TypeHandler,也可以自定义。
4、SIMPLE/REUSE/BATCH 三种执行器的区别?
SimpleExecutor 使用后直接关闭 Statement:closeStatement(stmt);
// SimpleExecutor.java
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
Statement stmt = null;
//中间省略……
} finally {
closeStatement(stmt);
}
}
20咕泡出品,必属精品 www.gupaoedu.com
ReuseExecutor 放在缓存中,可复用:PrepareStatement——getStatement()
// ReuseExecutor.Java
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
//中间省略……
Statement stmt = prepareStatement(handler, ms.getStatementLog());
//中间省略……
}
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws
SQLException {
Statement stmt;
//中间省略……
if (hasStatementFor(sql)) {
stmt = getStatement(sql);
//中间省略……
}
private Statement getStatement(String s) {
return statementMap.get(s);
}
BatchExecutor 支持复用且可以批量执行 update(),通过 ps.addBatch()实现
handler.batch(stmt);
// BatchExecutor.Java
public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
//中间省略……
final Statement stmt;
//中间省略……
stmt = statementList.get(last);
//中间省略……
statementList.add(stmt);
batchResultList.add(new BatchResult(ms, sql, parameterObject));
}
handler.batch(stmt);
}
7、MyBatis 一级缓存与二级缓存的区别?
一级缓存:在同一个会话(SqlSession)中共享,默认开启,维护在 BaseExecutor
中。
二级缓存:在同一个 namespace 共享,需要在 Mapper.xml 中开启,维护在
CachingExecutor 中。
8、MyBaits 支持哪些数据源类型?
UNPOOLED:不带连接池的数据源。
POOLED : 带 连 接 池 的 数 据 源 , 在 PooledDataSource 中 维 护
PooledConnection。
PooledDataSource 的 getConnection()方法流程图:
JNDI:使用容器的数据源,比如 Tomcat 配置了 C3P0。
自定义数据源:实现 DataSourceFactory 接口,返回一个 DataSource。
当 MyBatis 集成到 Spring 中的时候,使用 Spring 的数据源。
9、关联查询的延迟加载是怎么实现的?
动态代理(JAVASSIST、CGLIB),在创建实体类对象时进行代理,在调用代理
对象的相关方法时触发二次查询。
10、MyBatis 翻页的几种方式和区别?
逻辑翻页:通过 RowBounds 对象。
物理翻页:通过改写 SQL 语句,可用插件拦截 Executor 实现。
11、怎么解决表字段变化引起的 MBG 文件变化的问题?
Mapper 继 承 : 自 动 生 成 的 部 分 不 变 , 创 建 接 口 继 承 原 接 口 , 创 建
MapperExt.xml。在继承接口和 MapperExt.xml 中修改。
通用 Mapper:提供支持泛型的通用 Mapper 接口,传入对象类型。
13、解析全局配置文件的时候,做了什么?
创建 Configuration,设置 Configuration
解析 Mapper.xml,设置 MappedStatement
14、没有实现类,MyBatis 的方法是怎么执行的?
MapperProxy 代理,代理类的 invoke()方法中调用了 SqlSession.selectOne()
15、接口方法和映射器的 statement id 是怎么绑定起来的?
(怎么根据接口方法拿到 SQL 语句的?)
MappedStatement 对象中存储了 statement 和 SQL 的映射关系
16、四大对象是什么时候创建的?
Executor:openSession()
StatementHandler、ResultsetHandler、ParameterHandler:
执行 SQL 时,在 SimpleExecutor 的 doQuery()中创建
17、ObjectFactory 的 create()方法什么时候被调用?
第一次被调用,创建 DefaultResultHandler 的时候:
DefaultResultSetHandler 类中:
handleResultSet new DefaultResultHandler()
第二次被调用,处理结果集的时候:
DefaultResultSetHandler
handleResultSets——
handleRowValues——
handleRowValuesForSimpleResultMap——
getRowValue——
createResultObject——
createResultObject——
18、MyBatis 哪些地方用到了代理模式?
接口查找 SQL:MapperProxy
日志输出:ConnectionLogger、StatementLogger
连接池:PooledDataSource 管理的 PooledConnection
延迟加载:ProxyFactory(JAVASSIST、CGLIB)
插件:Plugin
Spring 集成:SqlSessionTemplate 的内部类 SqlSessionInterceptor
19、MyBatis 主要的执行流程?涉及到哪些对象?
20、MyBatis 插件怎么编写和使用?原理是什么?(画图)
使用:继承 Interceptor 接口,加上注解,在 mybatis-config.xml 中配置
原理:动态代理,责任链模式,使用 Plugin 创建代理对象
在被拦截对象的方法调用的时候,先走到 Plugin 的 invoke()方法,再走到
Interceptor 实现类的 intercept()方法,最后通过 Invocation.proceed()方法调用被
拦截对象的原方法
21、JDK 动态代理,代理能不能被代理?能
22、MyBatis 集成到 Spring 的原理是什么?
SqlSessionTemplate 中有内部类SqlSessionInterceptor对DefaultSqlSession
进行代理;
MapperFactoryBean继承了SqlSessionDaoSupport获取
SqlSessionTemplate;
接口注册到 IOC 容器中的 beanClass 是 MapperFactoryBean。
23、DefaulSqlSession 和 SqlSessionTemplate 的区别是什么?
1)为什么 SqlSessionTemplate 是线程安全的?
其内部类 SqlSessionInterceptor 的 invoke()方法中的 getSqlSession()方法:
如果当前线程已经有存在的 SqlSession 对象,会在 ThreadLocal 的容器中拿到
SqlSessionHolder,获取 DefaultSqlSession。
如果没有,则会 new 一个 SqlSession,并且绑定到 SqlSessionHolder,放到
ThreadLocal 中。
SqlSessionTemplate 中在同一个事务中使用同一个 SqlSession。
调用 closeSqlSession()关闭会话时,如果存在事务,减少 holder 的引用计数。否
则直接关闭 SqlSession。
2)在编程式的开发中,有什么方法保证 SqlSession 的线程安全?
SqlSessionManager 同时实现了 SqlSessionFactory、SqlSession 接口,通过
ThreadLocal 容器维护 SqlSession。
- 【面经】MyBatis常见面试问题
1.什么是 MyBatis? 答:MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. 2.讲下 MyBatis 的缓存 答:MyBatis 的缓存分为一级缓存和二级缓存,一级缓 ...
- Java程序员备战“金九银十”必备的面试技巧(附携程Java岗面试题)
一.面试前的准备 1.1 如何准备一场面试1.1.1 如何获取大厂面试机会1.1.2 面试必知 ①. 准备介绍自己 ②. 关于着装 ③ .随身带上自己的成绩单和简历 ④. 如果笔试就提前刷一些笔试题 ...
- Android开发面试经——6.常见面试官提问Android题②(更新中...)
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...
- Android开发面试经——5.常见面试官提问Android题①
版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- Android 应用中十大常见 UX 错误
[核心提示] Android 开发者关系团队每天都会试用无数的 App 或者受到无数的开发者发来的请求评测的 App,在评测如此之多的应用之后,他们总结出了10个最常见的错误. 作为一个长期使用 An ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- java异常常见面试问题
java异常常见面试问题 一.java异常的理解 异常主要是处理编译期不能捕获的错误.出现问题时能继续顺利执行下去,而不导致程序终止,确保程序的健壮性. 处理过程:产生异常状态时,如果当前的conte ...
- (转)C/C++ 程序设计员应聘常见 面试笔试 试题深入剖析
C/C++ 程序设计员应聘常见 面试笔试 试题深入剖析 http://www.nowcoder.com/discuss/1826?type=2&order=0&pos=23&p ...
随机推荐
- Linux下载并安装JDK1.8
https://blog.csdn.net/Future_LL/article/details/84667634
- java 日期与时间操作
我们先来了解一下基本的概念 日期 2020-11-21 2020-11-22 时间 15:36:43 2020-11-21 15:36:43 时区 北京时间 2020-11-21 15:36:43 东 ...
- 企业项目迁移go-zero全攻略(二)
承接上篇:上篇文章讲到 go-zero 架构设计和项目设计.本篇文章接着这个项目设计,将生成的 app 模块 中 gateway 和 RPC 进行改造.废话不多说,让我们开始! gateway ser ...
- 转 Fiddler5 发送HTTP请求
Fiddler5 发送HTTP请求 文章转自:https://www.cnblogs.com/zhengna/p/10879573.html 1.Fiddler Composer发送HTTP请求 C ...
- SpringBoot 自动配置:Spring Data JPA
前言 不知道从啥时候开始项目上就一直用MyBatis,其实我个人更新JPA些,因为JPA看起来OO的思想更强烈些,所以这才最近把JPA拿出来再看一看,使用起来也很简单,除了定义Entity实体外,声明 ...
- centos下解压rar文件,Linux解压tar.gz和tar.bz2的命令
1.下载:根据主机系统下载合适的版本,当前64为centos系统演示下载: wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz 2.解压安 ...
- 删除HDFS中指定的文件。
1 import java.text.SimpleDateFormat; 2 import java.util.Scanner; 3 4 import org.apache.hadoop.fs.Fil ...
- https://dev.mysql.com/doc/refman/8.0/en/savepoint.html
https://dev.mysql.com/doc/refman/8.0/en/savepoint.html
- 为了更好的多线程性能,在对象创建或者更新时,若数据大于2047字节则 Python 的 GIL 会被释放。 执行计算密集型任务如压缩或哈希时释放 GIL
hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...
- JavaScript与多线程的不解之缘!
前言 对于前端开发者来说,多线程是一个比较陌生的话题.因为JavaScript是单线程语言.也就是说,所有任务只能在一个线程上完成,一次只能做一件事.前面的任务没做完,后面的任务只能等着. UI渲染与 ...