MyBatis 与迭代器模式(Iterator Pattern)详解
迭代器模式是一种行为型设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在 MyBatis 中,最典型的迭代器模式应用是PropertyTokenizer(用于递归解析嵌套属性路径),其次是Cursor(用于流式遍历大数据结果集)。本文将通过 UML 类图和源码详细剖析这两个实现。
一、迭代器模式概述
意图:提供一种方法顺序访问聚合对象中的元素,而不暴露其内部结构。
参与者:
- Iterator:定义访问和遍历元素的接口(
hasNext(),next(),remove())。 - ConcreteIterator:实现 Iterator 接口,维护遍历当前位置。
- Aggregate:定义创建迭代器的接口(
iterator())。 - ConcreteAggregate:实现创建迭代器的方法,返回具体迭代器实例。
在 MyBatis 中,PropertyTokenizer既承担了迭代器的角色,也作为被迭代元素本身(每个实例代表路径中的一层)。Cursor则遵循标准的集合迭代器风格。
二、PropertyTokenizer:属性路径的迭代器
2.1 设计意图
在 MyBatis 的MetaObject、BeanWrapper、MapWrapper等组件中,需要处理嵌套属性表达式,例如“order.items[0].product.name”。通过PropertyTokenizer可以将该表达式分解为多个层级,每次调用next()获取下一层的信息(属性名、索引等),直到无子路径。这避免了手工编写正则或复杂字符串切割逻辑。