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

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

以上是一段摘自Mybatis中文官网的关于Mybatis的简要介绍,我个人觉得这短短的几句话将Mybatis的特性都给攘括在其中了。

经过一段时期关于Mybatis的认识,以及项目开发过程中的长期使用,我对Mybatis产生了些许兴趣,通过阅读一些博文以及视频,我决定也尝试一下Mybatis的源码阅读。但是这是我第一次对Mybatis源码进行阅读,同时也是我阅读的第一个成熟框架源码,源码阅读起来些许吃力。在阅读过程中,我希望通过随笔来对我的源码阅读过程进行记录,如果有不对的地方希望大佬能不吝赐教,多做批评!

阅读Mybatis源码需要对源码进行断点阅读,首先需要去下载Mybatis的源码,我下载的是Mybatis 3.5.3版本,地址是:https://github.com/mybatis/mybatis-3/archive/mybatis-3.5.3.zip

下载好源代码之后,解压源代码包,使用Idea导入源码,等待项目构建完成!

构建完成之后,出现以下的文件夹

接下来,编写一个Mybatis的启动小demo,用于对源码进行debugger(可参考Mybatis中文官网)

首先Mybatis需要一个xml的配置文件

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="mysql">
    <environment id="mysql">
      <transactionManager type="JDBC"></transactionManager>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://ip:port/database?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"></property>
        <property name="username" value="name"></property>
        <property name="password" value="password"></property>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mapper/UserMapper.xml"></mapper>
  </mappers>
</configuration>

编写一个测试的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.advance.learn.moudle1.mapper.UserMapper">
  <select id="selectOneById" resultType="hashMap">
    select * from user where id = #{id}
  </select>
</mapper>

接口文件

public interface UserMapper {

  Map<String, Object> selectOneById(String id);

}

编写一个启动类:

public static void main(String[] args) throws IOException {
    InputStream is = Resources.getResourceAsStream("mybatis.xml");
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = builder.build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession(true);
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    System.out.println(userMapper.selectOneById("86f9428d286246cfa4d0f3f4cac5b720"));
  }

准备好相关事宜之后,开始对代码进行debug阅读了

第一步是读取配置文件xml,进入Resources.getResourceAsStream方法之后,看到如下结果

这一步只是一个简单的文件读取操作,下一步就是实例化SqlSessionFactoryBuilder类,然后调用build方法,获取sqlSessionFactory实例,看看代码:

SqlSessionFactoryBuilder类中包含了多个build方法,按照我们传的参数,可以知道代码进入以下方法

继续往下走

XMLConfigBuilder构造函数调用了parseConfiguration方法,将配置文件中的节点以及数据封装成Configuration对象,然后返回,这一步就可以得到我们的配置文件信息以及Mybatis给我们默认的一些配置,关于这一步,暂时不看,我觉得刚开始我需要先对Mybatis的大致执行流程有个初步概念,所以我继续往下走了

可以看到build方法最终是返回了一个DefaultSqlSessionFactory对象,这里还有一个SqlSessionManager对象,但是好像已经废弃了,所以我们看DefaultSqlSessionFactory对象

这里可以看出来,openSession方法最终返回了一个DefaultSqlSession对象,进入DefaultSqlSession,我发现他其中很有意思,小伙伴可以去看一看:

这里面包含了很多的默认方法,我发现他们都是从executor中获取的执行方法,所以我猜测,这个执行器里面应该是封装了jdbc的基本操作,我们后面再看这里  

获取了SqlSession之后,就可以进入下一步操作啦!

由于时间限制,先记录这么多,下一篇我要探索一下Mybatis的一大神奇操作,为什么配置一个接口和一个xml文件,我们就能执行sql然后实现CRUD呢,这个问题我们下文继续探索,初次阅读源码,希望各位多多指教,多做批评!

原文地址:https://www.cnblogs.com/advanceBlog/p/11754289.html

时间: 2024-10-11 03:38:54

一、Mybatis初探索(Mybatis执行流程)的相关文章

mybatis功能架构及执行流程

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

转 深入浅出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

mybatis执行流程

mybatis执行流程 记录一下自己对mybatis的理解和心得.代码是自己手写的一个mybatisDemo,比较简陋,只有一个简单的查询语句,但是麻雀虽小五脏俱全,可以理解整个mybatis的执行流程. 重要说明:本文讲述的只是本人手写的简易mybatisDemo,可以对理解mybatis的执行流程有很大帮助. 主要流程简介 1)加载全局配置文件:mybatis-config.xml 2)解析xml配置文件:使用dom4g根据xml结构解析数据源信息,mapper.xml中的信息解析后封装 3

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

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

mybatis的执行流程 #{}和${} Mysql自增主键返回

n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在SqlMapConfig.xml中加载. n 通过Mybatis环境等配置信息构造SqlSessionFactory,即会话工厂. n 由会话工厂创建SqlSession即会话,操作数据库需要通过SqlSession进行. n Mybatis底层自定义了Executor执行器接口操作数据库,Exec

MyBatis初接触

参考MyBatis官方文档. 基本开发步骤: 一.导包,mybatis-3.2.7.jar: 二.编写实体类Customer.java(与数据库表对应): 三.编写实体类对应的mapper接口CustomerMapper.java(定义实体类的操作): 四.编写实体类对应的mapper,Customer.xml(接口中的方法名与mapper中的操作的id名要一致): 五.编写mybatis-config.xml: 六.在mybatis-config.xml中注册mapper: 七.从xml获取S

mybatis初入门

昨天刚接触mybatis,感觉吧. 对于我这个菜鸟来说,能学什么就是什么,完全没有感觉... 还是说说mybatis吧. mybatis的配置xml,实体类,dao. configuration.xml <?xml version="1.0" encoding="UTF-8" ?>      <!DOCTYPE configuration          PUBLIC "-//mybatis.org//DTD Config 3.0//E

Spring+Struts2+mybatis 整合(详细解释+完整流程)

一.新建maven项目 选择 maven-archetype-webApp 二.目录结构规范 三.导入JAR包.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http