今天将Mybatis的执行器部分做一下简单手记。

一、java原生JDBC

众所周知,Mybatis是一个半自动化ORM框架。其实说白了,就是将java的rt.jar的JDBC操作进行了适度的封装。所以落到根本,肯定离不开JDBC的基本操作。我们来一起复习一下JDBC的基本操作。这里以java.sql.PreparedStatement为例。

 public void jdbcTest() throws SQLException {
// 1、获取连接
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 2、预编译
String sql = "SELECT * FROM users WHERE `name`=?";
PreparedStatement sql1 = connection.prepareStatement(sql);
sql1.setString(1, "了了在小");
// 3、执行SQL
sql1.execute();
// 4、获取结果集
ResultSet resultSet = sql1.getResultSet();
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
resultSet.close();
sql1.close();;
}

其实、总结一下,原生JDBC操作流程如图:

其中,这里边的Connection、PreparedStatement、ResultSet这些API都是Java.sql包下约定的API。其中还有Statement、CallableStatement等API。不同的数据库驱动分别对其进行实现即可。本节既然讲执行器,这里简单罗列一下Java.sql包下所有的执行器接口定义:

如图,在java.sql给出的 JDBC执行器规范接口中,Statement作为顶级接口,PreparedStatement、CallableStatement分别是基于Statemtment的增强和扩展。这三个API各有侧重点。如图标识。

在使用层面:

  Statement可以支持重用执行多个静态SQL,并可以设置addBatch、setFetchSize等操作。Statement的每次执行都是给数据库发送一个静态SQL。多次执行,即发送多个静态SQL。

  PreparedStatement可以对SQL进行预编译,可以有效防止SQL注入(参数转义话在数据端执行,并非在Applicattion)。并且,每次执行都是给数据库发送一个SQL,加上若干组参数。

  CallableStatement集成以上两个接口的基础上,扩展了返回结果的读写。

二、Mybatis执行体系

Mybatis作为封装JDBC操作的半自动框架,肯定也离不开JDBC的基本流程,以及java.sql给出的规范。如下以Mysql为例。列举一下Mybatis的简明流程。

对照JDBC的标准流程,Mybatis将Connection对象维护交由SqlSession这个环节来处理,将SQL预编译与执行交给Executor这个环节来处理,将结果集提取交给StatemntHandler来处理。今天我们重点来看下Executor这个环节。

三、Mybatis执行器Executor

Executor接口作为Mybatis执行器的顶级接口,约定了修改(增删改)、查询、提交、回滚、缓存的基本规范。其实现的子类根据分工对其做个差异实现。类图如图:

BaseExecutor:作为Executor的基本抽象实现,里边提取了连接维护、一级缓存的公有功能,供子类复用。并放出了doQuery、doUpdate的抽象方法下放到子类做差异实现。

CachingExecutor:作为BaseExecutor的一个装饰器,用来负责二级缓存功能。而JDBC相关操作都是丢给BaseExecutor来操作。

SimpleExecutor、ReuseExecutor、BatchExecutor:三个具体的实现均是实际操作JDBC的对象,可以通过Mapper接口注解(@Options(statementType=StatementType.STATEMENT))来指定Statement。里边默认使用PreparedStatement来处理JDBC操作,如图:

  

以上、感谢源码阅读网-鲁班大叔,以及Mybatis源码J10集团军所有道友。

源码地址:https://gitee.com/llzx/coderead_mybatis_executor.git

最新文章

  1. 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)
  2. 新闻类网站rss接口的编写心得
  3. kNN算法python实现和简单数字识别
  4. c# winform编程之多线程ui界面资源修改总结篇
  5. springmvc下实现登录验证码功能
  6. dockerfile学习与详解
  7. java GUI之事件处理
  8. 再看JavaScript线程
  9. bootstrap+jQuery.validate
  10. 最短路径算法——Dijkstra算法
  11. c#代码启动任务管理器的几种方法
  12. 如何让你的传输更安全--基于SSL协议的通信模式
  13. docker info 警告"WARNING: No swap limit support"
  14. SpringBoot+Shiro+Redis共享Session入门小栗子
  15. Ubuntu解压缩zip,tar,tar.gz,tar.bz2文件命令
  16. 深入理解 Session 与 Cookie
  17. UVa 1614 Hell on the Markets (贪心+推理)
  18. 【SDOI2017】树点染色【线段树+LCT】
  19. 什么是spark(五)Spark SQL
  20. 聊聊Python ctypes 模块(转载)

热门文章

  1. 简单搜索 kuangbin C D
  2. 《C程序设计语言》 练习2-4
  3. 【Hadoop离线基础总结】Hive级联求和
  4. Day_09【常用API】扩展案例7_验证QQ号是否正确
  5. u-boot: Not enough room for program headers, try linking with -N
  6. HMM-前向后向算法理解与实现(python)
  7. 如何将Altera官方提供的CADENCE.OLB应用于altium Designer中
  8. [hdu4495]二分,字符串hash,DP
  9. [csu/coj 1080]划分树求区间前k大数和
  10. Python Web自动化测试入门与实战,从入门到入行