zoukankan      html  css  js  c++  java
  • 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配置文件定义了框架运行的环境配置,其中基本配置有数据库配置,mapper接口配置

    首先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呢,这个问题我们下文继续探索,初次阅读源码,希望各位多多指教,多做批评!

  • 相关阅读:
    datetime模块
    time模块
    shelve模块
    json&pickle 序列化
    re正则
    MQ常用命令
    MQ for linux安装与卸载【转】
    Linux下安装Oracle11g服务器【转】
    PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)[转]
    [LeetCode]:116:Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/advanceBlog/p/11754289.html
Copyright © 2011-2022 走看看