Mybatis源码研究分析最透彻的文章

1、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.java

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

一、源码下载到本地 从github下载mybatis源码到idea中。 git

在这里插入图片描述
在这里插入图片描述

二、快速开始程序员

  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>
复制代码

三、建立POJO类github

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

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

复制代码

四、建立测试类sql

/**
 * 源码学院-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();
      }
   }
复制代码

五、效果 数据库

ok !大功告成

2、How is mybatis?

经过刚才的demo咱们能够用java》mybatis》mysql能够查询数据库想要的内容,那如今问题来了?其底层的实现原理是什么? 做为一名高级工程师或者是架构师,咱们要知其然知其因此然。 那咱们如今分析下mybatis的技术本质是什么 apache

在这里插入图片描述

从这个图来讲,咱们能够看得出mybatis是一个“gui公”,专门拉皮条的,那它为什么能作到了?我以为至少有着三个状况 缓存

在这里插入图片描述
那这三项包含什么了?
在这里插入图片描述
只有mybatis知道链接那个数据库源而后执行什么sql语句,谁去执行,这三个条件达到了我们才能把这个事情给办了。 这个就比如我们晚上约一个妹子作拍拍的事情,完成这个事情必须是有宾馆、有女孩有TT...你懂得
在这里插入图片描述

3、Check is mybatis!

经过上面咱们分析,咱们如今去看看mybatis的源码,看看是否是这样作的。bash

一、找到程序的入口

在这里插入图片描述

一、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 这个是咱们的源码分析过程,具体步骤能够关注下个人公众号或者群号能够观看视频。

在这里插入图片描述

二、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
复制代码

这个是咱们的源码分析过程,具体步骤能够关注下个人公众号或者群号能够观看视频。

在这里插入图片描述

三、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的内容能够关注下个人公众号

在这里插入图片描述
视频获取 连接: pan.baidu.com/s/1wMkL3PNL… 提取码:5htb
相关文章
相关标签/搜索