Mybatis中的设计模式

本文详细介绍了Mybatis中使用的设计模式,包括Builder模式、工厂模式、单例模式、代理模式、组合模式、模板方法模式、适配器模式、装饰者模式和迭代器模式。Builder模式在SqlSessionFactoryBuilder和XMLMapperBuilder等类中用于构建复杂对象;工厂模式如SqlSessionFactory和MapperProxyFactory用于创建对象;单例模式如ErrorContext和LogFactory实现线程安全的单例;代理模式如MapperProxy实现JDK动态代理;组合模式在动态SQL解析中体现;模板方法模式在Executor执行SQL的流程中应用;适配器模式如LogFactory适配各种日志框架;装饰者模式在缓存实现中使用;迭代器模式如PropertyTokenizer实现字符串遍历。

目录

Builder模式

工厂模式

单例模式

代理模式

组合模式

模板方法模式

适配器模式

装饰者模式

迭代器模式


Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder。

工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory。

单例模式,例如ErrorContext、LogFactory。

代理模式,例如jdk的动态代理MapperProxy、ConnectionLogger,executor.loader包下面的类使用了cglib或者javassist动态代理来达到延迟加载的效果。

组合模式,例如SqlNode、ChooseSqlNode等。

模板方法模式,例如BaseExecutor、SimpleExecutor、BaseTypeHandler等。

适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现。

装饰者模式,例如cache.decorators包下面各个类的实现。

迭代器模式,例如PropertyTokenizer。

Builder模式

Builder模式的定义是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它属于创建类模式,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围,就可以使用工厂模式和Builder模式,相对于工厂模式会产出一个完整的产品,Builder应用于更加复杂的对象的构建,甚至只会构建产

### MyBatis 中使用的设计模式及其应用 #### 1. **工厂模式** MyBatis 使用了工厂模式来创建 SqlSession 对象。SqlSessionFactory 是一个接口,其具体实现类 DefaultSqlSessionFactory 负责生产 SqlSession 实例。通过这种方式,客户端无需关心具体的创建细节,只需调用 `openSession()` 方法即可获得所需的会话对象[^1]。 ```java SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); ``` #### 2. **建造者模式** SqlSessionFactory 的实例化过程体现了建造者模式的应用。`SqlSessionFactoryBuilder` 类作为建造者角色,逐步解析 XML 配置文件或者手动配置的内容,并最终构建出完整的 `SqlSessionFactory` 对象[^1]。 ```java Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); ``` #### 3. **单例模式** 在 MyBatis 中,默认情况下 Mapper 接口对应的代理对象是以单例形式存在的(除非显式设置 scope="prototype")。这意味着同一个 Mapper 文件只会生成唯一的代理实例,从而减少资源消耗并提高性能[^1]。 #### 4. **代理模式** MyBatis 广泛采用了动态代理技术来处理 SQL 映射逻辑。当用户调用 Mapper 接口的方法时,实际上是由底层的 JdkDynamicProxy 或 CglibProxy 完成真正的查询工作[^2]。例如: ```java UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.selectAllUsers(); ``` 这里 `mapper` 就是一个由 MyBatis 自动生成的代理对象,它拦截了对 `selectAllUsers()` 方法的调用,并将其转换为实际的 JDBC 操作。 #### 5. **适配器模式** 为了兼容不同的数据库驱动程序以及简化开发者的工作量,MyBatis 提供了一套统一的数据源适配机制。无论是连接池还是事务管理器都可以轻松集成进来而不需要修改核心代码结构。 --- ### 关于发布订阅模式是否应用于 MyBatis 尽管 MyBatis 自身并未直接依赖传统的发布订阅模型来进行功能开发,但在某些高级特性上确实存在类似的解耦设计理念。比如缓存刷新策略中可能存在异步通知机制;又或者是插件体系允许第三方扩展点注册监听器以响应特定事件的发生等情形均可以看作是对该思想的一种变体实现[^3]。不过严格意义上讲,这些并不完全符合经典意义上的 Publish-Subscribe Pattern 描述[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆驼整理说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值