mybatis执行过程及经典面试题
Mybatis执行流程
mybatis中xml解析是通过SqlSessionFactoryBuilder.build()方法。
初始化mybatis(解析xml文件构建成Configuration对象)并初始化SqlSessionFactory对象
- 在解析xml时会同时根据其中节点做相应的初始化操作
- 关键节点: settings、typeAliases、mappers
通过SqlSesssionFactory.openSession()方法打开一个SqlSession对象
- SqlSessionFactory对象的作用是里面存了全局的配置信息以及初始化环境和DataSource,DataSource对象可以用来开辟连接,SqlSessionFactory对象是用来保存全局信息并且打开数据库连接
- 在打开SqlSession对象的时候就会开辟一个连接对象并传给SqlSession对象,和数据库打交道的操作入口在于SqlSession对象
通过SqlSession.getMapper()根据传入的Mapper对象类型动态代理并返回一个动态代理后的Mapper对象
由SqlSession.select()/update(),MapperProxy对象的invoke()方法执行后再执行execure方法,再根据情况选择执行select/update
Executor执行Query/queryFromDatabase,在前面经过参数名封装和缓存查询之后(缓存为空),会调用queryFromDatabase方法去数据库当中查
SimpleExecurot执行doQuery()方法,初始化prepareStatement并且给#{}参数赋值
StatementHandler执行query()方法,执行sql语句
ResuletHandler.handleResultSets()方法封装结果集
具体执行流程如下图:
mybatis面试题
1. spring和mybatis整合之后为什么一级缓存会失效?
一级缓存使用者可以随时使用或者销毁缓存,从SqlSession对象打开时缓存就已经存在。当关闭SqlSession对象缓存就失效。
当与spring整合的时候,直接跳过SqlSession对象,无法直接操作到SqlSession对象,spring在操作SqlSession的时候,不知道用户什么时候关闭,所以每调用完一个dao方法就关闭了,所以导致一级缓存失效。
如果开启了事务,一级缓存就会生效,因为开启了事务,执行完dao就不会销毁,因为一旦销毁,事务就没有了,你开启了事务,spring就知道你什么时候需要结束
2. 二级缓存中要注意的事情?
二级缓存里面的数据不能存放那种一直累加到很大的数据
二级缓存是基于命名空间的,当多个命名空间操作同一张表的时候,最好不要用二级缓存,当一个命名空间insert之的一,不会刷新缓存,用另一个命名空间select的时候还是会查询缓存
3. ResultMap和ResultType的区别?
ResultMap是自己指定返回值与对象及与对象内部属性名和数据库列名的绑定
ResultType是直接返回值与别名库当中的java对象的映射
4. #{}和${}的区别?
#{}将传入的数据都当成一个字符串,会对自动传的数据加一个双引号,#{}方式能够很大程度防止sql注入
${}将传入的数据是直接显示生成在sql中,${}无法防止sql注入
${}方式一般用于传入数据库对象,例如传入表名
一般能用#{}的就别用${},Mybaits排序时使用order by动态参数时需要注意,用${}而不能用#{}
5. MyBatis与Hibernate有哪些不同?
MyBatis是一个半自动ORM而Hibernate是一个完全的ORM框架
因为MyBatis需要自己编写sql语句,不过MyBatis可以通过xml或注解方式配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。可严格控制sql执行性能,灵活度高。但是灵活的前提是 Mybatis无法做到数据库无关性,如果需要实现支持多种数据库的则需要自定义多套sql映射文件。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高,如果用Hibernate开发可以节省很多代码,提高效率。但是hibernate学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力。
6. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
Mybatis在查询关系或关联集合对象时需要手动编写sql来完成,所以称之为半自动ORM映射工具。
7. Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是钊对Resultset结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
8. Mybatis映射文件中,如果A标签通过include引用B标签的内容,请问B标签能否定询问在A标签的后面,还是说必须定义在A标签的前面?
虽然Mybatis解析xml映射文件是按照顺序解析的,但是被引用的B标签依然可以定义在任何地方,Mybatis都可以正常识别。原理是Mybatis解析A标签时发现A标签引用了B标签,但是B标签尚未解析到,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B 标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签就可以正常解析完成了。
9. Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?
Mybatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind
执行原理:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql功能。
mybatis执行过程及经典面试题的更多相关文章
- 一图看懂mybatis执行过程
一图看懂mybatis执行过程,不再懵B了
- MyBatis执行过程显示SQL语句的log4j配置
log4j.properties文件 log4j.rootLogger=debug,stdout,logfile log4j.appender.stdout=org.apache.log4j.Co ...
- MyBatis执行流程的各阶段介绍
目录 一.mybatis极简示例 1.1 创建mybatis配置文件 1.2 创建数据库表 1.3 创建javabean 1.4 创建mapper映射文件 1.5 运行测试 二.mybatis的几大“ ...
- Mybatis执行流程浅析(附深度文章推荐&面试题集锦)
首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...
- mybatis源码分析(五)------------SQL的执行过程
在对SQL的执行过程进行分析前,先看下测试demo: /** * @author chenyk * @date 2018年8月20日 */ public class GoodsDaoTest { pr ...
- MyBatis 源码分析 - SQL 的执行过程
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...
- Mybatis的执行过程
1.Mybatis的作用 Mybatis的主要作用可以用下面的一段代码解释 Class.forName("com.mysql.jdbc.Driver"); Connection c ...
- Mybatis拦截器执行过程解析
上一篇文章 Mybatis拦截器之数据加密解密 介绍了 Mybatis 拦截器的简单使用,这篇文章将透彻的分析 Mybatis 是怎样发现拦截器以及调用拦截器的 intercept 方法的 小伙伴先按 ...
- mybatis源码学习(二):SQL的执行过程
从上一篇文章中,我们了解到MapperMethod将SQL的执行交给了sqlsession处理.今天我们继续往下看处理的过程. SqlSession接口除了提供获取Configuration,Mapp ...
随机推荐
- Redis高可用架构
前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Linux服务器上搭建Redis,怎 ...
- Navicat for mysql建立连接
1. 安装Navicat for MySQL. 2. 点击连接->MySQL,打开SSH,填写主机名.端口.用户名.密码. 3. 连接->打开常规,设置连接名(可以自由指定).主机名.端口 ...
- [python]python列表、元组
1. 列表和元组简介 列表:用中括号[]包裹,元素的个数及元素的值可以改变. 元组:用小括号()包裹,不可用更改. 通过切片运算[]和[:]可以得到子集. 2.列表 示例: List = [1, 2, ...
- 洛谷 P1070 道路游戏 DP
P1070 道路游戏 题意: 有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购 ...
- SPOJ - GSS1-Can you answer these queries I 线段树维护区间连续和最大值
SPOJ - GSS1:https://vjudge.net/problem/SPOJ-GSS1 参考:http://www.cnblogs.com/shanyr/p/5710152.html?utm ...
- bzoj 1146 网络管理Network (CDQ 整体二分 + 树刨)
题目传送门 题意:求树上路径可修改的第k大值是多少. 题解:CDQ整体二分+树刨. 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点. 然后通过整体二 ...
- codeforces 822 D. My pretty girl Noora(dp+素数筛)
题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...
- poj2528 Mayor's posters(线段树区间修改+特殊离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- zabbix监控PHP脚本
scripts]# cat php_fpm_status.sh #!/bin/bash ############################################ #$name: ngi ...
- LeetCode go
用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就没有了尊严. 1. 两数之和 题目 ...