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是一个“gui公”,专门拉皮条的,那它为何能做到了?我觉得至少有着三个情况

那这三项包含什么了?
只有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全局配置关系类
SqlSessionFactorySession管理工厂接口
SessionSqlSession是一个面向用户的接口。提供了很多操作数据库的方法
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值