- 博客(363)
- 收藏
- 关注
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-10. 责任链模式
MyBatis插件机制采用责任链模式,通过InterceptorChain将多个Interceptor串联成调用链。每个Interceptor通过实现接口并声明拦截目标,由Plugin动态代理生成多层代理对象。调用时遵循后进先出原则,通过Invocation.proceed()控制流程传递。源码分析显示,MyBatis初始化阶段注册插件,创建核心对象时调用pluginAll生成代理链,最终通过Plugin.invoke实现链式调用。这种设计实现了对Executor等核心组件的方法拦截,支持灵活的功能扩展。
2026-05-10 08:30:00
49
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-9. 迭代器模式
MyBatis 中迭代器模式的两种典型实现:PropertyTokenizer 和 Cursor。PropertyTokenizer 用于递归解析嵌套属性路径(如"order.items[0].name"),通过实现 Iterator 接口将路径分解为层级结构。Cursor 接口则支持大数据集的流式查询,避免内存溢出。文章通过 UML 类图和源码分析,展示了 PropertyTokenizer 如何通过 next() 方法递归创建新实例处理子路径,以及 Cursor 如何实现 Itera
2026-05-09 19:17:16
252
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-8. 组合模式
MyBatis 动态 SQL 解析采用组合模式实现,将 SQL 节点组织成树形结构。核心接口 SqlNode 定义统一操作,MixedSqlNode 作为组合节点管理子节点集合,IfSqlNode、WhereSqlNode 等作为叶子或复合节点。运行时通过递归调用 apply() 方法生成最终 SQL,其中 MixedSqlNode 遍历子节点,IfSqlNode 条件判断执行子节点,ForEachSqlNode 循环处理子节点。这种设计使动态 SQL 的解析执行具有高度灵活性和扩展性,完美体现了组合模式&
2026-05-09 18:58:40
109
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-7. 迭代器模式
MyBatis 中迭代器模式的典型应用主要体现在 PropertyTokenizer 类和 Cursor 接口。PropertyTokenizer 通过实现 Iterator 接口,递归解析嵌套属性路径(如 "user.address.city"),每次调用 next() 返回下一层级的解析结果。Cursor 接口则提供数据库结果集的流式遍历能力,支持迭代器风格的访问方式。这两种实现都遵循迭代器模式的核心思想:在不暴露内部结构的前提下,提供顺序访问聚合对象元素的能力。PropertyTo
2026-05-08 20:09:38
323
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-6. 装饰者模式
MyBatis 二级缓存机制是装饰者模式的典型应用。通过实现统一的 Cache 接口,MyBatis 使用多个装饰器类(如 LruCache、BlockingCache 等)层层包装基础缓存 PerpetualCache,动态添加 LRU 淘汰、阻塞访问等功能。这种设计实现了功能扩展与核心逻辑的解耦,各装饰器可自由组合,既保持了接口一致性,又提供了灵活的缓存策略配置。装饰者模式避免了继承带来的类膨胀问题,通过对象组合方式实现了功能的动态叠加,是 MyBatis 缓存系统的重要设计基础。
2026-05-08 20:06:30
236
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-5.模板方法模式
MyBatis 中模板方法模式的应用 MyBatis 框架巧妙地运用了模板方法模式,通过抽象类定义算法骨架,将具体实现延迟到子类。在 BaseExecutor 中,模板方法如 query 和 update 固定了执行流程(缓存处理、事务管理等),而真正的数据库操作通过抽象方法 doQuery 和 doUpdate 由子类实现。这种设计实现了: 代码复用:公共逻辑集中在基类 灵活扩展:子类可自定义特定步骤 结构清晰:分离不变部分与可变部分 典型应用还包括 BaseStatementHandler 和 Base
2026-05-07 18:51:28
520
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-4.代理模式
MyBatis代理模式应用解析 MyBatis核心运用了代理模式实现三大功能: Mapper接口动态代理:通过MapperProxy将接口方法调用转发给SqlSession 延迟加载代理:使用Javassist/CGLIB生成实体代理实现关联对象按需加载 插件拦截机制:通过动态代理在四大组件外围添加拦截逻辑 典型实现结构: 代理对象:MapperProxy/ProxyFactory生成 真实对象:SqlSession/实体对象 控制方式:JDK动态代理(接口)和CGLIB(类) 这种设计实现了接口与实现的解
2026-05-07 18:43:49
402
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-3.单例模式
MyBatis 单例模式应用解析 MyBatis 中巧妙运用单例模式管理核心组件,确保全局唯一性和高效访问。主要实现方式包括: 线程级单例:ErrorContext 通过 ThreadLocal 实现线程隔离的错误上下文管理,每个线程维护独立实例。 饿汉式单例:LogFactory 在类加载时静态初始化日志适配器,全局唯一且线程安全。 静态内部类:VFS 采用延迟加载的静态内部类实现文件系统访问的单例。 典型应用场景: 错误处理(ErrorContext) 日志适配(LogFactory) 资源扫描(VFS
2026-05-06 10:10:00
318
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-2.工厂模式
MyBatis 中工厂模式的应用解析 摘要:MyBatis 框架中广泛运用工厂模式来解耦对象创建过程,主要包括 SqlSessionFactory、ObjectFactory 等核心组件。SqlSessionFactory 采用抽象工厂模式创建包含事务和执行器的 SqlSession 对象,而 ObjectFactory 使用工厂方法模式生成结果对象和参数对象。这些工厂接口通过统一的对象创建入口,隐藏了具体实现细节,提高了系统的灵活性和可扩展性。通过分析 DefaultSqlSessionFactory 和
2026-05-06 10:07:49
255
原创 【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-1.构建者模式
MyBatis中的构建者模式应用 摘要:MyBatis广泛使用构建者模式来创建配置对象和SQL映射对象。该模式将复杂对象的构建过程与表示分离,通过链式调用简化对象创建。典型应用包括SqlSessionFactoryBuilder、XMLConfigBuilder等类,它们通过内部Builder类逐步设置属性并最终构建不可变对象。以MappedStatement.Builder为例,它使用静态内部类实现链式调用,包含多个属性设置方法,最后通过build()方法创建完整对象。这种设计提高了代码可读性和扩展性,是
2026-05-05 17:02:04
253
原创 【12.MyBatis源码剖析与架构实战】14. 全局配置源码剖析
MyBatis全局配置源码解析 本文深入剖析了MyBatis全局配置的核心机制,主要包含以下关键点: Configuration类是MyBatis的核心容器,管理着框架的所有配置信息,包括数据源、事务工厂、映射器注册等核心组件。 配置解析流程从SqlSessionFactoryBuilder开始,通过XMLConfigBuilder解析配置文件,构建Configuration对象。 源码展示了Configuration类的核心结构和属性,包括环境配置、缓存设置、类型处理器等重要组件。 详细解析了XML配置文
2026-05-05 16:58:40
235
原创 【12.MyBatis源码剖析与架构实战】13.Select注解源码剖析-@Select 注解的处理流程
解析为ParameterMapping,最终生成 StaticSqlSource`。该过程在初始化阶段完成,运行时无需额外解析。 DynamicSqlSource:运行时调用 getBoundSql 方法动态拼接 SQL。通过 DynamicContext 处理 ${} 变量替换,最终生成包含完整 SQL 和参数映射的 BoundSql 对象。 3.6 MappedStatement 注册 public MappedStatement addMappedStatement( String id, SqlSo
2026-05-04 16:11:04
124
原创 【12.MyBatis源码剖析与架构实战】13. Select注解源码剖析-@Select注解介绍
MyBatis @Select 注解解析机制分析 MyBatis 通过 @Select 注解实现 SQL 语句的声明式配置。本文分析了其核心处理流程: 注解定义:@Select 接受字符串数组作为 SQL 语句,支持动态 SQL 标签(以 <script> 开头) 解析流程: MapperAnnotationBuilder 扫描接口方法 通过反射获取注解值并拼接 SQL XMLLanguageDriver 处理 SQL 字符串 处理策略: 静态 SQL 转为 RawSqlSource 动态 SQ
2026-05-04 15:30:05
397
原创 【12.MyBatis源码剖析与架构实战】12.SqlSource解析源码剖析-parseDynamicTags⽅法
本文剖析了MyBatis中parseDynamicTags方法的源码实现,该方法负责将XML映射文件中的SQL语句(包含动态标签和占位符)解析为SqlNode树结构。文章详细分析了方法的执行流程:处理文本节点时区分StaticTextSqlNode和TextSqlNode;处理元素节点时通过NodeHandler体系递归解析;并解释了isDynamic标志的判断逻辑。通过示例展示了<if>、<where>等动态标签的递归解析过程,揭示了MyBatis将XML SQL转换为可执行语句的
2026-04-30 19:56:42
420
原创 【12.MyBatis源码剖析与架构实战】12.SqlSource解析源码剖析-XML映射解析⽅式
本文深入解析了 MyBatis 中 XML 映射文件如何被解析为 SqlSource 对象的过程。主要内容包括: XMLMapperBuilder 作为入口解析 Mapper 文件,处理 SQL 语句节点 XMLStatementBuilder 解析 SQL 节点属性并创建 MappedStatement XMLScriptBuilder 的核心作用:将 SQL 节点内容转换为 SqlSource parseDynamicTags 方法如何构建 SqlNode 树,处理文本节点和动态标签 NodeHandl
2026-04-30 19:54:14
388
原创 【12.MyBatis源码剖析与架构实战】12.SqlSource解析源码剖析-注解的解析⽅式
摘要:本文深入分析了MyBatis注解方式下SqlSource的解析过程。核心流程包括:1)Mapper接口注册时通过MapperAnnotationBuilder解析注解;2)parseStatement方法处理SQL注解,构建SqlSource;3)根据@Select等注解类型调用LanguageDriver创建SQL源。注解方式与XML配置类似,最终都会生成MappedStatement注册到配置中,但注解解析更直接,适合简单SQL场景。同时支持与XML配置共存,XML具有更高优先级。
2026-04-29 23:59:20
293
原创 【12.MyBatis源码剖析与架构实战】12.SqlSource解析源码剖析-MyBatis初始化流程
MyBatis在初始化阶段通过XMLScriptBuilder解析SQL节点,生成SqlSource对象。核心流程包括:解析SQL文本和动态标签构建MixedSqlNode树,根据是否包含动态内容创建DynamicSqlSource或RawSqlSource。文本节点通过TextSqlNode/StaticTextSqlNode处理,动态标签由对应的NodeHandler解析为特定SqlNode实现类(如IfSqlNode)。最终形成的SqlNode树结构在运行时生成完整SQL。该过程完成了SQL从XML配
2026-04-29 23:57:47
405
原创 【12.MyBatis源码剖析与架构实战】11.嵌套查询循环引⽤源码剖析
MyBatis嵌套查询循环引用问题通过一级缓存和加载状态标记解决。当两个实体相互引用(如User↔Address)时,MyBatis利用SqlSession的localCache存储已创建对象,通过CacheKey唯一标识。在对象构建过程中,若检测到相同主键的缓存对象则直接复用,避免无限递归。同时ResultLoaderMap管理加载状态,确保同一属性不会重复加载。该机制使得循环引用能够正确建立,既保证了对象完整性,又防止了栈溢出问题,最终形成合理的对象关联结构。
2026-04-27 23:49:50
415
原创 【12.MyBatis源码剖析与架构实战】10.嵌套查询映射源码剖析
摘要 本文深度剖析了MyBatis中嵌套查询映射的实现机制。通过分析核心类如DefaultResultSetHandler、ResultLoader和ResultMapping等,揭示了MyBatis如何通过<association>或<collection>元素的select属性实现关联查询。文章详细解析了从主查询结果集处理到嵌套查询触发的完整流程,包括延迟加载的实现原理,并展示了关键源码片段如applyPropertyMappings方法和getNestedQueryMappin
2026-04-27 23:46:41
405
原创 【12.MyBatis源码剖析与架构实战】9.延迟加载源码剖析
MyBatis 延迟加载源码解析 MyBatis 的延迟加载通过代理机制实现,当关联查询配置为 lazy 时,会生成代理对象而非立即执行查询。核心流程包括: 配置阶段:通过 lazyLoadingEnabled 全局开关或 fetchType 局部配置启用延迟加载 解析阶段:XMLMapperBuilder 解析 resultMap 时标记 nestedQueryId 执行阶段:DefaultResultSetHandler 创建 ResultLoaderMap 记录待加载属性 代理阶段:ProxyFact
2026-04-26 17:19:45
372
原创 【12.MyBatis源码剖析与架构实战】8.二级缓存源码剖析
MyBatis 二级缓存机制深度解析:通过 CachingExecutor 和 TransactionalCache 实现跨 SqlSession 的命名空间级缓存。核心包括 Cache 接口、PerpetualCache 基础实现、事务性缓存装饰器及缓存与事务的协同。查询时先检查缓存,未命中则查询数据库并暂存结果;增删改操作自动清空缓存,通过 TransactionalCache 延迟提交避免脏读。支持自定义缓存实现,需注意事务隔离性。全文详细剖析了二级缓存的架构设计、核心组件交互及源码实现细节。
2026-04-26 17:17:09
387
原创 【12.MyBatis源码剖析与架构实战】7.一级缓存源码剖析
本文深入剖析了MyBatis一级缓存的实现原理。一级缓存是SqlSession级别的缓存,默认开启,核心由PerpetualCache实现,底层使用HashMap存储。CacheKey通过MappedStatement ID、SQL语句、参数值等生成唯一标识。BaseExecutor负责缓存的核心逻辑:查询时先检查缓存,未命中则查询数据库并缓存结果;增删改操作会清空缓存。缓存作用域可配置为SESSION(默认)或STATEMENT。关键点包括flushCache属性控制缓存清空、queryStack处理嵌套
2026-04-25 19:40:02
383
原创 【12.MyBatis源码剖析与架构实战】6.3 MetaObject源码剖析-setValue⽅法
MyBatis MetaObject.setValue 方法源码分析 摘要:本文深入分析了MyBatis中MetaObject.setValue方法的实现机制。该方法通过ObjectWrapper接口实现对不同类型对象(Bean、Map、Collection)的属性赋值操作,支持嵌套路径解析和自动对象创建。核心流程包括:1)使用PropertyTokenizer解析属性路径;2)递归处理嵌套属性;3)自动创建中间对象;4)处理集合/数组索引赋值。特别值得注意的是,对于List类型会自动扩展容量,对于Map支
2026-04-25 19:37:59
335
原创 【12.MyBatis源码剖析与架构实战】6.2 MetaObject源码剖析-getValue⽅法
MyBatis MetaObject.getValue 方法解析 MyBatis的MetaObject.getValue方法通过路径表达式(如user.address.city)从对象中获取属性值。该方法将操作委托给ObjectWrapper实现类,根据对象类型不同分为BeanWrapper、MapWrapper和CollectionWrapper。 核心解析由PropertyTokenizer完成,支持.和[]两种分隔符处理属性链和数组/集合索引。BeanWrapper.get方法通过递归方式处理嵌套属性
2026-04-23 20:22:41
360
原创 【12.MyBatis源码剖析与架构实战】6.1 MetaObject源码剖析-forObject⽅法
本文深入剖析了MyBatis中MetaObject.forObject方法的源码实现。MetaObject作为对象元数据操作工具,通过ObjectWrapper统一了不同对象类型(JavaBean、Map、Collection)的属性访问接口。核心要点包括:1)MetaObject采用委托模式,将具体操作交给ObjectWrapper实现类;2)forObject方法通过判断对象类型创建对应的包装器;3)BeanWrapper内部使用MetaClass和Reflector缓存反射信息以提高性能。该设计实现了
2026-04-23 20:19:50
339
原创 【12.MyBatis源码剖析与架构实战】5.参数转换和映射源码剖析
MyBatis参数转换与结果映射源码解析 本文深入剖析MyBatis核心功能:参数转换将Java方法参数转为JDBC参数值,结果映射将ResultSet转为Java对象。参数转换通过ParamNameResolver解析参数名和顺序,生成参数Map或单一值,再通过TypeHandler设置到PreparedStatement。结果映射通过ResultSetWrapper包装数据,根据ResultMap解析行数据,使用TypeHandler读取列值并设置属性,处理嵌套映射后返回对象列表。关键点包括参数名优先级
2026-04-22 23:23:38
451
原创 【12.MyBatis源码剖析与架构实战】4.MapperProxy源码剖析
MyBatis MapperProxy 源码解析 MapperProxy是MyBatis实现Mapper接口动态代理的核心类,通过JDK动态代理机制将接口方法调用转换为数据库操作。其核心流程为: 代理工厂:MapperProxyFactory为每个Mapper接口创建代理实例,并缓存方法元数据 代理拦截:MapperProxy拦截方法调用,跳过Object类方法 方法解析:通过MapperMethod封装SQL命令和方法签名信息 执行转换:将方法调用转换为SqlSession的具体操作 关键优化点包括方法缓
2026-04-22 23:21:01
356
原创 【12.MyBatis源码剖析与架构实战】3.Executor源码剖析
本文深入剖析了MyBatis核心组件Executor的源码实现。Executor作为SQL执行和缓存管理的核心接口,其继承体系包含BaseExecutor抽象模板类及其三个具体实现:SimpleExecutor、ReuseExecutor和BatchExecutor,以及用于二级缓存的CachingExecutor。BaseExecutor通过模板方法模式实现了公共逻辑,包括一级缓存管理(PerpetualCache localCache)、事务状态维护和延迟加载处理。其中query方法详细展示了一级缓存的
2026-04-21 23:24:04
383
原创 【12.MyBatis源码剖析与架构实战】2.SqlSession源码剖析
MyBatis SqlSession源码解析:核心接口与执行流程 本文深入分析了MyBatis中SqlSession的核心实现机制。SqlSession作为MyBatis的核心接口,提供了数据库操作的基础API,包括查询、增删改、事务控制等方法。通过DefaultSqlSession的实现,我们看到其内部通过Executor执行器来完成具体SQL操作,同时依赖Configuration管理全局配置。文章详细剖析了SqlSession的创建过程、核心属性以及selectList等关键方法的实现原理,揭示了My
2026-04-21 23:21:20
374
原创 【12.MyBatis源码剖析与架构实战】1.核⼼流程源码剖析
本文剖析了MyBatis框架的核心流程,主要分为初始化阶段和执行阶段。初始化阶段通过SqlSessionFactoryBuilder解析配置文件,构建Configuration对象和SqlSessionFactory。XMLConfigBuilder负责解析mybatis-config.xml配置文件,构建包含所有配置信息的Configuration容器类。XMLMapperBuilder则解析Mapper文件,构建MappedStatement对象。执行阶段通过SqlSession执行SQL语句,完成数据
2026-04-20 23:42:47
702
原创 【12.MyBatis源码剖析与架构实战】19.MyBatis分⻚插件设计与实战
MyBatis分页插件设计与实现摘要 本文详细介绍了一个基于MyBatis插件机制实现的透明物理分页解决方案。该插件通过拦截Executor.query方法,自动将普通查询转换为分页查询,主要特点包括: 非侵入式设计:通过ThreadLocal传递分页参数,无需修改Mapper接口和XML配置 多数据库支持:通过方言模式适配MySQL、Oracle等不同数据库的分页语法 完整功能实现: 自动生成COUNT查询获取总记录数 根据分页参数重写原始SQL 返回包含分页信息和数据的统一Page对象 核心实现包含:
2026-04-20 23:37:44
463
原创 【12.MyBatis源码剖析与架构实战】18.MyBatis插件的实现机制
MyBatis插件机制通过责任链模式与JDK动态代理实现,允许拦截四大核心组件(Executor、StatementHandler等)的方法调用。其核心流程分为三阶段:初始化时加载插件配置并存入InterceptorChain;创建目标对象时通过pluginAll方法构建多层代理链;方法调用时触发拦截器链式执行。关键类包括Interceptor接口、@Intercepts注解和Plugin代理类,通过动态代理在方法调用前后插入自定义逻辑,无需修改框架源码。插件执行顺序与配置顺序一致,形成嵌套代理结构。
2026-04-19 15:52:28
404
原创 【12.MyBatis源码剖析与架构实战】17.MyBatis插件的执⾏流程
MyBatis插件通过拦截器链和动态代理机制实现对核心对象的拦截增强。其执行流程分为初始化阶段(解析配置文件并按顺序注册拦截器)和执行阶段(创建代理对象链并按后进先出顺序调用拦截方法)。核心组件包括Interceptor接口、@Intercepts注解、InterceptorChain和Plugin工具类。开发插件时需注意执行顺序、避免匿名类、精确控制拦截范围,并可通过MappedStatement ID进行过滤。理解这一机制可以灵活开发性能监控、数据加密等高级插件。
2026-04-19 15:48:07
250
原创 【12.MyBatis源码剖析与架构实战】16.2 if和where标签执⾏过程剖析-执行数据库时
MyBatis 执行阶段 foreach 标签处理流程解析 MyBatis 在执行 SQL 阶段,ForEachSqlNode 负责处理 foreach 标签的动态 SQL 生成。其核心流程为:首先通过 OGNL 解析集合参数,若集合非空则依次处理 open 前缀、集合元素遍历(含分隔符处理)、close 后缀。遍历过程中会为每个元素创建特殊上下文,绑定 index/item 变量供内部 SQL 片段使用,并递归处理嵌套内容。最终生成的 SQL 片段会与其他静态/动态部分合并,经参数占位符解析后形成完整 B
2026-04-18 23:49:00
340
原创 【12.MyBatis源码剖析与架构实战】16.1 if和where标签执⾏过程剖析-MyBatis初始化时
MyBatis 初始化阶段,foreach 标签会被 XMLScriptBuilder 解析为 ForEachSqlNode 对象。解析过程采用策略模式,通过 NodeHandler 递归处理动态标签。ForEachHandler 负责解析 foreach 标签,获取 collection、item 等属性,并递归处理内部 SQL 片段,最终构建 ForEachSqlNode 对象加入 SQL 语法树。整个过程支持嵌套动态标签,确保 foreach 标签的完整解析和初始化。
2026-04-18 23:41:20
224
原创 【12.MyBatis源码剖析与架构实战】15.2 if和where标签执⾏过程剖析-执⾏数据库操作
MyBatis动态SQL执行机制摘要 MyBatis通过SqlNode语法树实现动态SQL拼接,核心流程分为四步:1)创建DynamicContext作为SQL拼接工作区;2)递归遍历SqlNode树处理条件判断(IfSqlNode)和智能修剪(WhereSqlNode);3)解析#{}占位符;4)生成最终BoundSql对象。其中IfSqlNode通过OGNL表达式评估条件决定SQL片段是否保留,WhereSqlNode则负责智能处理AND/OR前缀。整个过程在DynamicSqlSource的getBo
2026-04-17 21:11:59
267
原创 【12.MyBatis源码剖析与架构实战】15.1 if和where标签执⾏过程剖析-初始化时
本文剖析了MyBatis中<if>和<where>标签的解析机制。在初始化阶段,XMLScriptBuilder.parseDynamicTags()方法将SQL节点解析为SqlNode对象树。关键点包括:1)通过NodeHandler注册机制实现标签处理的可扩展性;2)WhereHandler将<where>标签转换为WhereSqlNode,自动处理前缀逻辑;3)IfHandler解析<if>标签为IfSqlNode,运行时评估test表达式。最终构建的语
2026-04-17 21:06:41
383
原创 【12.MyBatis源码剖析与架构实战】14.SqlNode语法树结构剖析
MyBatis 动态 SQL 通过 SqlNode 语法树实现,采用组合模式组织各标签节点(如 IfSqlNode、ForEachSqlNode)。每个节点实现 apply 方法,通过 DynamicContext 共享上下文拼接 SQL 语句。ExpressionEvaluator 负责解析 OGNL 表达式。该机制实现了动态 SQL 的灵活构建。
2026-04-16 23:18:34
693
原创 【12.MyBatis源码剖析与架构实战】13.3 SqlSource创建和解析
摘要: SqlSource是MyBatis框架中解析SQL语句的核心组件,通过XML或注解配置创建,运行时动态生成可执行SQL。其四种实现类分别处理不同场景:DynamicSqlSource处理含动态标签或${}的SQL;RawSqlSource处理仅含#{}的非动态SQL;StaticSqlSource存储最终静态SQL;ProviderSqlSource处理注解配置的SQL。创建流程包括解析XML节点、构建SqlNode树,并根据动态性标志选择生成DynamicSqlSource或RawSqlSourc
2026-04-16 23:13:35
373
原创 【12.MyBatis源码剖析与架构实战】13.2 SqlSource
MyBatis SqlSource 核心解析 SqlSource 是 MyBatis 生成可执行 SQL 的核心接口,负责将 XML/注解中的 SQL 转换为运行时 BoundSql 对象。主要实现类包括: DynamicSqlSource:处理含动态标签(<if>、${}等)的 SQL,运行时构建完整 SQL RawSqlSource:处理纯静态 SQL(仅#{}),初始化时即完成解析 StaticSqlSource:存储最终确定的静态 SQL 和参数映射 ProviderSqlSource:
2026-04-15 20:07:49
407
SpringMVC整合spring security实现登录、验证码、记住我
2025-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅