目录

  • 1. Mybatis为什么只调用接口就可以运行SQL?
  • 2. Mybatis中的批处理
  • 3. Mybatis中的二级缓存
  • 4. Spring + Mybatis

1. Mybatis为什么只调用接口就可以运行SQL?

  1. 存储
    首先是xml配置文件的解析,一开始mybatis将每一个CRUD的节点,解析为一个MappedStatement存储在Configuration中,其唯一标志statemenId:namespace+methodName;
  2. 创建代理
    客户端首先需要调用SqlSession.getMapper获取Mapper对象,这个过程将会返回一个MapperProxy的代理对象;
    (每个会话对应一个SqlSession,每个SqlSession创建一个MapperProxy,但Connect可以用连接池复用,不用每次都创建)
  3. 代理对象找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中的二级缓存

  1. 一级缓存: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的参数值;

  2. 二级缓存: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,自问自答系列相关推荐

  1. 自问自答系列——商城相关

    前情提要:最近想做个卖个人想法的网站,姑且可以称为头脑风暴聚集地.每个人都有一些新奇的想法,过一段时间就忘了,为什么不出售他们呢?OK,有点脱离主题了,因为想自己做一个简单的商城玩玩,顺便用下Lara ...

  2. Android自问自答系列——持续更新ING

    Hello,All,我是来自58同城的一名Android开发工程师,在58集团从事APP的开发工作.在日常的工作和学习过程中我经常会碰到一些好玩的和有意思的Android小知识点,有些知识可能都从未注 ...

  3. 干货!JAVA容器-自问自答学HashMap

    前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...

  4. mybatis实体类注解_SpringBoot2.x系列教程43--整合使用Mybatis

    SpringBoot2.x系列教程43--整合使用Mybatis 作者:一一哥 在上一节中,我带大家学习了Spring Boot中整合JPA,那接下来这一章节中,我继续带领大家学习如何在Spring ...

  5. JAVA容器-自问自答学HashMap

    前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...

  6. [python]自问自答:python -m参数? (转)

    python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  7. (Mybatis)Mybatis简介和初步使用

    1. Mybatis简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参 ...

  8. MyBatis(三)MyBatis缓存和工作原理

    MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...

  9. MyBatis(一)MyBatis介绍和配置详解

    在Java程序里面去操作数据库,最原始的办法是使用JDBC的API.需要分为六步: 注册驱动 通过DriverManager获取一个Connection 通过Connection创建一个Stateme ...

最新文章

  1. 如何理解PacBio的准确度?
  2. git查看 对比未提交_30分钟让你掌握Git的黑魔法
  3. mysql 取消主从复制_MySQL:第一次看到有人把MySQL主从复制讲解的这么清楚
  4. java调度:(二)在项目中调度策略的选择
  5. 使用卷积神经网络识别交通标志
  6. sqoop 1.4.4-cdh5.1.2快速入门
  7. 黑马ee在职进阶视频_进阶– Java EE 7前端5强
  8. python自动化框架测试实操_自动化框架之 python+selenium+pytest
  9. mysql sql_log_bin怎么看_MySQL数据库之开启和查看mysql的bin-log日志
  10. java虚拟机安装_java虚拟机官方下载|Java Virtual Machine(java虚拟机)下载v5.0官方版 附安装教程 - 欧普软件下载...
  11. 华为android强刷系统下载地址,华为强刷救砖卡刷包合集下载(一)共707GB
  12. Windows 下 cmd 窗口使用 ssh 命令
  13. Trajan算法(强连通+缩点)
  14. 超媒体是什么?Hypermedia(一种采用非线性网状结构对块状多媒体信息(包括文本、图像、视频等)进行组织和管理的技术)
  15. 1991年首批全国500位名老中医
  16. python 读取pdf cid_python使用pdfminer解析pdf文件的方法示例
  17. 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
  18. Zend Studio 9.0.3正式版注册破解
  19. 贵州大学2021计算机分数线,贵州大学录取分数线2021是多少分(附历年录取分数线)...
  20. 程序员如何正确饲养乌龟?

热门文章

  1. MySQL数据库高级面试题(2)
  2. 手机里的照片删了怎么恢复
  3. 通过BOMC制作微码更新介质方法
  4. 怎么申请企业邮箱账号?企业邮箱怎么注册申请?
  5. 普通人有没有必要学python,什么样的人适合学python
  6. 关于网络游戏的影响(腾讯游戏)
  7. android重力传感器横竖反,Android手机在哪里设置重力传感器(转向屏幕)?
  8. 第三方软件测试z5x电池,vivo Z5x第三方续航测试结果公布,刷新手机业续航排行榜...
  9. 看到校友录一位同学的留言,想起来一首诗
  10. linux下ssh、scp无密钥登陆方法