Mybatis源码解析
文章平均质量分 68
等风de帆
这个作者很懒,什么都没留下…
展开
-
0、Mybatis源码环境的搭建
环境准备JDK1.8mybatis的版本3.4.4编辑器idea(或者eclipse)maven数据库脚本/*Navicat MySQL Data TransferSource Server : mysqlSource Server Version : 50045Source Host : 127.0.0.1:3306Source Databas原创 2017-06-16 23:42:30 · 1066 阅读 · 1 评论 -
19、结果集映射之多对一关联映射
多对一多个博客对应一个作者 作者public class Author { private Integer id; private String username; private String password; private String email; private String bio; private String favouriteSection原创 2017-06-27 22:54:41 · 408 阅读 · 0 评论 -
20、结果集映射之一对多关联映射
多对一多个博客对应一个作者 作者public class Author { private Integer id; private String username; private String password; private String email; private String bio; private String favouriteSection原创 2017-06-27 22:55:41 · 620 阅读 · 0 评论 -
21、参数的传递
参数传递mybatis的parameterType标签可以可定义传入的数据类型传入的类型分为以下几类 1. 基本数据类型(包括包装类型、String类型、Date类型) 2. List(Set)、Map 3. 实体类型传入单个参数的示例Dao层的方法 Author selectByPrimaryKey(Integer id);对应的mapper <select id="selectBy原创 2017-06-27 22:56:29 · 523 阅读 · 0 评论 -
22、动态 SQL
动态 SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。if动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:<select id="findA原创 2017-06-27 22:57:51 · 388 阅读 · 0 评论 -
23、Mapper解析之基于注解的总体过程
mapper文件入口加载mapper配置文件的入口在XMLConfigBuilder类中的mapperElement方法mapperElement方法 private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : par原创 2017-06-27 22:59:04 · 953 阅读 · 0 评论 -
25、Result解析之ResultMapping介绍
ResultMapping字段映射 一个ResultMapping实例对应ResultSet中一个字段到javaBean中一个属性的映射关系字段public class ResultMapping { private Configuration configuration; /** * 字段名 */ private String property;原创 2017-06-27 23:00:52 · 3655 阅读 · 0 评论 -
24、映射器注册器MapperRegisty
mapper文件入口加载mapper配置文件的入口在XMLConfigBuilder类中的mapperElement方法mapperElement方法 private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : par原创 2017-06-27 23:00:12 · 583 阅读 · 0 评论 -
26、Result解析之ResultMap(结果集)介绍
ResultMapResultMap(org.apache.ibatis.mapping.ResultMap)类——结果映射。它是结果集中的字段与类中属性的映射关系的集合,也就是结果集与类的映射关系。字段public class ResultMap { private Configuration configuration; //ResultMap的id private St原创 2017-06-27 23:02:59 · 2102 阅读 · 0 评论 -
27、ResultMap解析
ResultMap的解析入口由前面的文章分析,mapper文件的解析都是有XMLMapperBuilder完成的。 public void parse() { if (!configuration.isResourceLoaded(resource)) {//是否加载过此资源 configurationElement(parser.evalNode("/m原创 2017-06-27 23:03:56 · 1150 阅读 · 0 评论 -
28、参数容器ParameterMapping介绍和解析
ParameterMappingParameterMapping的对应的xml内容<parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>字段public class ParameterMapping { private Configurati原创 2017-06-27 23:04:25 · 4696 阅读 · 0 评论 -
29、ParamNameResolver参数解析
处理接口形式的入参在使用MyBatis时,有两种使用方法。 - 一种是使用的接口形式, - 另一种是通过SqlSession调用命名空间。这两种方式在传递参数时是不一样的,命名空间的方式更直接ParamNameResolver主要用来处理接口形式的参数,最后会把参数处放在一个map中map的key为参数的位置,value为参数的名字字段 private static final String原创 2017-06-27 23:05:07 · 1781 阅读 · 0 评论 -
30、SQL片段的解析
sqlFragment可以翻译为sql片段,它的存在价值在于可复用sql片段,避免到处重复编写。sqlFragment的解析过程sqlFragment存储于Configuration内部。protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous原创 2017-06-27 23:05:43 · 702 阅读 · 0 评论 -
31、propertise解析之通用标记解析器与标记处理器
GenericTokenParser通用标记解析器这里的通用标记解析器处理的是SQL脚本中#{parameter}、${parameter}参数,根据给定TokenHandler(标记处理器)来进行处理,TokenHandler是标记真正的处理器,而本篇的解析器只是处理器处理的前提工序——解析,本类重在解析,而非处理,具体的处理会调用具体的TokenHandler的handleToken()方法来完原创 2017-06-27 23:06:21 · 470 阅读 · 0 评论 -
32、解析MetaObject
MetaObjectMetaObject类相当于一个工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。下面来详细分析一下这类。字段 /** *原始的对象 */ private Object originalObject; /** * 原始对象的包装 */ private ObjectWrapper obj原创 2017-06-27 23:06:52 · 2858 阅读 · 0 评论 -
33、SQL解析基础
BoundSqlBoundSql只是一个简单的java对象,有两个属性比较重要 - sql:从解析时可以看出这个sql不是配置文件中的sql,这个sql已经经过了处理(如:占用位符的处理、动态语句的解析if、foreach等待) - parameterObject:客户端执行sql时传入的参数 - parameterMappings: sql中的参数映射对应#{id,jdbcType=INTE原创 2017-06-27 23:07:21 · 869 阅读 · 0 评论 -
34、SqlSource解析
SqlSourceBuilder主要是用来构建SQLSource的,不管是动态SQL还是静态SQL,最后都是调用这个类生成静态sql字段parameterProperties支持的配置项private static final String parameterProperties = "javaType,jdbcType,mode,numericScale,resultMap,typeHandler原创 2017-06-27 23:07:51 · 1729 阅读 · 0 评论 -
18、结果集映射的简单使用
简单的ResultMap配置对应的Author实体类,此实体类已经进行过别名注册package com.lf.entity;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@Data@ToString@NoArgsConstructorpublic class Author { pr原创 2017-06-27 22:54:03 · 572 阅读 · 0 评论 -
17、通用枚举类型处理(二)
问题要是我们一个项目特别大,有几十个甚至是上百个枚举呢,那怎么办,难道我要一个个在typeHandler里面去加,加一百几十行?!个人觉得非常麻烦,影响我们的开发速度,so,能不能实现我们想要的像扫描下枚举的所在的包目录就可以注册的枚举做自动转换呢?具体怎么实现?typeHandler的注册流程具体过程参考15切入点由Cosnfiguration对象得到typeHandlerRegistry管理器,原创 2017-06-26 23:44:21 · 931 阅读 · 0 评论 -
1、mybatis的初始化
MyBatis的初始化做了什么configuration 配置 properties 属性settings 设置typeAliases 类型命名typeHandlers 类型处理器objectFactory 对象工厂plugins 插件environments 环境 environment 环境变量transactionManager 事务管理器dataSource 数据源映原创 2017-06-16 23:43:40 · 529 阅读 · 0 评论 -
2、Configuration详解
Configuration类Configuration类的位置org.apache.ibatis.session.Configuration Configuration类保存了所有Mybatis的配置信息。 。一般情况下Mybatis在运行过程中只会创建一个Configration对象,并且配置信息不能再被修改。Configuration的属性configuration的属性主要分为两大部原创 2017-06-16 23:47:13 · 5840 阅读 · 0 评论 -
3、XMLConfigBuilder的解析过程
XMLConfigBuilder的创建在上一篇SqlSessionFactory的创建的过程中创建了XMLConfigBuilder对象,使用了两种构造函数 public XMLConfigBuilder(Reader reader, String environment, Properties props) { this(new XPathParser(reader, true, pro原创 2017-06-16 23:48:07 · 1011 阅读 · 0 评论 -
4、Configuration构建之properties节点
properties的使用方法。<?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>原创 2017-06-16 23:52:12 · 388 阅读 · 0 评论 -
5、Configuration构建之setting节点介绍
settings下表描述了设置中各项的意图、默认值等。 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关 true false true lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。原创 2017-06-16 23:53:27 · 1503 阅读 · 0 评论 -
6、Configuration构建之setting节点解析
setting元素的判断对于setting元素会先进行判读,是否有非法的值private Properties settingsAsProperties(XNode context) { if (context == null) { return new Properties(); } //得到配置文件setting节点下的所有原创 2017-06-16 23:56:19 · 1494 阅读 · 0 评论 -
7、Configuration构建之typeAliases别名节点解析
typeAliases的配置方法类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:xml <typeAliases> <typeAlias alias="Author" type="com.lf.entity.BlogUser"/> <typeAlias alias="Blog" type="com.lf.enti原创 2017-06-17 00:17:58 · 1326 阅读 · 0 评论 -
8、插件(plugins)拦截器的配置详解
Mybatis拦截器的介绍MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: - Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) - ParameterHandler (getPar原创 2017-06-26 22:56:29 · 648 阅读 · 0 评论 -
9、Mybatis拦截器的源码分析
调用流程Mybatis3 插件采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的)。 调用的流程大致分为三个阶段 1. 读取配置文件的plugin配置 2. 调用intercept链 3. intercept链生成代理对象(重要)读取配置文件配置文件的读取还是XMLConfigBuilder类中的方法 private原创 2017-06-26 22:57:19 · 437 阅读 · 0 评论 -
10、自定义mybatis的plugin拦截器
利用mybatis的拦截器,拦截其他的方法在上一篇中我知道拦截器的入口在InterceptorChain中的putAll, 由putAll方法生成对象的代理,由代理的对象执行对象的方法。 因此只要得到InterceptorChain对象,则一切就可以解决了。 Configuration没有提供interceptorChain属性的get方法。因此需要修改源码,为interceptorChain原创 2017-06-26 22:58:59 · 2516 阅读 · 0 评论 -
11、配置环境(environments)
环境的作用yBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。所以,如果你想连接两个数据库,就需要创原创 2017-06-26 23:23:34 · 2225 阅读 · 0 评论 -
12、databaseIdProvider多数据库支持
databaseIdProvider官方描述MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 为支持多厂商特性只要原创 2017-06-26 23:24:16 · 2612 阅读 · 0 评论 -
13、类型转换(TypeHandler)介绍
Mybatis中的TypeHandler是什么无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的Typ原创 2017-06-26 23:27:56 · 3546 阅读 · 0 评论 -
14、自定义TypeHandler之String转换为list
mybatis为我们实现了那么多TypeHandler, 随便打开一个TypeHandler,看其源码,都可以看到,它继承自一个抽象类:BaseTypeHandler, 那么我们是不是也能通过继承BaseTypeHandler,从而实现自定义的TypeHandler ? 答案是肯定的, 那么现在下面就为大家演示一下自定义TypeHandler:StringToListTypeHandlerpack原创 2017-06-26 23:40:29 · 7179 阅读 · 3 评论 -
15、处理枚举类型
官方介绍若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用。比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,原创 2017-06-26 23:41:59 · 700 阅读 · 0 评论 -
16、通用枚举类型处理(一)
官方介绍若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用。比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,原创 2017-06-26 23:43:25 · 2450 阅读 · 0 评论 -
35、MapperMethod映射器方法.
MapperMethod:映射器方法映射器方法是最底层的被调用者,同时也是binding模块中最复杂的内容。它是MyBatis中对SqlSession会话操作的封装,那么这意味着什么呢?意味着这个类可以看做是整个MyBatis中数据库操作的枢纽,所有的数据库操作都需要经过它来得以实现。 我们单独使用MyBatis时,有时会直接操作SqlSession会话进行数据库操作,但是在SSM整合之后,这个数原创 2017-06-27 23:08:28 · 1343 阅读 · 0 评论