最近没什么事,花了一周的时间把mybatis源码看完了,现自我总结一下,尽可能的用一句话总结,方便自己理解和回顾。
出名的框架几乎都是从初始化配置文件开始的,mybatis也一样。
mybatis的配置文件是通过工具类XMLConfigBuilder,XMLMapperBuilder,XMLStatementBuilder解析后都存在Configuration中
private void parseConfiguration(XNode root) {
try {
propertiesElement(root.evalNode("properties")); //issue #117 read properties first
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
settingsElement(root.evalNode("settings"));
environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
public class Configuration {
protected Environment environment;
protected boolean safeRowBoundsEnabled = false;
protected boolean safeResultHandlerEnabled = true;
protected boolean mapUnderscoreToCamelCase = false;
protected boolean aggressiveLazyLoading = true;
protected boolean multipleResultSetsEnabled = true;
protected boolean useGeneratedKeys = false;
protected boolean useColumnLabel = true;
//二级缓存开关,直接决定sqlSession是否启用CachingExecutor
protected boolean cacheEnabled = true;
protected boolean callSettersOnNulls = false;
protected String logPrefix;
protected Class <? extends Log> logImpl;
//一级缓存的默认作用域
protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION;
protected JdbcType jdbcTypeForNull = JdbcType.OTHER;
protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[] { "equals", "clone", "hashCode", "toString" }));
protected Integer defaultStatementTimeout;
protected Integer defaultFetchSize;
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;
//config配置文件Properties标签的数据存储 -----全局属性配置对象
protected Properties variables = new Properties();
protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
//config配置文件objectFactory标签的数据存储
protected ObjectFactory objectFactory = new DefaultObjectFactory();
protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();
//maper接口的存储容器, mybatis访问数据库的动态代理接口,MapperProxyFactory 是经典的C/S架构客户端同步访问实现
protected MapperRegistry mapperRegistry = new MapperRegistry(this);
protected boolean lazyLoadingEnabled = false;
protected ProxyFactory proxyFactory = new JavassistProxyFactory(); // #224 Using internal Javassist instead of OGNL
//数据源 id
protected String databaseId;
/**
* Configuration factory class.
* Used to create Configuration for loading deserialized unread properties.
*
* @see <a href='https://code.google.com/p/mybatis/issues/detail?id=300'>Issue 300</a> (google code)
*/
protected Class<?> configurationFactory;
//插件,可以在核心业务逻辑处理类“statementHandler”中增加sql解析,sql路由等等功能
protected final InterceptorChain interceptorChain = new InterceptorChain();
//config配置文件typeHandler标签的数据容器
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
//config配置文件typeAlias标签的数据容器 ---别名对应容器
protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
//language容器
protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
//mapper配置文件的数据容器
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
//缓存容器
protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
//resultMap容器,思考:抛弃ORM设计思想, 还可以通过JDBC的ResultSet相关方法组装成map对象返回,不需要resultSetHandler.<E>handleResultSets(statement)。
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
//输入参数类型容器
protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
//主键生成器容器
protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");
protected final Set<String> loadedResources = new HashSet<String>();
protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous mappers");
//异常数据容器
protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
//异常数据容器
protected final Collection<CacheRefResolver> incompleteCacheRefs = new LinkedList<CacheRefResolver>();
//异常数据容器
protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
//异常数据容器
protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
/*
* A map holds cache-ref relationship. The key is the namespace that
* references a cache bound to another namespace and the value is the
* namespace which the actual cache is bound to.
*/
protected final Map<String, String> cacheRefMap = new HashMap<String, String>();
分享到:
相关推荐
1. `mybatis-generator-core-1.3.2.jar`:MBG 的核心库,包含所有实现代码生成功能的类和接口。 2. `lib` 目录:可能包含 MBG 运行时依赖的第三方库,如 JDBC 驱动等。 3. `README` 或 `doc` 文件:提供关于如何使用...
1. **SqlSessionFactoryBuilder**: 用于构建SqlSessionFactory,它是MyBatis的核心工厂类,可以创建SqlSessionFactory实例,通常在应用程序启动时初始化。 2. **SqlSessionFactory**: 提供SqlSession的创建,...
1. **配置文件解析**:MyBatis的核心配置文件`mybatis-config.xml`定义了数据源、事务管理器、Mappers等关键元素。通过`XMLConfigBuilder`解析这些配置,构建出`Configuration`对象,它是整个MyBatis框架的中心。 2...
1. **Configuration**:这是MyBatis的全局配置,包含了数据库连接信息、映射文件位置、事务管理器等。解析XML配置文件后,所有的配置信息都会被加载到这个类中。 2. **Executor**:执行器负责执行SQL,它是MyBatis...
通过对MyBatis源码的学习,我们可以了解到MyBatis如何解析配置,如何构建SQL,如何处理参数和结果,以及如何利用缓存提高性能。这对于理解和优化MyBatis的应用,甚至开发自己的持久层框架都有极大的帮助。在阅读源码...
XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,该方法负责解析 MyBatis 的配置文件,包括属性解析、加载 settings 节点、加载自定义 VFS、解析类型别名、加载插件、加载对象工厂、创建对象...
本篇文章将深入探讨MyBatis3的核心概念、设计模式以及关键源码。 1. **核心概念** - **SqlSession**: MyBatis的主要工作接口,用于执行SQL语句,提供增删查改等操作。 - **Mapper**: 映射器接口,定义了SQL操作的...
在深入源码之前,我们需要理解MyBatis的核心概念和组成部分: 1. **SqlSessionFactory**: 这是MyBatis的核心,用于创建SqlSession对象。SqlSessionFactory是线程安全的,可以在应用的整个生命周期内保持单例。 2. ...
4. **MyBatis源码解析**:尽管"19-MyBatis源码—SQL操作执行流程源码深度剖析-徐庶"和"12-Spring之整合Mybatis底层源码解析-周瑜"主要关注MyBatis,但这两部分也是Spring生态的重要组成部分。我们将学习Spring如何与...
对于源码阅读,你可以深入了解MyBatis的源码,理解其内部的工作机制,比如SqlSession、Executor、ParameterHandler、ResultSetHandler等组件是如何协同工作的,这有助于提升你的Java和数据库编程技能。
2. **Configuration**:这是MyBatis的核心配置类,包含了所有的配置信息,如数据源、Mappers、设置等。SqlSessionFactoryBuilder会根据传入的配置信息创建Configuration实例。 3. **SqlSessionFactory**:...
3. **Configuration**: Configuration对象存储了MyBatis的所有配置,包括映射文件、参数类型处理器、插件、环境等。它是MyBatis全局配置的载体。 4. **MapperRegistry**: 该类管理所有Mapper接口和它们对应的XML...
3. **配置MyBatis的配置文件**:SqlSessionFactoryBean还允许你指定MyBatis的配置文件路径,这个文件包含了MyBatis的全局配置,比如映射文件的位置、环境设置等。 4. **创建Mapper接口**:MyBatis-Spring支持使用...
《深入剖析Mybatis源码:2022.9.26更新》 在软件开发领域,Mybatis作为一款优秀的持久层框架,以其简洁、灵活的特性深受开发者喜爱。了解并掌握Mybatis的源码,不仅可以帮助我们更好地利用这个框架,还能提升我们的...
通过阅读`mybatis-3-master`源码,我们可以深入了解MyBatis的内部机制,如其对AOP(面向切面编程)的运用、线程安全的设计、以及如何高效地执行SQL等。这对于我们优化自己的MyBatis应用,解决性能问题,或者进行扩展...
本篇文章将基于阿里巴巴P7架构师纯手工打造的MyBatis源码解析资料,深入探讨MyBatis的核心原理及其内部实现机制。本文旨在帮助读者理解MyBatis的工作原理,并为日后进行更深层次的技术研究提供一定的理论基础。 ###...
- **创建 Mybatis 配置类**:如果使用 Spring Boot 的自动配置,通常无需额外配置 Mybatis,但如果需要自定义配置,可以创建一个配置类,并使用 `@Configuration` 和 `@MapperScan` 注解。 - **Mapper 接口与 XML ...
1. **SqlSessionFactoryBuilder**: 这是构建 SqlSessionFactory 的工厂类,SqlSessionFactory 是 MyBatis 的核心对象,负责创建 SqlSession,进而执行 SQL 语句。 2. **Configuration**: 配置类,存储了 MyBatis 的...
在Configuration类中,我们可以看到拦截器如何被应用到这些关键组件上: - `newParameterHandler()`、`newResultSetHandler()`和`newStatementHandler()`这三个方法分别用于创建新的ParameterHandler、...
在分析MyBatis源码时,可以采用宏观和微观两种视角。宏观上理解整个框架的架构和流程,微观上深入到具体的类和方法,通过阅读和调试代码来理解其实现细节。同时,绘制流程图或UML图能帮助更好地梳理组件间的交互。 ...