mybatis执行流程

时间:2020-03-18 15:14:00   收藏:0   阅读:63

mybatis执行流程

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

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

  1. 加载全局配置文件

? 技术分享图片

技术分享图片

技术分享图片

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

技术分享图片

2. 解析数据源

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

技术分享图片

3. 解析mappers标签

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

4.解析映射文件

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

技术分享图片

4.1 MappedStatement对象中主要封装如下:
5.解析sql信息并进行数据封装

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

技术分享图片

技术分享图片

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

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

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

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

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

6. 解析sql语句也是在此时进行的
7. 获取数据库连接
8. 获取可执行的sql语句

技术分享图片

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

技术分享图片

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

技术分享图片

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

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

技术分享图片

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

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

技术分享图片

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

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

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

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

9. 执行sql

执行sql其实很简单

rs = preparedStatement.executeQuery();

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

10. 处理结果集

技术分享图片

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

技术分享图片

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

技术分享图片

技术分享图片

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

原文:https://www.cnblogs.com/sx-wuyj/p/12517367.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!