史上最牛的Mybatis源码研究分析最透彻的文章并且没有之一

一、What is mybatis?

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

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

1、源码下载到本地
从github下载mybatis源码到idea中。
在这里插入图片描述
在这里插入图片描述

2、快速开始

  1. 构建mybatis-config.xml文件
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
     <mapper resource="mybatis/UserMapper.xml"/>
    </mappers>
</configuration>
  1. usermapper.xml文件
<mapper namespace="bat.ke.qq.com.mybatis.UserMapper">
    <select id="selectUser"  resultType="bat.ke.qq.com.mybatis.User">
        select * from user where id = #{id}
    </select>
</mapper>

3、创建POJO类

@ToString
@Getter
@Setter
public class User implements Serializable{

  private Integer id;
  private String username;
  private  Integer age;
  private String phone;
  private  String desc;

4、创建测试类


/**
 * 源码学院-Monkey
 * 只为培养BAT程序员而生
 * http://bat.ke.qq.com
 * 往期视频加群:516212256 暗号:6
 */
@Slf4j
public class MybatisTest {

   public static void main(String[] args) throws Exception {
      String resource = "mybatis-config.xml";
      InputStream inputStream = Resources.getResourceAsStream(resource);
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      SqlSession session = sqlSessionFactory.openSession();
      try {
         User user = session.selectOne("bat.ke.qq.com.mybatis.UserMapper.selectUser", 1);
         log.info("user:{}", user);
      } finally {
         session.close();
      }
   }

5、效果

ok !大功告成

二、How is mybatis?

通过刚才的demo我们可以用java》mybatis》mysql可以查询数据库想要的内容,那现在问题来了?其底层的实现原理是什么?
作为一名高级工程师或者是架构师,我们要知其然知其所以然。
那我们现在分析下mybatis的技术本质是什么
在这里插入图片描述

从这个图来说,我们可以看得出mybatis是一个“龟公”,专门拉皮条的,那它为何能做到了?我觉得至少有着三个情况
在这里插入图片描述
那这三项包含什么了?
在这里插入图片描述
只有mybatis知道连接那个数据库源然后执行什么sql语句,谁去执行,这三个条件达到了咱们才能把这个事情给办了。
这个就好比咱们晚上约一个妹子做拍拍的事情,完成这个事情必须是有宾馆、有女孩有TT…你懂得
在这里插入图片描述

三、Check is mybatis!

通过上面我们分析,我们现在去看看mybatis的源码,看看是不是这样做的。

1、找到程序的入口
在这里插入图片描述

1、mybatis是如何获取数据库源的
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement
org.apache.ibatis.builder.BaseBuilder.resolveClass
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.getDataSource
org.apache.ibatis.session.Configuration.setEnvironment
这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。
在这里插入图片描述

2、mybatis是如何获取sql语句

  org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)>
   >org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
    >org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
     >org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
      >org.apache.ibatis.builder.xml.XMLMapperBuilder
       >org.apache.ibatis.builder.xml.XMLMapperBuilder.parse    >org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode  >org.apache.ibatis.builder.xml.XMLStatementBuilder
           >org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
             >org.apache.ibatis.session.Configuration.addMappedStatement

这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。
在这里插入图片描述

3、mybatis是如何执行的

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()>
  >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
    >org.apache.ibatis.session.defaults.DefaultSqlSession
      >org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
       >org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
         >org.apache.ibatis.executor.CachingExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
          >org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
          这个是我们的源码分析过程,具体步骤可以关注下我的公众号或者群号可以观看视频。

在这里插入图片描述

总结

通过mybatis的源码分析我们可以得出mybatis访问数据库确实如从,其中比较核心的几个点我列出来给大家。

名称 意义
Configuration 管理mysql-config.xml全局配置关系类
SqlSessionFactory Session管理工厂接口
Session SqlSession是一个面向用户的接口。提供了很多操作数据库的方法
Executor 执行器是一个接口(基本执行器、缓存执行器)
作用:SqlSession内部通过执行器操作数据库
MappedStatement 底层封装对象
作用:对操作数据库存储封装,包括 sql语句、输入输出参数
StatementHandler 具体操作数据库相关的handler接口
ResultSetHandler 具体操作数据库返回结果的handler接口

在这里插入图片描述
整体认识mybatis源码包


                ├─annotations   ->注解相关 比如select insert
                ├─binding       -> mapper相关
                ├─builder       ->解析xml相关
                ├─cache        ->缓存
                ├─cursor       -> 返回结果resultset
                ├─datasourcer   ->数据管理 
                ├─exceptionsr       -> 异常
                ├─executorr       -> 执行器
                ├─io              ->classloader
                ├─jdbc              ->jdbc
                ├─lang              ->jdk7 jdk8
                ├─logging              ->日志相关
                ├─mapping              ->mapper相关的封装
                ├─parsing              ->xml相关解析
                ├─plugin              ->拦截器
                ├─reflection              ->反射相关
                ├─scripting              ->数据厂家
                ├─session              ->sessiomn
                ├─transaction            ->事务
                └─type                  ->返回类型对应

需要了解更多mybatis的内容可以关注下我的公众号
在这里插入图片描述
视频获取
链接:https://pan.baidu.com/s/1wMkL3PNLvcix6Pezqy2VlA
提取码:5htb

猜你喜欢

转载自blog.csdn.net/SpringBoot_/article/details/90668551