Mybatis框架用到了哪些设计模式?

news/2024/10/20 12:35:24/

MyBatis是一个持久化框架,它使用了多种设计模式来实现其功能,主要包括以下几种设计模式

1. 代理模式(Proxy Pattern)

MyBatis使用代理模式来实现动态SQL和懒加载。通过JDK动态代理或CGLIB代理,MyBatis可以在运行时创建接口的实现,从而在执行方法时添加额外的行为。

示例代码:
// Mapper接口
public interface UserMapper {User getUserById(int id);
}// Mapper XML
<mapper namespace="com.example.UserMapper"><select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>// 创建SqlSession并获取Mapper
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);

2. 单例模式(Singleton Pattern)

MyBatis的SqlSessionFactory是一个单例,确保在整个应用程序中只有一个实例。通过单例模式,可以有效地管理数据库连接的创建和配置。

示例代码:
public class SqlSessionFactoryUtil {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}
}

3. 工厂模式(Factory Pattern)

MyBatis使用工厂模式来创建SqlSession和SqlSessionFactory。这样可以将创建对象的逻辑与使用对象的逻辑分开,提高代码的可维护性和可扩展性。

示例代码:
// SqlSession的工厂
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1);
}

4. 模板方法模式(Template Method Pattern)

MyBatis中的SqlSession类使用了模板方法模式来定义执行数据库操作的基本步骤,同时允许子类实现具体的操作。这种模式使得代码结构清晰。

示例代码:
// 模板方法的抽象类
public abstract class MyBatisTemplate {public final void execute() {SqlSession session = getSqlSession();try {doExecute(session);} finally {session.close();}}protected abstract void doExecute(SqlSession session);protected SqlSession getSqlSession() {return SqlSessionFactoryUtil.getSqlSessionFactory().openSession();}
}// 具体实现
public class UserQueryTemplate extends MyBatisTemplate {private int userId;public UserQueryTemplate(int userId) {this.userId = userId;}@Overrideprotected void doExecute(SqlSession session) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(userId);// 处理user对象}
}// 使用模板
MyBatisTemplate template = new UserQueryTemplate(1);
template.execute();

5. 观察者模式(Observer Pattern)

MyBatis中的缓存机制使用观察者模式来实现。当查询数据时,MyBatis会先检查本地缓存,如果没有,再去查询数据库。这种模式允许MyBatis动态更新缓存。

MyBatis通过这些设计模式实现了良好的代码结构和高效的数据库访问能力。这些模式的使用提高了框架的灵活性和可扩展性,使开发者能够更方便地进行数据持久化操作。


http://www.ppmy.cn/news/1540515.html

相关文章

linux--库指令

ldd ldd 可执行文件路径 显示依赖的库的查找路径以及是否查找到了。

WorkFlow GO-Task 源码分析

WorkFlow GO-Task 源码分析 前言 任何好的框架的设计都是围绕着一个核心思想去展开&#xff0c;sylar的一切皆协程、muduo的one loop per thread等。一切皆是任务流就是workflow的精髓。&#xff08;PS&#xff0c;目前作者功力尚浅&#xff0c;许多设计细节还未能悟透其用意…

第六章 元素应用CSS

6.1 使用CSS设置字体样式 在学习网页设计时我们通常会用到html对文本字体进行一些非常简单的样式设置。 字体样式的常用属性如表1所示。 表-1 6.1.1字体类型 字体具有两方面的作用&#xff1a;一是传递语义功能&#xff0c;二是有美学效应 。为了拥有不同的字体给人带来不同的…

【idea技巧篇】idea的类注释和方法注释模版自定义设置

这块idea技巧虽然常用&#xff0c;谁没事会经常修改模版设置呢&#xff0c;一般是搭建开发环境的时候或者开发规范要求等设置一次就行了。用的虽然少&#xff0c;但几乎每次搭建环境都会用到&#xff0c;这里记录下并分享设置的过程已经发现的更高级的一些使用技巧。 注释模版…

STL-list-模拟实现

文章目录 list介绍list的使用list iterator的使用list modifierslist的迭代器失效list的模拟实现 list介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储…

机器学习课程学习周报十七

机器学习课程学习周报十七 文章目录 机器学习课程学习周报十七摘要Abstract一、机器学习部分1. 变分推断/推理1.1 证据下界1.2 q ( z ) {q(z)} q(z)的选取 2. VAE2.1 Auto-Encoder的简单回顾2.2 为什么提出VAE2.3 VAE的数学原理 3. Diffusion Model的数学原理3.1 Training算法…

C++ 排序算法(选择、冒泡、插入)

八、选择排序(从小到大)&#xff1a; 选择排序的基本思想是&#xff1a;每一趟从待排序的数据中&#xff0c;通过“打擂台”比较选出最小元素&#xff0c;放在这些数据的最前面。 这样&#xff0c;第一趟把 n 个数中&#xff08;第 1 个到第 n 个&#xff09;最小的放在第一个…

TCP 全连接队列与 tcpdump 抓包

TCP 相关实验 理解 listen 的第二个参数 基于刚才封装的 TcpSocket 实现以下测试代码对于服务器, listen 的第二个参数设置为 1, 并且不调用 accept test_server.cc C #include "tcp_socket.hpp" int main(int argc, char* argv[]) {if (argc ! 3) {printf("…