java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_5_mybatis

Posted 平凡加班狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_5_mybatis相关的知识,希望对你有一定的参考价值。

系列文章目录

一、MyBatis简介

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和JavaPOJO(PlainOldJavaObjects,普通老式Java对象)为数据库中的记录

工作流程

首先解释下两个文件

mybatis-config.xml:全局配置文件,引入了数据源、事务等mybatis运行环境;

Mapper.xml:配置映射文件,配置sql结果集封装类型、传参类型;

解析配置文件(MyBatis-config.xml、Mapper.xml),MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。;
SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。
SqlSessionFactory创建会话SqlSession;
执行器将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象,使用Paramterhandler填充参数,使用statementHandler绑定参数。
JDBC执行sql,借助MappedStatement中的结果映射关系,使用ResultSetHandler将返回结果转化成HashMap、JavaBean等存储结构并返回。
关闭sqlsession会话。

面试题

mybatis的基本工作流程

1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。

2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡

3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭

4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。

5.将返回的结果通过映射,包装成java对象

讲下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存,
一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,
使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

1. spring和mybatis整合之后为什么一级缓存会失效?

一级缓存使用者可以随时使用或者销毁缓存,从SqlSession对象打开时缓存就已经存在。当关闭SqlSession对象缓存就失效
当与spring整合的时候,直接跳过SqlSession对象,无法直接操作到SqlSession对象,spring在操作SqlSession的时候,不知道用户什么时候关闭,所以每调用完一个dao方法就关闭了,所以导致一级缓存失效
一级缓存的作用域比较小
如果开启了事务,一级缓存就会生效,因为开启了事务,执行完dao就不会销毁,因为一旦销毁,事务就没有了,你开启了事务,spring就知道你什么时候需要结束

2. 二级缓存中要注意的事情?

二级缓存里面的数据不能存放那种一直累加到很大的数据

二级缓存是基于命名空间的,当多个命名空间操作同一张表的时候,最好不要用二级缓存,当一个命名空间insert之的一,不会刷新缓存,用另一个命名空间select的时候还是会查询缓存
    二级缓存的作用域比一级缓存大

4. #{}和${}的区别

#{}将传入的数据都当成一个字符串,会对自动传的数据加一个双引号,
#{}方式能够很大程度防止sql注入

将 传 入 的 数 据 是 直 接 显 示 生 成 在 s q l 中 , {}将传入的数据是直接显示生成在sql中, sql{}无法防止sql注入
KaTeX parse error: Expected 'EOF', got '#' at position 29: …对象,例如传入表名 一般能用#̲{}的就别用{},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功能。

10、二级缓存什么情况下会失效

看图
在这里插入图片描述

总结

以上是关于java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_5_mybatis的主要内容,如果未能解决你的问题,请参考以下文章

java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_5_mybatis

java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_1_hibernate

java面试题_简单说明hibernateStruts2SpringspringMVCmybatis的执行流程或者原理_2_Struts2

javaSSM框架001_面试题_简单说明springMVC的执行流程

Java后端真实面试题大全(有详细答案)--高频/真题

Java基础——HashMap源码分析及面试题解答