具体分析mybatis是如何操作数据库的!
1、定义我们的核心配置文件的路径,这个路径是从target/class下开始找的!
string config = "mybatis-config.xml" ;
2、读取这个config表示的文件
inputstream inputstream= resources.getresourceasstream(config);
3、创建sqlssionfactorybuilder对象
sqlssionfactorybuilder builder = new sq天使在身边读后感lssionfactorybuilder();
4、创建sqlssionfactory对象
sqlssionfactory ssionfactory = builder.build(inputstream);
5、获取sqlssion对象,从sqlssionfactory中获取
sqlssion sqlssion = ssionfactory.openssion();
6、【重点】执行我们的执行的的sql语句标识。sql文件中的namespace + sql标签的id值
string sqlid = "com.sqx.dao.urmapper.geturbyid";
7、执行sql语句,通过sqlid找到语句,并执行!
list<object> objects = sqlssion.lectlist(sqlid);
8、关闭sqlssion
sqlssion.clo();
总结
myabtis启动的时候会加载mybatis-config.xml这个核心配置文件,得到要操作的数据库以及我们mapper文件的的信息,然后将其以数据流的形式保存起来传给sqlssionfactorybuilder,创造出对应该设计学类数据库的sqlssionfactory工厂,工厂生产sqlssion,这个sqlssion中包含了对该库的增删改查方法,我们需要通过namespace + sqlid
来确定我们执行的是哪个sql,这一步操作可以通过sqlesion.getmapper()拿到接口,通过调用接口的方法(方法绑定了我们的sql,包含namespace + sqlid
),执行对应的sql语句!
mybatis缓存无论是一级缓存还是二级缓存都是本地缓存,都会占用jvm的内存,一旦java停止缓存失效!
概述
一级缓存保存在我们的sqlssion当中只要是同一个sqlsisson(与数据库建立的会话)就会使用同一个缓存一级缓存是我们mybatis默认开启的!如下是对一级缓存进行测试:
查看我们的测试结果
采用不同的sqlssion测试数据,进行如下修改!
我们再次查看测试结果
得出结论我们的一级缓存只是在同一个sqlssion当中有效!
概述
二级缓存又称”全局缓存”,是基于namespace级别的缓存,一个namespace对应一个二级缓存!
工作机制:
一个会话查询一条数据,这个数据会被放在一级缓存当中当我们会话关闭的时候,会把这个数据从1级缓存迁入二级缓存当中,新的会话就可以在二级缓存当中找到这个数据!不同的会话查询不同的namespace的时候,会将不同namespace中的数据缓存到自己对应的缓存(map)中!使用步骤 :
只需在需要使用缓存的namespace 中加入< cache/>
即可
<!--在当前mapper.xml中使用二级缓存,并配置相关参数--><cache eviction="fifo" flushinterval="60000" size="512" readonly="true"/>eviction :缓存的回收策略lru(最长时间未使用)、lfu(访问次数最少)、fifo(默认)、soft(软引用)、weak(弱引用)flushinterval : 缓存刷新间隔缓存多久清空一次,默认是不会清空的,设置一个毫秒值readonly :是否只读size :缓存存放多少元素
我们还可以通过配置实现自定义缓存
<!-- 开启mybatis的二级缓存,其本质还是我们mybatis帮我们实现了自身提供的缓存接口cache,也就是cache标签的type属性默认指定了缓存策略--> <cache type=""/> <!--本质上就是这种写法,我们可通该修改type来选择自定缓存策略--> <cache type="rg.apache.ibatis.cache.impl.perpetualcache"/>
如图所示
缓存执行流程
当我们的sql执行的时候,先去二级缓存namespace中查看是否存在缓存,然后如果二级缓存不存在,查看当前sqlssion中一级缓存中是否存在,最后一、二级缓存中都不存在的话那么就去数据库查询,接着会将查询出来的结果保存在我们的一级缓存当中,当前会话(sqlssion)结束,就会将一级缓存中的数据,同步到我们的二级缓存什么是orm
orm(object relational mapping),对象关系映射,是一种为了解决关系型数据库数据与简单 java 对象(pojo)建里映射关系的技术。
为什么说 mybatis 是半自动orm映射工具?它与全自动的区别在哪里?
首先,像 hibernate、jpa 这种属于全自动 orm 映射工具,使用 hibernate 查询关联对象或者生活随想关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 orm 映射工具。换句话来解释就是说 mybatis 是 半自动 orm 最主要的一个原因是,它需要在 xml 或者注解里通过手动或插件生成 sql,才能完成 sql 执行结果与对象映射绑定。优点
基于sql语句编写、相当灵活,sql写在xml文件当中,解除了sql与程序代码的耦合,便于统一管理消除了jdbc的冗余代码、能够与spring很好的集成缺点
sql语句的编写工作量大,尤其是字段多,关联表多的情况下,对开发人员的sql语句功底有一定的要求sql语句依赖数据库,导致数据库移植性差,不能随意更换数据库到此这篇关于mybatis执行流程、缓存原理及相关面试题的文章就介绍到这了,更多相关mybatis执行流程、缓存及面试题内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 01:11:56,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/c1adb1f3e22b1b7533f10c234eb8ea72.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Mybatis执行流程、缓存原理及相关面试题汇总.doc
本文 PDF 下载地址:Mybatis执行流程、缓存原理及相关面试题汇总.pdf
留言与评论(共有 0 条评论) |