1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂接口DataSourceFactory,这二者是MyBatis数据源模块的基础,包括本文中的非池型非池型数据源(UnpooledDataSource)和之后的池型数据源(PooledDataSource).托管型数据源(JndiDataSourceFactory)都是在这两个接口上产生的. 本文解读一下MyBatis中的非池型数据源,这是基础的数据源,之后要解读的池型数据源又是以此数据源为基础产生的. 2 非池型数据源及其工厂…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二者皆是解析XML映射文件中参数类型与返回结果类型的基础,别名注册器用于通过别名找到对应的类类型,类型处理器注册器则用于通过类类型来找到对应了类型处理器与数据库类型,以此来完成进出数据库数据与java之间类型的转换. 我们在类型处理器注册器一篇中已经简单介绍了类型处理器,那就是用于java类型与数据库…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html 1.回顾 上一文中解读了MyBatis中的事务模块,其实事务操作无非就是提交和回滚.整个事务模块采用了抽象工厂模式进行设计,将具体的事务实例的生成对使用方隐藏,使用工厂中提供的生产方法来获取. 事务模块分为两类:JDBC类型和MANAGED类型,前者多用于单独使用MyBatis框架的情况下(比如测试学习MyBatis功能),后者则表示托管于其他框架,比如Spring…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也就是只拥有单一数据连接的数据源,他只管理着一个数据连接,这种数据源现在很少使用,一般都是用池型数据源,因为单个连接的情况下,为了保证操作的正确性,针对这个连接的使用要进行同步,这样无疑会拖慢系统运行速度. 而使用池型数据源,在池中保存有多个数据库连接,可以供多个数据库访问线程同时获取现成的不同的数据…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html 1 回顾 之前介绍的非池型与池型数据源都是MyBatis自己定义的内部使用的数据源,在我们单独使用MyBatis框架架构系统的时候会使用到,但是这种情况不多见,因为MyBatis最常见的使用方式是与Spring进行整合使用,这时我们在项目中一般不会使用MyBatis内置的池型数据源,而是使用外部的C3P0或者DBCP之类的第三方数据源jar包,在整合第三方数据源的时…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是environment中的组成部分,而Environgment是Configuration的基础部分,是构建Configuration的基石,但是有了基石只是能构建一个简单的配置对象,要适应实际的使用环境,还需要额外的组件,这些东西都需要添加到配置对象中,这一次就介绍类型模块-Type. 类型模块的具体内容基本…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6625612.html 本应该先开始说Configuration配置类的,但是这个类有点过于复杂,因为MyBatis中的所有配置项全部在这个类中,可谓包罗万象,一开始就讨论如此高大上的东西,貌似有点不合适,认识和学习都应该从小开始,从基础开始,所以我做了这样一个小安排,先挑Configuration中重要的配置项进行了解,心中有了大概印象之后,在进行Configuration的解读,这样就…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的就是Java类型与Jdbc类型,和其间的转换处理.类型模块在整个MyBatis功能架构中属于基础组件之一,是提前注册到注册器中,并配置到Configuration中备用. 从这一篇开始解析Parsing解析模块,这个模块不同于Type模块,这个模块更像是一套工具模块.本篇先解析通用标记解析器Gene…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为了解析SQL脚本中的参数,根据给定的开始标记与结束标记来进行参数的定位获取,然后右标记处理器进行参数处理,再然后将处理过后的参数再组装回SQL脚本中. 如此一来,解析的目的就是为了处理参数. 这一篇看看binding绑定模块. 2.binding模块 binding模块位于org.apache.ib…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegister,它主要用于将基本类型和用户自定义的类型进行别名注册,将别名及其对应类类型保存在一个HashMap中,方便存取,是映射器映射功能实现的基础,本篇所研究的类型处理器注册器TypeHandlerReister是用来统筹管理类型处理器的,类型处理器是真正用于进行java类型与数据库类型映射的工具. 这…
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634151.html 1.回顾 之前介绍了Environment环境类,这其实是一个单例类,在MyBatis运行开启后只会存在一个唯一的环境实例,虽然我们可以在Configuration配置文件中配置多个环境,但是项目运行中只会存在其中的一个,一般项目会存在开发环境和测试环境.生产环境三大环境,其是否可以设置到配置文件中,在开发时使用开发环境,测试时使用测试环境,正式运营时可以使用生产环…
原创作品,可以转载,但是请标注出处地址: 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架,当下十分流行,配合Spring+Spring MVC组成SSM框架,能够胜任几乎所有的项目工程. MyBatis不同于Hibernate的最重要的地方就是SQL部分,MyBatis中你可以自己编写灵活的SQL代码,而在Hibernate基本上将SQL代码封装起来的,机会不会用到程序员去编写,这时Hibernate的优秀之处(简化了程序开发),同时也是其病脚(无法灵活开发). MyBati…
本章介绍 MyBatis 提供的数据源模块,为后面与 Spring 集成做铺垫,从以下三点出发: 描述 MyBatis 数据源模块的类图结构: MyBatis 是如何集成第三方数据源组件的: PooledConnection 设计初衷猜想: 类图结构 MyBatis 数据源部分的代码在 datasource 目录下. 提供了三种类型的数据源实现:unpooled(没有连接池).pooled(MyBatis 自身实现的连接池).jndi(依赖 JNDI 服务) MyBatis 提供了两个 java…
在mybatis-configuration.xml 文件中,我们进行了如下的配置: <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境常用: 一.development:开发模式 二.work:工作模式 --> <environments default="development"> <!--id属性必须和上面的default一样 --> <environment id="deve…
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能.接下来就顺着查询功能的实现开始一步一步开始解析mybatis源码. 首先们观察我们的测试代码类UserDaoTest: package com.test.learnmybatis; import org.apache.ibatis.io.Resources; import org.apache.i…
最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybatis源码学习(也就是mybatis-spring这个jar包的相关源码),这边笔记,主要来学习原生mybatis: 还是先用描述一下,原生mybatis从解析xml到执行SQL的一个流程: 1.第一步:首先会通过sqlSessionFactoryBuilder来build一个SQLSessionFac…
本章主要描述 MyBatis 插件模块的原理,从以下两点出发: MyBatis 是如何加载插件配置的? MyBatis 是如何实现用户使用自定义拦截器对 SQL 语句执行过程中的某一点进行拦截的? 示例准备 首先准备两个拦截器示例,代码如下. @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.cl…
本章通过一个简单的例子,来了解 MyBatis 执行一条 SQL 语句的大致过程是怎样的. 案例代码如下所示: public class MybatisTest { @Test public void selectByPrimaryKey() throws IOException { StudentDao studentDao = getSqlSession().getMapper(StudentDao.class); Student student = studentDao.selectByP…
本章通过分析 mybatis-spring-x.x.x.jar Jar 包中的源码,了解 MyBatis 是如何与 Spring 进行集成的. Spring 配置文件 MyBatis 与 Spring 集成,在 Spring 配置文件中配置了数据源.SqlSessionFactory.自动扫描 MyBatis 中的 Mapper 接口.事务管理等,这部分内容都交由 Spring 管理.部分配置内容如下所示: <?xml version="1.0" encoding="U…
本章简单介绍一下 MyBatis 的事务模块,这块内容比较简单,主要为后面介绍 mybatis-spring-1.**.jar(MyBatis 与 Spring 集成)中的事务模块做准备. 类图结构 MyBatis 事务模块的代码在 transaction 包下: 根据包的分类,提供了两种事务实现:jdbc.managed. 我们还是先来看下事务模块整体的类图结构: MyBatis 的事务模块和事务模块一样,使用的也是工厂方法设计模式.那么它扩展的方式肯定也是提供相应的事务工厂实现类和事务实现类…
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能. 类型转换模块 类型转换模块提供了两个主要功能,一个功能是别名机制,MyBatis 为了简化配置文件提供了别名机制:另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映…
上一章的案例,配置日志级别为 debug,执行一个简单的查询操作,会将 JDBC 操作打印出来.本章通过 MyBatis 日志部分源码分析它是如何实现日志打印的. 在 MyBatis 的日志模块中有一个 jdbc package,package 中的内容如下图所示: BaseJdbcLogger 是一个抽象类,它是 jdbc package 下其他类的父类,类继承关系如下图所示: BaseJdbcLogger 类中定义了一些公共集合和简单的工具方法,提供给子类使用. BaseJdbcLogger…
在 Java 开发中常用的日志框架有 Log4j.Log4j2.Apache Common Log.java.util.logging.slf4j 等,这些日志框架对外提供的接口各不相同.本章详细描述 MyBatis 是如何通过适配器的方式集成和复用这些第三方框架的. 日志适配器 MyBatis 的日志模块位于 org.apache.ibatis.logging 包中,该模块中 Log 接口定义了日志模块的功能,然后分别为不同的日志框架定义不同的日志适配器,这些日志适配器都继承 Log 接口,L…
本章主要描述 MyBatis 资源加载模块中的 ClassLoaderWrapper 类和 Java 加载配置文件的三种方式. ClassLoaderWrapper 上一章的案例,使用 org.apache.ibatis.io.Resources#getResourceAsStream(java.lang.String) 方法加载 MyBatis 的配置文件.Resources 是一个提供了多个静态方法的工具类,内部封装了 ClassLoaderWrapper 类的静态字段,Resources …
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675633.html 1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂接口DataSourceFactory,这二者是MyBatis数据源模块的基础,包括本文中的非池型非池型数据源(UnpooledDataSource)和之后的池型数据源(PooledDataSource).托管型数据源(JndiDataSourceFactory)都是在这两个接口上产生的. 本文解读…
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅入深(三):实例化xml配置解析器(XMLConfigBuilder)也进行了详细的阐述. 那么接下来就是解析configuration.xml并将configuration.xml中的配置信息加载到Configuration实例对象中去. 一,先来看看代码的位置 在文章:Mybatis源码解析,一…
Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的?   如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一样,本篇文章最最核心的要点就是 SqlSession实现数据库操作的源码解析.但按照惯例,我这边依然列出如下的问题: 1. SqlSession 是如何被创建的? 每次的数据库操作都会创建一个新的SqlSession么?(也许有很多同学会说SqlSession是通过 SqlSessionFactor…
目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多了一些变化 3.3.1 put 3.3.2 shortKey 3.3.3 Ambiguity 3.3.4 get 一起学 mybatis @ 相关文章推荐 mybatis 缓存的使用, 看这篇就够了 mybatis源码-解析配置文件(四)之配置文件Mapper解析 1. 简介 本文章主要讲解的是,…
在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的一部分配置, 在本文章中, 我们讲解解析mappers节点, 即 xxxMapper.xml 文件的解析. 1 解析入口 在解析 mybatis-config.xml 时, 会进行解析 xxxMapper.xml 的文件. 在图示流程的 XMLConfigBuilder.parse() 函数中, 该…
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉Mybatis框架.我认为有必要分析一下Mybatis的源码.在进行源码分析前,先准备一个简单的工程.如果你还不会使用maven请参考:Maven 创建项目之简单示例,创建一个简单的工程. 开发工具:eclipse jdk版本:1.8 1,创建好的工程目录如下图所示: 2,现在来添加工程的依赖包,配置…