面试题总结
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. guava eventbus 原理+源码分析

    前言: guava提供的eventbus可以很方便的处理一对多的事件问题, 最近正好使用到了,做个小结,使用的demo网上已经很多了,不再赘述,本文主要是源码分析+使用注意点+新老版本eventbus ...

  2. Scheduling Multithreaded Computations by Work Stealing

    steal.pdf http://supertech.csail.mit.edu/papers/steal.pdf This paper studies the problem of eciently ...

  3. The router relies on a tree structure which makes heavy use of common prefixes, it is basically a compact prefix tree (or just Radix tree).

    https://github.com/julienschmidt/httprouter/

  4. ETL调优的一些分享(下)(转载)

    如在上篇文章<ETL调优的一些分享(上)>中已介绍的,ETL是构建数据仓库的必经一环,它的执行性能对于数据仓库构建性能有重要意义,因此对它进行有效的调优将十分重要.ETL业务的调优可以从若 ...

  5. 数据备份与恢复 半持久化 全持久化 fork aof rdb Backing up Disaster recovery 备份 容灾

    Redis数据备份与恢复 - 流年晕开时光 - 博客园 https://www.cnblogs.com/deny/p/11531355.html Redis数据备份与恢复 Redis所有数据都是保存在 ...

  6. SpringBoot+Spring常用注解总结

    为什么要写这篇文章? 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数). ...

  7. ResponseEntity和@ResponseBody以及@ResponseStatus区别

    看的迷迷糊糊的 https://www.jdon.com/springboot/responseentity.html

  8. nginx 配置文件解读

    参考:链接 在微服务的体系之下,Nginx正在被越来越多的项目采用作为网关来使用,配合 Lua 做限流.熔断等控制 --源自 nginx Lua 脚本语言,用标准C语言编写并以源代码形式开放, 其设计 ...

  9. docker(mysql-redmine)

    一.安装docker 首先查看自己的版本,我的是centos 版本为 [root@localhost redmine]# uname -r 3.10.0-862.el7.x86_64 移除旧版本 yu ...

  10. Linux常用命令:性能命令

    本文介绍Linux常用性能统计分析命令,监控进程或者系统性能.主要包括CPU(top.mpstat).内存(vmstat.free).I/O(iostat).网络性能(sar).系统日志信息(dems ...