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功能。

原文地址:https://www.cnblogs.com/zouhg/p/11634171.html

时间: 2024-11-08 16:46:39

mybatis执行过程及经典面试题的相关文章

一图看懂mybatis执行过程

一图看懂mybatis执行过程,不再懵B了 原文地址:https://www.cnblogs.com/AlexQY/p/9447953.html

MyBatis执行过程显示SQL语句的log4j配置

log4j.properties文件 log4j.rootLogger=debug,stdout,logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout log4j.appender.logfile=org.apache.log4

MyBatis的执行过程

MyBatis的执行过程: (1)读取MyBatis配置文件mybatis-config.xml (2)加载映射文件 (3)构建会话工厂SqlSessionFactory (4)创建SqlSession对象 (5)创建Executor接口的实例. MyBatis底层定义了一个Executor接口来操作数据库,可以根据SqlSession传递的参数动态生成需要执行的SQL语句,同时负责查询缓存的维护. MyBatis给Executor接口提供了多个实现类. (6)创建MappedStatement

Linux 经典面试题

[Linux  经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标识. 4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块. 5. 链接分为: 硬链接 和 符号链接 . 6. 超级块包含了i节点表 和 空闲块表 等重要的文件系统信息. 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八

【转】.net 经典面试题

[转].net 经典面试题 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一命名空间内可以访问. 2 .列举ASP.NET 页面之间传递值的几种方式. 答. 1.使用QueryString, 如....?id=1; response.

50个C/C++经典面试题

C/C++经典面试题  面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明.一个变量可以在多个地方声明, 但是只在一个地方定义.加入extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分 定义. 说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量. 面试题2 :写出bool .int. float .指针变量与 “零值”比较的if 语句 bool 型数据: if( flag ) { A;

李洪强IOS开发之-iOS经典面试题

李洪强IOS开发之-iOS经典面试题 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这

mysql经典面试题

mysql 经典面试题 (2011-10-26 17:13:38) 转载▼ 标签: 杂谈 分类: 日志 1.用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息. employee: eid,ename,salary,deptid; select * from employee order by deptid desc,salary 2.列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序 创建表: mysql> create table employee921(id

MySQL20个经典面试题

MySQL20个经典面试题 Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.MySQL中myisam与innodb的区别,至少5点 (1).问5点不同: (2).innodb引擎的4大特性 (3).2者selectcount(*)哪个更快,为什么 3.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1).varchar与char的区别 (2).varchar(50)中50的涵义 (3).int(20)中