觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个部分也花了几个小时的时间去琢磨 但是感觉值了,我觉得对mybaties的原理更加清晰了

学了mybaties也有一段时间了 今天抽空来聊聊mybaties是如何来操作数据库的 它为什么能够方便我们不用再去关注如何创建连接编写预编译语句 它又是如何实现的呢?我们都知道 要操作数据库数据库 必须先要有数据源 执行语句 还要有操作

1.数据源 是用来连接数据库的 他是如何获取到数据库的连接的呢 我们知道mybatais有一个核心配置文件mybatis-config.xml 而这个文件里面 里面有很多数据库连接信息

接下里我们来看一下源码是如何获取到数据源的

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(InputStream)

org.apache.ibatis.session.SqlSessionFactoryBuilder.build(InputStream, String, Properties)

org.apache.ibatis.builder.xml.XMLConfigBuilder.XMLConfigBuilder(InputStream, String, Properties)

org.apache.ibatis.builder.xml.XMLConfigBuilder.parse()

org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XNode)

最后我们可以通过parseConfiguration(XNode)这个方法就可以得到 连接数据源的信息

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<!-- 配置环境信息,即数据源信息 -->
<environments default="d1">
<environment id="d1">
<!-- 配置事务管理器 -->
<transactionManager type="JDBC" />
<!-- 配置数据源以及数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/fresh?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 关联隐射文件 -->
<mappers>
<mapper resource="com/newroad/dao/StudentMapper.xml" />
</mappers>
</configuration>

2.执行语句 首先来了解以下这四种语句 那么他们又是如何执行的呢

org.apache.ibatis.session.SqlSession. (Class<T>)

org.apache.ibatis.session.Configuration.getMapper(Class<T>, SqlSession)

org.apache.ibatis.binding.MapperRegistry.getMapper(Class<T>, SqlSession)

org.apache.ibatis.binding.MapperProxyFactory.newInstance(SqlSession)

org.apache.ibatis.binding.MapperProxy.MapperProxy(SqlSession, Class, Map)

java.lang.reflect.Method.invoke(Object, Object...)

org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(Method)

org.apache.ibatis.binding.MapperMethod.execute(SqlSession, Object[])

                                                              org.apache.ibatis.session.SqlSession.selectOne(String, Object)
                                                 
                         
DDL DML DQL DCL
数据定义语言 数据操纵语言 数据查询语言 数据控制语言,定义访问权限、取消访问权限,安全设置
create、drop、alter insert、update、delete select grant

3.操作

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession()

           org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType, TransactionIsolationLevel, boolean)     
                  org.apache.ibatis.session.Configuration.newExecutor(Transaction, ExecutorType)
                     org.apache.ibatis.executor.SimpleExecutor
                         org.apache.ibatis.executor.BaseExecutor.query(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql)
                              org.apache.ibatis.mapping.SqlSource.getBoundSql(Object)
                                  org.apache.ibatis.executor.SimpleExecutor.doQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql)
                                          org.apache.ibatis.executor.statement.StatementHandler
                                             org.apache.ibatis.executor.SimpleExecutor.prepareStatement(StatementHandler, Log)

MyBaties源码解析的更多相关文章

  1. 设计模式课程 设计模式精讲 8-11 单例模式源码解析(jdk+spring+mybaties)

    1 源码解析 1.1 单例解析1 1.2 单例解析2(容器单例) 1.3 单例解析3 1.4 单例解析4 1 源码解析 1.1 单例解析1 java.lang.Runtime /** * 饿汉式加载, ...

  2. 设计模式课程 设计模式精讲 7-3 建造者模式源码解析(jdk+guava+spring+mybaties)

    1 源码解析 1.1 jdk解析 1.2 guava解析 1.3 spring解析 1.4 mybaties解析 1 源码解析 1.1 jdk解析 String public StringBuilde ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  6. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  7. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  8. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  9. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

随机推荐

  1. 在Linux下搭建我的世界(Minecraft)服务器

    最近薅了百度云双12的羊毛,1核2G一年150.突然想起以前大学整个宿舍通宵开黑挖泥土的岁月,所以刚好趁着这台服务器,打算自己搭建一个我的世界服务器,重温一下以前的感觉. 超详细Linux搭建Java ...

  2. .NET ViewState对于画面的速度影响

    最近开发一个.NET网站,发现有一个画面的交互特别缓慢,查了很多原因都没查到 最后终于知道,是因为画面的ViewState用的过多,其中有一个ViewState保存的数据相对而言比较大,导致了画面的运 ...

  3. BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1634 题意: 约翰留下他的N只奶牛上山采木.可是,当他回来的时候,他看到了一幕惨剧:牛们正 ...

  4. ResNeXt——与 ResNet 相比,相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半

    from:https://blog.csdn.net/xuanwu_yan/article/details/53455260 背景 论文地址:Aggregated Residual Transform ...

  5. lucene内置的评分函数

    For multiterm queries, Lucene takes the Boolean model, TF/IDF, and the vector space model and combin ...

  6. gulp记录

    npm install gulp -g //全局安装gulp gulp -v //此处若有问题,配置环境变量,npm config get prefix得到路径 npm init //新建nodejs ...

  7. 「UVA644」 Immediate Decodability(Trie

    题意翻译 本题有多组数据.每组数据给出一列以"9"结尾的仅包含'0'和'1'的字符串,如果里面有一个是另一个的子串,输出"Set &case is not imm ...

  8. python定时任务:apscheduler的使用(还有一个celery~)

    文章摘自:https://www.cnblogs.com/luxiaojun/p/6567132.html 1 . 安装 pip install apscheduler 2 . 简单例子 # codi ...

  9. scala & spark实战

    java.lang.Long is not a valid external type for schema of string   java.lang.RuntimeException: Error ...

  10. tyvj1015公路乘车——DP

    题目:http://www.joyoi.cn/problem/tyvj-1015 代码如下: #include<iostream> #include<cstdio> using ...