mybatis执行原理

详细流程如下:

1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,mybatis基于xml配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态sql语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3、SqlSession对象完成和数据库交互:  
a、用户程序调用mybatis接口层api(即mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态sql的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、javaBean等存储结构并返回

MyBatis 是一个优秀的持久层框架,其执行原理和工作流程主要围绕其核心组件展开,包括 `SqlSessionFactory`、`SqlSession`、`Executor` 和 `MapperProxy` 等。以下是其执行流程和工作原理的详细说明: ### 核心组件与工作原理 1. **配置加载与 `SqlSessionFactory` 创建** MyBatis 的启动始于加载核心配置文件(如 `mybatis-config.xml`)和 SQL 映射文件(XML 文件或注解)。这些配置信息被封装到 `Configuration` 对象中,该对象负责管理数据源、事务管理方式、SQL 映射等信息。基于 `Configuration` 对象,创建 `SqlSessionFactory`,这是一个工厂对象,用于生成 `SqlSession` 实例。 2. **`SqlSession` 的创建与数据库操作** `SqlSession` 是 MyBatis 提供给开发人员的主要接口,用于执行数据库操作(如增删改查)。它内部封装了 `Executor` 和 `Transaction` 等对象,负责实际的 SQL 执行和事务管理。`SqlSession` 通过 `MapperProxy` 代理类来调用具体的数据库操作方法。 3. **`MapperProxy` 与动态代理机制** 当调用 Mapper 接口的方法时,MyBatis 使用动态代理机制生成 `MapperProxy` 实例。该代理类负责将方法调用转换为对应的 SQL 语句,并通过 `SqlSession` 执行。`MapperProxy` 会根据方法签名和注解信息确定 SQL 映射规则,并将参数绑定到 SQL 语句中。 4. **SQL 执行与结果映射** SQL 的执行由 `Executor` 负责,它是一个接口,具体的实现类(如 `SimpleExecutor` 或 `BatchExecutor`)处理 SQL 的执行逻辑。`Executor` 会调用 `StatementHandler` 来创建和管理 `Statement` 对象,并通过 `ParameterHandler` 绑定参数值到 SQL 语句中。查询结果通过 `ResultSetHandler` 进行解析,并映射到 Java 对象中。 5. **事务管理与提交/回滚** MyBatis 的事务管理依赖于 `Transaction` 对象,该对象负责管理数据库连接的提交和回滚。当调用 `SqlSession.commit()` 时,根据 `dirty` 成员变量的值决定是否提交事务。如果 SQL 执行过程中发生错误,事务会回滚。执行完毕后,`SqlSession.close()` 会释放资源,例如将数据库连接归还到连接池。 ### 执行流程的详细步骤 1. **配置加载** MyBatis 启动时,首先加载配置文件和 SQL 映射文件,并将其解析为 `Configuration` 对象。该对象存储了数据源、事务管理方式、SQL 映射规则等信息。 2. **创建 `SqlSessionFactory`** 基于 `Configuration` 对象,创建 `SqlSessionFactory` 实例。该工厂对象用于生成 `SqlSession`。 3. **生成 `SqlSession`** 调用 `SqlSessionFactory.openSession()` 方法生成 `SqlSession`。该对象封装了 `Executor` 和 `Transaction`,并提供数据库操作的接口。 4. **调用 Mapper 接口** 开发人员通过调用 Mapper 接口的方法触发 SQL 执行MyBatis 使用动态代理生成 `MapperProxy` 实例,将方法调用转换为 SQL 语句。 5. **SQL 解析与执行** `MapperProxy` 将方法调用委托给 `SqlSession`,`SqlSession` 通过 `Executor` 执行 SQL。`StatementHandler` 负责创建和管理 `Statement`,`ParameterHandler` 绑定参数,`ResultSetHandler` 处理查询结果。 6. **事务提交与资源释放** 执行完毕后,调用 `SqlSession.commit()` 提交事务(或回滚),最后调用 `SqlSession.close()` 释放资源。 ### 示例代码:MyBatis 的基本使用 以下是一个简单的示例,展示如何使用 MyBatis 执行数据库操作: ```java // 1. 加载 MyBatis 配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 2. 创建 SqlSession try (SqlSession session = sqlSessionFactory.openSession()) { // 3. 获取 Mapper 接口 UserMapper mapper = session.getMapper(UserMapper.class); // 4. 调用 Mapper 方法执行 SQL User user = mapper.selectUser(1); // 5. 输出结果 System.out.println(user); } ``` ### 相关问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值