面试题总结
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。 

mybaits(十)mybatis常见面试的更多相关文章

  1. 【面经】MyBatis常见面试问题

    1.什么是 MyBatis? 答:MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. 2.讲下 MyBatis 的缓存 答:MyBatis 的缓存分为一级缓存和二级缓存,一级缓 ...

  2. Java程序员备战“金九银十”必备的面试技巧(附携程Java岗面试题)

    一.面试前的准备 1.1 如何准备一场面试1.1.1 如何获取大厂面试机会1.1.2 面试必知 ①. 准备介绍自己 ②. 关于着装 ③ .随身带上自己的成绩单和简历 ④. 如果笔试就提前刷一些笔试题 ...

  3. Android开发面试经——6.常见面试官提问Android题②(更新中...)

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...

  4. Android开发面试经——5.常见面试官提问Android题①

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...

  5. 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...

  6. Android 应用中十大常见 UX 错误

    [核心提示] Android 开发者关系团队每天都会试用无数的 App 或者受到无数的开发者发来的请求评测的 App,在评测如此之多的应用之后,他们总结出了10个最常见的错误. 作为一个长期使用 An ...

  7. [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...

  8. java异常常见面试问题

    java异常常见面试问题 一.java异常的理解 异常主要是处理编译期不能捕获的错误.出现问题时能继续顺利执行下去,而不导致程序终止,确保程序的健壮性. 处理过程:产生异常状态时,如果当前的conte ...

  9. (转)C/C++ 程序设计员应聘常见 面试笔试 试题深入剖析

    C/C++ 程序设计员应聘常见 面试笔试 试题深入剖析 http://www.nowcoder.com/discuss/1826?type=2&order=0&pos=23&p ...

随机推荐

  1. PW2320芯片N沟道增强型MOSFET

    PW2320采用先进的沟道技术,以提供优良的RDS(ON),低栅电荷和电压门极电压低至2.5V时工作.该装置适合用作电池保护或在其他开关应用中. 特征 VDS=20V ID=8A RDS(开)< ...

  2. uni-app开发经验分享二十一: 图片滑动解锁插件制作解析

    在开发用户模块的时候,相信大家都碰到过一个功能,图片滑动解锁后发送验证码,这里分享我用uni-app制作的一个小控件 效果如下: 需要如下图片资源 template <template> ...

  3. uni-app 微信小程序 picker 三级联动

    之前做过一个picker的三级联动功能,这里分享代码给大家 具体代码: // An highlighted block <template> <view> <picker ...

  4. 导出exe的经验

    安装pyinstaller 首先要找到scripts的绝对路径(主要是找到scripts就行了 先是安装C:\Users\96290\AppData\Local\Programs\Python\Pyt ...

  5. 大数据系列2:Hdfs的读写操作

    在前文大数据系列1:一文初识Hdfs中,我们对Hdfs有了简单的认识. 在本文中,我们将会简单的介绍一下Hdfs文件的读写流程,为后续追踪读写流程的源码做准备. Hdfs 架构 首先来个Hdfs的架构 ...

  6. 解决 win10 无法安装VS2019,visual studio installer下载进度始终为0

    解决 win10 无法安装VS2019,visual studio installer下载进度始终为0 目录 解决 win10 无法安装VS2019,visual studio installer下载 ...

  7. C# 防止程序多开(重复开启)

    Mutex(mutual exclusion,互斥)是 .Net Framework 中提供跨多个线程同步访问的一个类.它非常类似了 Monitor 类,因为他们都只有一个线程能拥有锁定.而操作系统能 ...

  8. PowerBI官方文档

    Excel 帮助和学习 - Microsoft 支持https://support.microsoft.com/zh-cn/excel Power Query M 公式语言引用 - PowerQuer ...

  9. Redis 实战 —— 12. 降低内存占用

    简介 降低 Redis 的内存占用有助于减少创建快照和加载快照所需的时间.提升载入 AOF 文件和重写 AOF 文件时的效率.缩短从服务器进行同步所需的时间(快照. AOF 文件重写在 持久化选项 中 ...

  10. JavaWeb——Servlet开发

    什么是Servlet? Servlet运行的过程 Servlet的生命周期 生命周期的各个阶段 Servlet的配置 使用Web.xml配置 使用注解配置 Servlet相关接口 ServletCon ...