1. 工厂模式(Factory Pattern)
- 概念:工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离,通过一个工厂类来负责创建对象。
- MyBatis 中的应用:MyBatis 使用
SqlSessionFactory
来创建 SqlSession
对象。SqlSession
是 MyBatis 执行 SQL 语句、管理事务等操作的核心对象,SqlSessionFactory
充当了创建 SqlSession
的工厂。 - 举例:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class FactoryPatternExample {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
} finally {
session.close();
}
}
}
2. 代理模式(Proxy Pattern)
- 概念:代理模式是指为其他对象提供一种代理以控制对这个对象的访问。在 Java 中,代理模式可以通过静态代理和动态代理来实现。
- MyBatis 中的应用:MyBatis 利用 Java 的动态代理机制为 Mapper 接口生成代理对象。开发者只需要定义 Mapper 接口和对应的 SQL 映射文件,MyBatis 会自动生成代理对象,调用 Mapper 接口的方法时,实际上是通过代理对象执行对应的 SQL 操作。
- 举例:
public interface UserMapper {
User selectUserById(int id);
}
SqlSession session = sqlSessionFactory.openSession();
try {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUserById(1);
} finally {
session.close();
}
3. 单例模式(Singleton Pattern)
- 概念:单例模式确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
- MyBatis 中的应用:
ErrorContext
类使用了单例模式。ErrorContext
用于在处理错误时存储和管理错误信息,整个应用程序中只需要一个 ErrorContext
实例来记录错误上下文,确保错误信息的一致性和准确性。 - 举例:在 MyBatis 代码内部,无论在何处需要记录错误信息,都是通过
ErrorContext.getInstance()
来获取唯一的 ErrorContext
实例。
4. 装饰器模式(Decorator Pattern)
- 概念:装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它通过创建一个包装对象,也就是装饰器,来包裹真实的对象。
- MyBatis 中的应用:MyBatis 的缓存模块使用了装饰器模式。MyBatis 提供了一级缓存和二级缓存,为了对缓存功能进行扩展和增强,使用装饰器模式对基本的缓存实现进行包装。例如,
LruCache
(最近最少使用缓存)、FifoCache
(先进先出缓存)等都是对基本缓存接口的装饰器实现。 - 举例:在配置 MyBatis 的二级缓存时,可以通过配置不同的缓存装饰器来实现不同的缓存策略。
<cache type="org.apache.ibatis.cache.decorators.LruCache"/>
5. 模板方法模式(Template Method Pattern)
- 概念:模板方法模式定义了一个操作中的算法的骨架,将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- MyBatis 中的应用:
BaseExecutor
类使用了模板方法模式。BaseExecutor
是所有执行器的基类,它定义了执行 SQL 语句的基本流程和框架,具体的执行细节由子类(如 SimpleExecutor
、ReuseExecutor
等)来实现。 - 举例:
BaseExecutor
中的 query
方法定义了查询的基本流程,包括获取缓存、执行查询等步骤,而具体的查询实现由子类完成。
6. 建造者模式(Builder Pattern)
- 概念:建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- MyBatis 中的应用:
SqlSessionFactoryBuilder
类使用了建造者模式。SqlSessionFactoryBuilder
用于构建 SqlSessionFactory
对象,它通过一系列的方法调用,逐步设置 SqlSessionFactory
的配置信息,最终创建出一个完整的 SqlSessionFactory
实例。 - 举例:
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
7. 适配器模式(Adapter Pattern)
- 概念:适配器模式是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- MyBatis 中的应用:在 MyBatis 中,日志模块使用了适配器模式。MyBatis 支持多种日志框架,如 Log4j、SLF4J 等,通过日志适配器将不同日志框架的接口统一适配成 MyBatis 内部使用的日志接口,方便开发者根据需要选择不同的日志框架。
- 举例:如果使用 Log4j 作为日志框架,MyBatis 会使用
Log4jImpl
类作为适配器,将 Log4j 的日志接口适配成 MyBatis 的日志接口。