About MyBatis——有关Mybatis,自问自答系列
目录
- 1. Mybatis为什么只调用接口就可以运行SQL?
- 2. Mybatis中的批处理
- 3. Mybatis中的二级缓存
- 4. Spring + Mybatis
1. Mybatis为什么只调用接口就可以运行SQL?
- 存储
首先是xml配置文件的解析,一开始mybatis将每一个CRUD的节点,解析为一个MappedStatement存储在Configuration中,其唯一标志statemenId:namespace+methodName; - 创建代理
客户端首先需要调用SqlSession.getMapper获取Mapper对象,这个过程将会返回一个MapperProxy的代理对象;
(每个会话对应一个SqlSession,每个SqlSession创建一个MapperProxy,但Connect可以用连接池复用,不用每次都创建) - 代理对象找MappedStatement
(通过statemenId作为key去找,所以xml中的namespace要和Mapper接口的interfaceName一样,methodName也要一样)
客户端调用CRUD方法,实际上进入了MapperProxy的invoke方法。我们将通过interfaceName+methodName作为key,去找到对应的MappedStatement,然后实际上是通过SqlSession去执行目标sql。
2. Mybatis中的批处理
- 方式包括:
- 使用foreach标签
- 创建BatchExecutor(查询是没有批处理操作的)
BatchExecutor维护了多个statement,每个statement都可能是一批sql;所有的sql都会调用StatementHandler.addBatch(),等待统一executeBatch().
3. Mybatis中的二级缓存
一级缓存:SqlSession中的本地缓存;
是Executor内部的local cache,实现:Map存储,key包括:- 传入的 statementId
- 查询时要求的结果集中的结果范围 (结果的范围通过rowBounds.offset和rowBounds.limit表示)
- 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )
- 传递给java.sql.Statement要设置的参数值
综上所述,CacheKey由以下条件决定:statementId + rowBounds + 传递给JDBC的SQL + 传递给JDBC的参数值;
二级缓存:Application级别的缓,是按Mapper划分的;也就是一个namespace对应一个缓存。
配置:cacheEnabled=true,则使用CachingExecutor先查询缓存,如果没有,在调用其封装的Executor进行查询
MyBatis查询数据的顺序是:二级缓存 ———> 一级缓存 ——> 数据库。
4. Spring + Mybatis
Spring-Mybatis组件为我们实现了,将SqlSessionFactory和Mapper这两类Bean的创建获取,交给Spring IOC处理
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:mybatis-config.xml"></property><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
就对应着SqlSessionFactory的生成,类似于原生Mybatis使用时的以下代码
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
而UserMapper代理对象的获取,是通过扫描的形式获取,也就是MapperScannerConfigurer这个类
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.chenhao.mapper" />
</bean>
对应着Mapper接口的获取,类似于原生Mybatis使用时的以下代码:
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
在Spring启动时,加载并创建SqlSessionFactory,然后注册到Spring IOC容器;
由于org.mybatis.spring.SqlSessionFactoryBean是FactoryBean类型,所以需要关注其getObject方法
public SqlSessionFactory getObject() throws Exception {if (this.sqlSessionFactory == null) {afterPropertiesSet();}// 直接返回sqlSessionFactory对象// 单例对象,由所有mapper共享return this.sqlSessionFactory;
}
About MyBatis——有关Mybatis,自问自答系列相关推荐
- 自问自答系列——商城相关
前情提要:最近想做个卖个人想法的网站,姑且可以称为头脑风暴聚集地.每个人都有一些新奇的想法,过一段时间就忘了,为什么不出售他们呢?OK,有点脱离主题了,因为想自己做一个简单的商城玩玩,顺便用下Lara ...
- Android自问自答系列——持续更新ING
Hello,All,我是来自58同城的一名Android开发工程师,在58集团从事APP的开发工作.在日常的工作和学习过程中我经常会碰到一些好玩的和有意思的Android小知识点,有些知识可能都从未注 ...
- 干货!JAVA容器-自问自答学HashMap
前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...
- mybatis实体类注解_SpringBoot2.x系列教程43--整合使用Mybatis
SpringBoot2.x系列教程43--整合使用Mybatis 作者:一一哥 在上一节中,我带大家学习了Spring Boot中整合JPA,那接下来这一章节中,我继续带领大家学习如何在Spring ...
- JAVA容器-自问自答学HashMap
前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...
- [python]自问自答:python -m参数? (转)
python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- (Mybatis)Mybatis简介和初步使用
1. Mybatis简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参 ...
- MyBatis(三)MyBatis缓存和工作原理
MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...
- MyBatis(一)MyBatis介绍和配置详解
在Java程序里面去操作数据库,最原始的办法是使用JDBC的API.需要分为六步: 注册驱动 通过DriverManager获取一个Connection 通过Connection创建一个Stateme ...
最新文章
- 如何理解PacBio的准确度?
- git查看 对比未提交_30分钟让你掌握Git的黑魔法
- mysql 取消主从复制_MySQL:第一次看到有人把MySQL主从复制讲解的这么清楚
- java调度:(二)在项目中调度策略的选择
- 使用卷积神经网络识别交通标志
- sqoop 1.4.4-cdh5.1.2快速入门
- 黑马ee在职进阶视频_进阶– Java EE 7前端5强
- python自动化框架测试实操_自动化框架之 python+selenium+pytest
- mysql sql_log_bin怎么看_MySQL数据库之开启和查看mysql的bin-log日志
- java虚拟机安装_java虚拟机官方下载|Java Virtual Machine(java虚拟机)下载v5.0官方版 附安装教程 - 欧普软件下载...
- 华为android强刷系统下载地址,华为强刷救砖卡刷包合集下载(一)共707GB
- Windows 下 cmd 窗口使用 ssh 命令
- Trajan算法(强连通+缩点)
- 超媒体是什么?Hypermedia(一种采用非线性网状结构对块状多媒体信息(包括文本、图像、视频等)进行组织和管理的技术)
- 1991年首批全国500位名老中医
- python 读取pdf cid_python使用pdfminer解析pdf文件的方法示例
- 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
- Zend Studio 9.0.3正式版注册破解
- 贵州大学2021计算机分数线,贵州大学录取分数线2021是多少分(附历年录取分数线)...
- 程序员如何正确饲养乌龟?