Mybatis-执行过程

典型代码:

1.String resource = "org/mybatis/example/mybatis-config.xml";

2.InputStream inputStream = Resources.getResourceAsStream(resource);

3.SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

4.SqlSession session = sqlSessionFactory.openSession();

try {

5.  BlogMapper mapper = session.getMapper(BlogMapper.class);

6.  Blog blog = mapper.selectBlog(101);

} finally {

  session.close();

}

其中包含3个步骤:

步骤一、初始化

加载并XML配置文件,SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例

配置文件:分两大类型,即 mybatis-config.xml 和 Mapper 接口对应的 SQL 语句配置

MyBatis 规定所有的 Mapper 需要定义成接口的形式,这主要是配合 jdk 自带的动态代理机制

步骤二、创建SqlSession:

SqlSession 是 MyBatis 对外提供的执行数据库操作的统一接口,表示一次数据库会话

2.1 session与connection的粗略理解:

connection是个物理概念,session是逻辑概念。connection类似于物理通道,如一条路,而session可以形容为在这条路上的建立的一次运输。

session与connection,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用(连接池)。

2.2 数据源与连接池与连接

1、MyBatis数据源DataSource对象的创建发生在MyBatis初始化的过程中

2、上述代码中,前面5步都不会触发connection的创建,只有真正执行的时候,才会通过openConnection来创建connection

3、MyBtis默认数据源类型:POOLED使用连接池, UNPOOL不使用连接池, JNDI使用JNDI实现的数据源,第三方数据源:如C3P0等

步骤三、sql执行

完整步骤参考:http://www.zhenchao.org/2017/10/15/mybatis-mechanism/

一、SqlSession

SqlSession 接口是 MyBatis 对外提供的API,通过以下方法可以看出,既可以提供查询、更新等直接操作,也可以获取mapper接口通过mapper操作,另外提供事务及缓存的相关操作,主要方法:selectOne/selectList/insert/upadte/delete,commit/rollback,getMapper/getConfiguration,clearCache

再看下默认实现DefaultSqlSession,发现其方法实现基本上都是对 Executor 方法的封装

二、Mapper

MyBatis 要求所有的 Mapper 都定义成接口的形式,这主要是为了配合 jdk 自带的动态代理机制,jdk 动态代理要求被代理的类必须抽象出一个接口(常用的动态代理除了 jdk 内置的方式,还有基于 CGlib 等第三方组件的方式)MyBatis 基于 jdk 的动态代理机制实现 Mapper 接口中声明的方法,这其中包含了 SQL 语句获取、参数绑定、缓存操作、数据库操作,以及结果集映射处理等 步骤

MapperProxy invoke方法会调用关联的MapperMethod execute方法

final MapperMethod mapperMethod = this.cachedMapperMethod(method);

return mapperMethod.execute(sqlSession, args);

MapperMethod主要是通过调用的Mapper的方法:Mapper.method 找到已经解析的sql语句解析成具体的调用类型,然后再调用SqlSession

MapperMethod 再调用SqlSession的相关方法:

execute:

if (SqlCommandType.INSERT == this.command.getType())

    sqlSession.insert(this.command.getName(), param)

所以,Mapper -> MapperProxy -> MapperMethod -> SqlSession

三、Executor

Executor 接口定义了基本的数据库操作,前面在介绍 SqlSession 时曾描述 SqlSession 为 MyBatis 框架对外提供的 API 接口,

其中声明了对数据库的基本操作方法,这些操作方法基本上都是对 Executor 操作方法的封装

主要方法:query/update,commit/rollback,createCacheKey/clearLocalCache,getTransaction/commit/rollback

BaseExecutor 抽象类实现了 Executor 接口中声明的所有方法,并抽象了 4 个模板方法交由子类实现,

这 4 个方法分别是:doUpdate、doFlushStatements、doQuery,以及 doQueryCursor。

SimpleExecutor 继承了 BaseExecutor 抽象类,并为这 4 个模板方法提供了最简单的实现

CachingExecutor实现类用于为 Executor 提供二级缓存支持

四、StatementHandler

StatementHandler 接口及其实现类是 Executor 实现的基础,可以将其看作是 MyBatis 与数据库操作之间的纽带,实现了 java.sql.Statement 对象的获取,以及 SQL 参数绑定与执行的逻辑

五、ResultSetHandler结果集映射

Executor 在调用具体的 StatementHandler 执行数据库查询操作时会针对数据库返回的结果集调用,ResultSetHandler 的相应方法执行结果集到结果对象的映射处理

方法:handleResultSets(Statement statement)

六、Executor详解

BaseExecutor 是一个抽象类,实现了 Executor 接口中声明的所有方法,并采用模板方法模式抽象出 4 个模板方法交由子类实现doUpdate、doFlushStatements、doQuery,以及 doQueryCursor。


Mybatis自定义插件Interceptor:

https://blog.csdn.net/top_code/article/details/55520948

你可能感兴趣的:(Mybatis-执行过程)