MyBaties源码解析

觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个部分也花了几个小时的时间去琢磨 但是感觉值了,我觉得对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)这个方法就可以得到 连接数据源的信息

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5
 6 <configuration>
 7     <!-- 配置环境信息,即数据源信息 -->
 8     <environments default="d1">
 9         <environment id="d1">
10             <!-- 配置事务管理器 -->
11             <transactionManager type="JDBC" />
12             <!-- 配置数据源以及数据库连接信息 -->
13             <dataSource type="POOLED">
14                 <property name="driver" value="com.mysql.jdbc.Driver" />
15                 <property name="url"
16                     value="jdbc:mysql://localhost:3306/fresh?characterEncoding=UTF-8" />
17                 <property name="username" value="root" />
18                 <property name="password" value="root" />
19             </dataSource>
20         </environment>
21     </environments>
22     <!-- 关联隐射文件 -->
23     <mappers>
24         <mapper resource="com/newroad/dao/StudentMapper.xml" />
25     </mappers>
26 </configuration>
27   

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)

原文地址:https://www.cnblogs.com/hengly/p/10992652.html

时间: 2024-10-07 16:25:37

MyBaties源码解析的相关文章

设计模式课程 设计模式精讲 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 /** * 饿汉式加载,初始化的时候,就已经new出了对象 */ private static Runtime currentRuntime = new Runtime(); /** * Returns the runtime object associated with the current Java applicat

设计模式课程 设计模式精讲 6-3 抽象工厂源码解析

1 源码解析 1.1 mysql源码解析 1.2 mybaties 的sqlsession源码解析 1 源码解析 1.1 mysql源码解析 1.2 mybaties 的sqlsession源码解析 原文地址:https://www.cnblogs.com/1446358788-qq/p/11295158.html

设计模式课程 设计模式精讲 10-2 外观模式源码解析

1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) 1.2 源码解析2 1.3 源码解析3 1.4 源码解析4 1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) jdbc在springJDBC中的封装 /** * Close the given JDBC Connection and ignore any thrown exception. * This is useful for typical finally blocks in manual JDB

设计模式课程 设计模式精讲 17-3 模板方法模式源码解析

1 源码解析 1.1 源码解析1(在jdk中的使用) 1.2 源码解析2(在servlet中的应用) 1.3 源码解析3(在mybaties中的应用) 1 源码解析 1.1 源码解析1(在jdk中的使用) AbstractList(父类) public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { //get方法为抽象方法,完全交给子类去实现 abstr

设计模式课程 设计模式精讲 16-5 代理模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用) 1.2 源码解析2(spring中的应用) 1.3 源码解析3(mybaties中的应用) 1 源码解析 1.1 源码解析1(jdk中的应用) java.lang.reflect.Proxy public class Proxy implements java.io.Serializable { protected Proxy(InvocationHandler h) { doNewInstanceCheck(); this.h = h; }

设计模式课程 设计模式精讲 18-3 迭代器模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用) 1.2 源码解析2(mybaties中的应用)   1 源码解析 1.1 源码解析1(jdk中的应用) java.util.Iterator(接口) public interface Iterator<E> { /** * Returns {@code true} if the iteration has more elements. * (In other words, returns {@code true} if {@link #nex

ChrisRenke/DrawerArrowDrawable源码解析

转载请注明出处http://blog.csdn.net/crazy__chen/article/details/46334843 源码下载地址http://download.csdn.net/detail/kangaroo835127729/8765757 这次解析的控件DrawerArrowDrawable是一款侧拉抽屉效果的控件,在很多应用上我们都可以看到(例如知乎),控件的github地址为https://github.com/ChrisRenke/DrawerArrowDrawable

五.jQuery源码解析之jQuery.extend(),jQuery.fn.extend()

给jQuery做过扩展或者制作过jQuery插件的人这两个方法东西可能不陌生.jQuery.extend([deep],target,object1,,object2...[objectN]) jQuery.fn.extend([deep],target,object1,,object2...[objectN])这两个属性都是用于合并两个或多个对象的属性到target对象.deep是布尔值,表示是否进行深度合并,默认是false,不执行深度合并.通过这种方式可以在jQuery或jQuery.fn

eclipse中导入jdk源码、SpringMVC注解@RequestParam、SpringMVC文件上传源码解析、ajax上传excel文件

eclipse中导入jdk源码:http://blog.csdn.net/evolly/article/details/18403321, http://www.codingwhy.com/view/799.html. ------------------------------- SpringMVC注解@RequestParam:http://825635381.iteye.com/blog/2196911. --------------------------- SpringMVC文件上传源