mybatis执行流程

mybatis执行流程

记录一下自己对mybatis的理解和心得.代码是自己手写的一个mybatisDemo,比较简陋,只有一个简单的查询语句,但是麻雀虽小五脏俱全,可以理解整个mybatis的执行流程.

重要说明:本文讲述的只是本人手写的简易mybatisDemo,可以对理解mybatis的执行流程有很大帮助.

主要流程简介

1)加载全局配置文件:mybatis-config.xml

2)解析xml配置文件:使用dom4g根据xml结构解析数据源信息,mapper.xml中的信息解析后封装

3)全局配置的数据封装:封装到configuration对象中

4)创建数据库连接:通过configuration中封装的信息获取数据库连接

5)获取可执行的sql语句:获取解析后并完成拼接的sql语句

6)执行sql:执行sql得到数据库查询后的结果

7)处理结果集:将数据库的查询结果封装为POJO


加载全局配置文件

将配置文件加载到InputStream中,DcoumentUtils将stream转换为Document对象,根据xml文件中的标签去解析.

解析数据源

数据源信息解析后封装到DataSource对象中.DataSource主要作用就是封装数据源信息.再将DataSource封装到configuration中.

解析mappers标签

解析mappers标签可以得到映射文件的路径,根据路径可以找到对应的mapper.xml.

解析映射文件

同样的将映射文件读取转换为Document对象,根据标签进行解析,将解析后的信息封装到MappedStatement对象.

MappedStatement对象中主要封装如下:

sqlSorce:封装未解析的sql信息

statementType:statement的类型

statementId:namespace+id,这里也可以解释日常开发中映射文件id必须唯一的原因.

pramererTypeClass:请求参数的类型

resultTypeClass:结果集封装的类型

最后MappedStatement对象也会封装到configuration中.

解析sql信息并进行数据封装

此时也就是sqlSource对象,sqlSource其实是一个接口.实现类主要有

DynamicSqlSource:封装带有${}或者带有动态sql标签的sql信息

RawSqlSource:封装最多只带有#{}的sql信息,封装了StaticSqlSource

StaticSqlSource:封装最多只带有#{}的SQL信息

其中sql信息是由SqlNode对象封装的.sqlNode同样也是接口,封装sql的节点信息.提供对封装的sql节点的解析.主要实现类有:

mybatis不单单只有这四个,这个只是我的demo中写了四个.

IfSqlNode:封装test信息,子标签信息.

TextSqlNode:封装的是带有${}的文本字符串

StaticeTextSqlNode:封装的是带有#{}的文本字符串

MixSqlNode:装的是带有${}的文本字符串

解析sql语句也是在此时进行的

解析映射文件节点的时候,会判断每一个节点的类型,封装到对应sqlNode中.

sqlNode有一个apply()接口方法,正是此方法提供了解析功能,最终出来的sql语句封装到DynamicContext的StringBuffer中,此时出来的sql语句只是完成了字符串的拼接,还没有被解析.

DynamicContext:动态上下文,入参信息,解析过程中的sql信息

通过ognl解析ognl表达式,#{username}中username就是ognl表达式.

开始解析${}和#{},至于具体如何解析,目前本人不是很理解,会继续深入研究.

此时已经得到了可以执行的sql语句,将可以执行的语句追加到DynamicContext中的StringBuffer中.

将各类型的sqlNode添加到集合中封装到MixSqlNode中.

DynamicSqlSource:封装带有${}或者带有动态sql标签的sql信息

将MixSqlNode封装到DynamicSqlSource中.

前面提到过了MappedStatement中封装了SqlSource,而MappedStatement同样封装到了configuration中.此时已经解析完了全局配置文件和映射文件.

获取数据库连接

本人使用了DBCP数据库连接池优化

通过configuration对象获取dataSource,通过getConnection获取到数据库连接.

获取可执行的sql语句

先判断MappedStatement,如果MappedStatement对象为null的话,那么后续也没意义了,所以进行一个校验.

通过MappedStatement获取到sqlSource,前文提到过了sqlSource是一个接口,有一个接口方法是getBoundSql,三个实现类都实现了这个方法.

此时涉及到了BoundSql,先说一下BoundSql

parameterMapping对象是封装解析出来的信息,就是mame和type两个值.

所以boundSql中封装的信息就很好理解了,就是封装了解析后信息的参数集合和sql语句.

判断statementType,我这里写的只有prepared一种,后面可以继续写其他两种.

将sql语句通过prepareStatement()方法完成拼写sql.

设置参数,简单类型就不做说明了.主要说一下POJO类型的

parameterMapping中获取到#{username}中的username,MappedStatement中之前说过封装了parameterTypeClass请求参数类型.

根据获取到的username通过反射拿到类中对应的字段,这里也可以解释我们日常开发中为什么属性名要和#{}里面的内容对应起来.

此时就可以获得了可以执行的sql语句.

执行sql

执行sql其实很简单

rs = preparedStatement.executeQuery();

只有这一行代码.rs是ResultSet,结果集.

处理结果集

前文中也说明了parameterMapping中封装了resultTypeClass,结果集的类型.通过反射new出来结果集对象.

getMetaData其实就是获取结果集的表结构信息.通过表结构信息获取到列数.

根据结果集的列数遍历结果集,同样根据对应属性名将结果集完成封装.

致此,本人写的mybatisDemo已经完成.感谢各位看官.

原文地址:https://www.cnblogs.com/sx-wuyj/p/12516495.html

时间: 2024-10-28 20:33:17

mybatis执行流程的相关文章

一、Mybatis初探索(Mybatis执行流程)

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型.接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录. 以上是一段摘自Mybatis中文官网的关于Mybatis的简要介绍,我个人觉得这短短的几句话将Mybatis的特性都给攘括在其中了. 经过一段时期

mybatis功能架构及执行流程

一.功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: (1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. (2)数据处理层:负责具体的SQL查找.SQL解析.SQL执行和执行结果映射处理等.它主要的目的是根据调用的请求完成一次数据库操作. (3)基础支撑层:负责最基础的功能支撑,包括连接管理.事务管理.配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件.为

Mybatis源码阅读之--整体执行流程

Mybatis执行流程分析 Mybatis执行SQL语句可以使用两种方式: 使用SqlSession执行update/delete/insert/select操作 使用SqlSession获得对应的Mapper,然后调用mapper的相应方法执行语句 其中第二种方式获取Mapper的流程在前面已经解析过,请查看文章Mybatis源码阅读之--Mapper执行流程 其实这个方法最后的MapperMthod也是调用SqlSession的相应方法执行增删该的操作,这边文章主要介绍SqlSession执

mybatis执行过程及经典面试题

Mybatis执行流程 mybatis中xml解析是通过SqlSessionFactoryBuilder.build()方法. 初始化mybatis(解析xml文件构建成Configuration对象)并初始化SqlSessionFactory对象 在解析xml时会同时根据其中节点做相应的初始化操作 关键节点:  settings.typeAliases.mappers 通过SqlSesssionFactory.openSession()方法打开一个SqlSession对象 SqlSession

转 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇) 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession的重要性了吧, 没错,从表面上来看,

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession

03Mybatis_mybatis框架原理——执行流程

mybatis的框架的原理(执行流程). 来源: 传智播客

Mybatis工作流程

Mybatis体系结构: Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请 求就会调用数据处理层来完成具体的数据处理. 数据处理层:负责具体的SQL查找.SQL解析.SQL执行和执行结果映射处理等.它主要的目的是根据调 用的请求完成一次数据库操作. 基础支撑层:负责最基础的功能支撑,包括连接管理.事务管理.配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件.为上层的数据处理层提供最基础的

python学习之内部执行流程,内部执行流程,编码(一)

python的执行流程: 加载内存--->词法分析--->语法分析--->编译--->转换字节码---->转换成机器码---->供给CPU调度 python的编码: 1. ASCII    2的256次表示. 2. UNICODE  最好16位表示2字节 3. UTF-8 能就8位表示就用8位表示,节省资源. python的注释: 字符 '#': 只注释一行 字符"  '''  ":注释多行 python的教程参数: 用 sys模块 的argv参数,