CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程. 源码如下: /** * @author Clinton Begin */ /***/ public class CallableStatementHandler extends BaseStatementHandler { public CallableStatementHandler(Executor executor, MappedStatement ma…
StatementHandler通过类名我们可以了解到它可能是Statement的处理器,它是一个接口,其实现类如下: BaseStatementHandler:一个抽象类,只是实现了一些不涉及具体操作的方法 RoutingStatementHandler:类似路由器,根据配置文件来路由选择具体实现类SimpleStatementHandler.CallableStatementHandler和PreparedStatementHandler SimpleStatementHandler:就是直…
RoutingStatementHandler类似路由器,在其构造函数中会根据Mapper文件中设置的StatementType来选择使用SimpleStatementHandler.PreparedStatementHandler和CallableStatementHandler,其实现的接口StatementHandler的方法也是由这三个具体实现类来实现. 源码如下: /** * @author Clinton Begin */ //类似于路由器 public class RoutingS…
PreparedStatementHandler就是调用PreparedStatement来执行SQL语句,这样在第一次执行sql语句时会进行预编译,在接下来执行相同的SQL语句时会提高数据库性能 源码如下: /** * @author Clinton Begin */ /* 使用PrepareStatement**/ public class PreparedStatementHandler extends BaseStatementHandler { public PreparedState…
SimpleStatementHandler就是使用基本的Statement来执行query.batch.update等操作,其实现还是比较简单的,当然在执行过程中会涉及keyGenerator和ResultHandler操作,这些我们会在接下来的博客中进行详解.SimpleStatementHandler用于执行简单的sql语句,这里简单的sql语句是指sql语句中没有变量,不会通过外部进行参数传入的sql语句. 源码如下: /** * @author Clinton Begin */ pub…
BaseStatementHandler是一个抽象类,并没有实现和CURD相关的类,只是更多的设置了一些参数相关. 源码如下: /** * @author Clinton Begin */ public abstract class BaseStatementHandler implements StatementHandler { protected final Configuration configuration; protected final ObjectFactory objectF…
官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那么为什么会有类型处理器呢?这一点并不难理解,SQL语句事实上可以理解为一门面向数据库的编程语言.所以相对而言都有自己的数据类型.这也就意味着存在数据类型不一至的问题.同时不同的数据库之间数据类型还有一定的差义.类型处理器则就是用于处理数据类型不一至的问题. 笔者看过几个不同的ORM框架都存在着类型处…
这一篇博客我们学习一下Mybatis调用存储过程的使用和运行流程.首先我们先创建一个简单的存储过程 DELIMITER $ CREATE PROCEDURE mybatis.ges_user_count(IN age INT, OUT user_count INT) BEGIN SELECT COUNT(*) FROM users WHERE users.age=age INTO user_count; END $ 这个存储过程的含义其实比较简单的,就是输入age,然后执行select coun…
在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao明明是我们定义的一个接口类,根本没有定义实现类,那这个userMapper是什么?是mybatis自动为我们生成的实现类吗? 为了更好的解释着两个问题,我们需要重新认识Configuration这个类. 但是在这之前,你需要了解一个概念(设计模式):JAVA设计模式-动态代理(Proxy)示例及说明…
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运行时参数的绑定.查询结果自动映射.延迟加载等.本文对所列举的技术点,以及部分未列举的技术点都做了较为详细的分析.全文篇幅很大,需要大家耐心阅读.下面来看一下本文的目录: 源码分析类文章通常比较枯燥.因此,我在分析源码的过程中写了一些示例,同时也绘制了一些图片.希望通过这些示例和图片,帮助大家理解…