mybatis-整体框架
什么是mybatis
mybatis是一个orm持久性框架,它支持动态SQL、存储过程、高级映射,它可以通过xml和注解方式写SQL,通过一些简单配置完成自动化
完成参数的映射以及结果的映射
学习mybatis源码的好处
mybatis中含有大量优质代码丰富的设计模式,通过对该源代码的学习,不仅跟清楚了解mybatis的运行过程而且能提高对设计模式的理解与应用,以此在工作中能合理应用设计模式,实现代码结构层次的优美性。
从学习mybatis源码对比学习spring、dubbo、rocketMq、springboot 来说,其代码量不大,学起来不费劲,所以来说想学源码先学mybatis是一个不错的选择
学习mybatis学习目标
- 合理设计代码目录及类名称
- 合理运用设计模式
- 通过对源码的学习,提高对业务代码的代码流程设计
mybatis的优势
- 通过一些xml标签(if choose when)完成动态SQL
- 通过Mapper接口映射xml的方式,降低了其耦合度
- 避免了传统的jdbc的一些重复操作,而且它拥有参数自动匹配和结果的自动映射
- 使用xml方式写SQL,更加方便书写复杂SQL
与jdbc编码区别
传统jdbc
一下是传统jdbc操作
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/order", "root", "");
statement = connection.prepareStatement("SELECT * FROM order where id in (1,2,3)");
ResultSet resultSet = statement.executeQuery();
List<Order> orderList = new ArrayList<>();
while (resultSet.next()) {
Order order = new Order();
long id = resultSet.getLong("id");
String state = resultSet.getString("state");
order.setId(id);
order.setState(state);
orderList.add(order);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
mybatis
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = builder.build(Resources.getResourceAsReader("mybatis-config.xml"));
SqlSession sqlSession = build.openSession();
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> orderList = mapper.getOrderList("1,2,3");
整体架构图
MyBatis的整体架构分为三层,分别是基础支持层、核心处理层和接口层
接口层
接口层相对简单,其核心是SqlSession接口,该接口中定义了MyBatis暴露给应用程序调用的API,也就是上层应用与MyBatis交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作
核心处理层
在核心处理层中实现了MyBatis的核心处理流程,其中包括MyBatis的初始化以及完成一次数据库操作的涉及的全部流程。
基础支持层
基础支持层包含整个MyBatis的基础模块,这些模块为核心处理层的功能提供了良好的支撑,可以将基础层看做mybaits的功能工具
mybatis SQL执行流程
MyBatis执行一条SQL语句的大致过程
mybatis所用设计模式
- 工厂方法 DataSource
- 动态代理 mapper方法的执行 MapperProxy
- 装饰模式 Executor Cache
- 建造者模式 SqlSessionFactoryBuilder、MappedStatement
- 适配器模式 mybatis logging
- 组合模式 处理动态SQL节点时
- 模板方法模式 Executor
- 策略模式 DefaultSqlSession中Executor的切换
- 责任链模式 interceptor