1.MyBatis源码之MyBatis中SQL语句执行过程
2.MyBatis 源码源码解析:映射文件的加载与解析(上)
3.Mybatis源码剖析(懒加载原理)
4.源码分析Mybatis MapperProxy初始化图文并茂
5.为什么 MyBatis 源码中,没有我那种 if···else
6.干掉if else后,模式代码看起来爽多了!源码
MyBatis源码之MyBatis中SQL语句执行过程
MyBatis源码之MyBatis中SQL语句执行过程
MyBatis编程时主要有两种方式执行SQL语句。模式
方式一,源码通过SqlSession接口的模式幽冥传奇完整源码selectList方法调用,进入DefaultSqlSession的源码实现,最终调用executor的模式query方法,使用MappedStatement封装SQL语句。源码
方式二,模式调用SqlSession接口的源码getMapper(Class type)方法,通过工厂创建接口的模式代理对象,调用MapperProxy的源码invoke方法,进一步执行MappedStatement,模式调用sqlSession的源码方法。
创建动态代理类会执行MapperProxy类中的invoke方法,判断方法是否是Object的方法,如果是直接调用,否则执行cachedInvoker()方法,获取缓存中的MapperMethodInvoker,如果没有则创建一个,内部封装了MethodHandler。当cacheInvoker返回了PalinMethodInvoker实例后,调用其invoke方法,执行execute()方法,调用sqlSession的方法。
查询SQL执行流程:调用关系明确,主要步骤包括调用关系。
增删改SQL执行流程:主要步骤清晰,最后执行的都是update方法,因为insert、update、delete都对数据库数据进行改变。执行流程为:
具体的os社区源码执行流程图如下所示。
MyBatis 源码解析:映射文件的加载与解析(上)
MyBatis 的映射文件是其核心组成部分,用于配置 SQL 语句、二级缓存及结果集映射等功能,是其区别于其他 ORM 框架的重要特色。 在解析映射文件时,MyBatis 通过调用 XMLMapperBuilder#parse 方法实现加载与解析操作。此方法首先判断映射文件是否已解析,若未解析则调用 XMLMapperBuilder#configurationElement 方法解析所有配置,并注册当前映射文件关联的 Mapper 接口。对于处理异常的标签,MyBatis 会记录至 Configuration 对象并尝试二次解析。 解析流程主要涉及以下几个关键步骤:缓存配置(cache 标签):MyBatis 采用缓存设计,分为一级缓存和二级缓存。解析 cache 标签时,首先获取相关属性配置,然后使用 CacheBuilder 创建缓存对象,并记录到 Configuration 对象。
缓存引用(cache-ref 标签):标签默认限定在 namespace 范围内,用于引用其它命名空间中的缓存对象。解析过程中记录引用关系,然后从 Configuration 中获取引用的缓存对象。
结果集映射(resultMap 标签):解析 resultMap 标签配置,构建 ResultMap 对象,并将其记录到 Configuration 中。
SQL 语句(sql 标签):通过 sql 标签配置复用的 SQL 语句片段,解析后记录至 Configuration 的 sqlFragments 属性中。
核心数据库操作(select / insert / update / delete 标签):解析这些标签时,构建 MappedStatement 对象并记录到 Configuration 中。
每个标签解析实现由 MyBatis 提供的多个方法执行,如 XMLMapperBuilder 的 configurationElement 方法和解析具体标签的子方法,如 cacheElement、sqlElement 等。解析过程中,仿微 源码MyBatis 会调用不同的构造器和工厂方法来创建、初始化和配置相应的对象。 在解析完成之后,MyBatis 将所有配置对象封装在 Configuration 对象中,该对象包含所有映射文件中定义的配置信息,供后续的 SQL 语句执行和映射操作使用。Mybatis源码剖析(懒加载原理)
懒加载,即按需加载,旨在优化查询性能。以一个包含订单列表的User对象为例,当仅获取用户信息时,若启用懒加载模式,执行SQL不会查询订单列表。需获取订单列表时,才会发起数据库查询。实现方式包括在核心配置文件中设置或在相关映射文件中通过fetchType属性配置懒加载策略。
懒加载的配置如何加载到项目中呢?首先,这些配置保存在全局Configuration对象中,通常在解析核心配置文件的代码中实现。在settingsElement方法中,懒加载配置被保存在lazyLoadingEnabled属性中。对于resultMap标签中collection | association的fetchType属性,其配置通过解析mappers标签下的resultMap标签实现,最终调用buildResultMappingFromContext方法处理子标签。该方法结合全局配置判断是否需要执行懒加载。
懒加载的实现原理涉及动态代理。当调用代理对象的延迟加载属性方法时,如访问a.getB().getName(),代理对象会调用拦截器方法。若发现需要延迟加载,代理对象会单独发送SQL查询关联对象,加载数据后设置属性值,完成方法调用。asp socket源码简而言之,懒加载通过动态代理实现,拦截指定方法并执行数据加载。
深入剖析懒加载源码,会发现它涉及查询和数据处理的多步操作。查询完成后,结果集处理、列值获取、判断是否进行懒加载等步骤共同构建懒加载机制。动态代理在访问对象属性时触发,最终通过Javassist库创建代理对象,实现懒加载逻辑。当访问如userList2.get(0).getOrderList()时,若满足条件,代理对象会调用懒加载查询方法获取数据。判断懒加载条件的关键在于结果集处理阶段,通过访问映射关系和查询映射值来确定是否执行后续懒加载查询。
综上所述,Mybatis的懒加载机制通过动态代理和结果集处理实现,旨在优化性能,按需加载数据,提高查询效率。通过核心配置和映射文件中的配置,懒加载逻辑被加载到项目中,为开发者提供灵活的加载策略。
源码分析Mybatis MapperProxy初始化图文并茂
源码分析Mybatis MapperProxy初始化,本文基于Mybatis.3.x版本,展现作者阅读源码技巧。MapperScannerConfigurer作为Spring整合Mybatis的核心类,负责扫描项目中Dao类,并创建Mybatis的Maper对象即MapperProxy对象。
在项目配置文件中,关注到与Mapper相关的snmp 的源码配置信息。源码分析的行文思路如下,可能会比较枯燥,但先给出MapperProxy的创建序列图,有助于理解。
MapperScannerConfigurer类图,实现Spring Bean生命周期相关功能。核心类及其作用简述如下:
BeanDefinitionRegistryPostProcessor负责设置SqlSessionFactory,生成的Mapper最终受该SqlSessionFactory管辖。
ClassPathMapperScanner的scan方法进行扫描动作,具体实现由ClassPathBeanDefinitionScanner的doScan方法和ClassPathMapperScanner的内部方法共同完成。
ClassPathMapperScanner#doScan方法首先调用父类方法,接着配置文件并构建对应的BeanDefinitionHolder对象。对这些BeanDefinitions进行处理,对Bean进行加工,加入Mybatis特性。
MapperFactoryBean作为创建Mapper的FactoryBean对象,其beanClass为MapperFactoryBean,初始化实例为MapperFactoryBean。在实例化时自动获取SqlSessionFactory或SqlSessionTemplate,用于创建具体的Mapper实例。
MapperFactoryBean的checkDaoConfig方法实现Mapper与Mapper.xml文件的关联注册。MapperRegistry负责管理注册的Mapper,核心类图展示了其关键属性和方法。
MapperRegistry#addMapper方法完成MapperProxy的注册,但实际的MapperProxy创建在getMapper方法中,根据接口获取MapperProxyFactory,调用newInstance创建MapperProxy对象。
至此,Mybatis Mapper的初始化构造过程完成一半,即MapperScannerConfigurer通过包扫描,构建MapperProxy。剩余部分,即MapperProxy与*.Mapper.xml文件中SQL语句的关联流程,将在下一篇文章中详细说明。通过MapperProxy对象的创建,为后续SQL执行流程做准备。
更多文章请关注:线报酱
为什么 MyBatis 源码中,没有我那种 if···else
在 MyBatis 源码中,设计模式的巧妙使用是整个框架的精华,共有约种模式,包括创建型、结构型和行为型模式。
创建型模式包括工厂模式、单例模式和建造者模式。工厂模式用于创建 SqlSessionFactory,单例模式确保 Configuration 的唯一实例,建造者模式将 XML 文件解析到对象中。
结构型模式有适配器模式、代理模式、组合模式和装饰器模式。适配器模式使接口不兼容的对象可以协作,代理模式提供 DAO 接口的实现,组合模式用于 SQL 标签组合,装饰器模式允许在不修改结构的情况下增加行为。
行为型模式包括模板模式、策略模式和迭代器模式。模板模式定义算法框架,策略模式允许算法的替换,迭代器模式遍历集合元素。
总结,MyBatis 源码运用设计模式解决复杂问题,合理切割子问题,学习这些方案技术能提高对设计和实现的理解,扩展编码思维,积累经验,成为优秀工程师和架构师。
干掉if else后,代码看起来爽多了!
今天,我们来深入剖析Mybatis框架中的设计模式,看看它如何巧妙地摆脱if/else的困扰,展现其独特魅力!
Mybatis庞大的2万多行源码中,巧妙运用了多种设计模式来优化工程结构,如创建型模式的工厂设计,如SqlSessionFactory的构建。它通过SqlSessionFactory工厂模式,为我们获取会话提供统一接口,每次数据库操作都会通过这个工厂开启新的会话,其中包含了数据源配置、事务处理和SQL执行器的构建。
另外,Configuration作为单例配置类,采用单例模式确保全局唯一,整合了映射、缓存等众多配置,并在SqlSessionFactoryBuilder构建阶段初始化。ErrorContext、LogFactory和Configuration也是采用类似的单例模式,为框架的稳定运行提供支持。
建造者模式在Mybatis中体现在如XMLConfigBuilder等类,通过逐步构建对象,避免了直接设置属性,保持了代码的清晰和可维护性。日志框架的适配则体现了适配器模式,通过统一接口让不同框架能无缝协作,如对Log4j、Log4j2和Slf4J等的适配。
代理模式在MapperProxy的实现中尤为显著,它作为DAO接口的代理,统一了CRUD方法的调用,简化了业务逻辑。此外,组合模式在SQL配置中体现,通过SqlNode接口构建SQL规则树,组合出各种复杂场景。
行为型模式如模板模式和策略模式在Mybatis中也大显身手,BaseExecutor定义了查询和修改的通用流程,而多类型处理器策略模式则通过TypeHandler实现了不同类型数据的处理策略。
迭代器模式在PropertyTokenizer中体现,用于对象关系的解析,提升了代码的灵活性。总之,Mybatis巧妙地运用了约种设计模式,优化了代码结构,使得代码更加简洁和高效。
深入研究源码不仅有助于理解框架工作原理,还能提升技术理解和实践能力,是成为高级工程师和架构师的重要基石。通过学习这些优秀的设计实践,我们可以更好地应对复杂的技术挑战。
MyBatis源码解析之基础模块—TypeHandler
MyBatis源码解析之基础模块—TypeHandler
在MyBatis的上一章节中,我们探讨了Plugin模块的拦截器配置和自定义。接下来,我们将深入理解数据库与Java对象之间转换的核心机制,即Type模块的源码。 Type模块位于org.apache.ibatis.type,其架构设计包含IntegerTypeHandler和UnknownTypeHandler等实现类,用于处理不同类型的转换。JdbcType枚举定义了常见的数据库数据类型,MappedTypes和MappedJdbcTypes注解用于标注Java类型和数据库类型的映射。 对于类型转换,TypeHandler是核心接口,它定义了处理方法。BaseTypeHandler是抽象基类,采用模板方法模式,提供了通用逻辑,而具体实现由子类如IntegerTypeHandler完成。对于没有明确泛型类型的转换,UnknownTypeHandler则负责处理。 TypeAliasRegister负责注册Java常用数据类型的别名,而TypeHandlerRegister是类型转换器的注册中心,MyBatis在初始化时已经自动注册了常用TypeHandler。ResultSetWrapper则负责包装ResultSet,提供类型转换器的获取,最终由ResultSetHandler处理实际的数据处理。 总结来说,Type模块在MyBatis中负责数据的类型转换,通过TypeHandler和相关的注册机制,确保了数据库操作与Java对象之间的无缝对接。在实际开发中,无需过多配置,MyBatis就能自动完成类型转换,使得开发更为便捷。2万多行MyBatis源码,你知道里面用了多少种设计模式吗?
在MyBatis的两万多行的框架源码中,设计模式的巧妙使用是整个框架的精华。
MyBatis中主要使用了以下设计模式:工厂模式、单例模式、建造者模式、适配器模式、代理模式、组合模式、装饰器模式、模板模式、策略模式和迭代器模式。
具体来说,工厂模式用于SqlSessionFactory的创建,单例模式用于Configuration的管理,建造者模式用于ResultMap的构建,适配器模式用于统一日志接口,代理模式用于MapperProxy的实现,组合模式用于SQL标签的组合,装饰器模式用于二级缓存操作,模板模式用于定义SQL执行流程,策略模式用于多类型处理器的实现,迭代器模式用于字段解析的实现。
通过运用这些设计模式,MyBatis成功地实现了复杂场景的解耦,并将问题合理切割为若干子问题,以提高理解和解决的效率。
总的来说,MyBatis大约运用了种左右的设计模式,这使得框架在处理复杂问题时能够更加高效和灵活。
学习源码不仅可以帮助我们更好地理解设计模式和设计原则,更能够扩展我们的编码思维,积累实际应用的经验。
希望本文的分享能够帮助到您,同时也推荐您阅读《手写MyBatis:渐进式源码实践》一书,了解更多关于MyBatis的知识。