(一) mybatis 源码系列之 mybatis 架构

什么是 mybatis 就不必介绍了, 开始看源码, 再看源码之前,先来了解一下 mybatis 的整体架构

mybatis 大概是源码之中最为简单的了 (代码量最小, 逻辑不复杂), 相对于 spring, tomcat 而言
有点蛋疼的就是没有注释, 代码干净的一批, 接口中没有一丁点 javadoc 文档

整体架构

在这里插入图片描述

接口层

接口层主要定义的是与数据库进行交互的方式。在 Mybatis中,交互分为两种方式

Mybatis提供的API

使用 Mybatis 提供的API进行操作,通过获取 SqlSession 对象,然后根据 Statement Id 和参数来操作数据库。

String statement = "com.gp.ibatis.test.Student";
List<Student> result = sqlsession.selectList(statement);

使用 Mapper 接口

事实上这个才是经常使用的方式,面向接口编程嘛。每一个 Mappe r接口中的方法对应着 mapper.xml 文件中的一个 select/insert/update/delete 节点。节点中的 ID 就是接口中的方法名,在使用的时候直接调用接口方法即可。不过,值得注意的是,它最终执行的还是 sqlSession.select()、sqlSession.delete()。

数据处理层

这是 Mybatis 的核心。它负责参数映射和动态 SQL 生成,生成之后 Mybatis 执行 SQL 语句,并将返回的结果映射成自定义的类型。关于参数映射和结果集转换,主要是靠 typeHandlers

框架支撑层

事务管理

对于ORM框架而言,事务管理是必不可少的一部分。不过,一般情况下,Mybatis都是和Spring搭配使用的,更多的是用Spring来接管事务管理。

连接池

我们不能每次在执行 SQL 的时候才去创建数据库的连接。因为创建连接是一个相对比较耗时的操作,通常做法是用一个列表保存提前创建好的 N个连接,用到的时候去拿,用完再还回去。关于数据库连接池,业界有很多开源实现。比如 C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等。

缓存

为了提高数据利用率和减小服务器和数据库的压力,Mybatis 会对于一些查询提供会话级别的数据缓存,会将对某一次查询,放置到SqlSession 中,在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找。

一级缓存是SqlSession级别的缓存,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率,Mybtais默认开启一级缓存。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。要开启二级缓存,需要在你的 SQL 映射文件中添加一行:。它会将所有的select语句缓存,在执行insert,update 和 delete 语句时会刷新缓存,缓存根据LRU算法来回收

猜你喜欢

转载自blog.csdn.net/Gp_2512212842/article/details/107644144