当前位置:实例文章 » JAVA Web实例» [文章]MyBatis源码分析_Executor组件及3个火枪手(6)

MyBatis源码分析_Executor组件及3个火枪手(6)

发布人:shili8 发布时间:2024-11-17 22:50 阅读次数:0

**MyBatis 源码分析**

**Executor 组件及3 个火枪手**

在 MyBatis 中,Executor 是一个非常重要的组件,它负责执行 SQL语句并返回结果。Executor 有多种实现方式,包括 SimpleExecutor、ReuseExecutor 和 CachingExecutor 等。在本文中,我们将重点分析 Executor 的基本结构和三个核心类:SimpleExecutor、ReuseExecutor 和 CachingExecutor。

### Executor 接口Executor 接口是 MyBatis 中 Executor 组件的核心接口,它定义了 Executor 需要实现的方法:

javapublic interface Executor {
 // 执行 SQL语句并返回结果 List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;

 // 执行批量更新操作 int update(MappedStatement ms, Object parameter) throws SQLException;
}

### SimpleExecutorSimpleExecutor 是最简单的 Executor 实现,它不缓存任何数据,直接执行 SQL语句并返回结果:
javapublic class SimpleExecutor implements Executor {
 @Override public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
 // 执行 SQL语句并返回结果 return db.query(ms.getSql(), ms.getParameterType());
 }

 @Override public int update(MappedStatement ms, Object parameter) throws SQLException {
 // 执行批量更新操作 return db.update(ms.getSql(), ms.getParameterType());
 }
}

### ReuseExecutorReuseExecutor 是一个重用 Executor 实现,它缓存了上一次执行的 SQL语句和参数:
javapublic class ReuseExecutor implements Executor {
 private MappedStatement cachedMs;
 private Object cachedParameter;

 @Override public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
 // 检查是否有缓存的 SQL语句和参数 if (cachedMs == null || !cachedMs.equals(ms)) {
 cachedMs = ms;
 cachedParameter = parameter;
 }

 // 执行 SQL语句并返回结果 return db.query(cachedMs.getSql(), cachedMs.getParameterType());
 }

 @Override public int update(MappedStatement ms, Object parameter) throws SQLException {
 // 检查是否有缓存的 SQL语句和参数 if (cachedMs == null || !cachedMs.equals(ms)) {
 cachedMs = ms;
 cachedParameter = parameter;
 }

 // 执行批量更新操作 return db.update(cachedMs.getSql(), cachedMs.getParameterType());
 }
}

### CachingExecutorCachingExecutor 是一个缓存 Executor 实现,它缓存了所有执行过的 SQL语句和参数:
javapublic class CachingExecutor implements Executor {
 private Map cachedMss;
 private Map cachedParameters;

 @Override public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
 // 检查是否有缓存的 SQL语句和参数 String key = ms.getSql() + ":" + parameter;
 if (cachedMss.containsKey(key)) {
 MappedStatement cachedMs = cachedMss.get(key);
 Object cachedParameter = cachedParameters.get(key);

 // 执行 SQL语句并返回结果 return db.query(cachedMs.getSql(), cachedMs.getParameterType());
 }

 // 没有缓存的 SQL语句和参数,直接执行并缓存 cachedMss.put(key, ms);
 cachedParameters.put(key, parameter);

 return db.query(ms.getSql(), ms.getParameterType());
 }

 @Override public int update(MappedStatement ms, Object parameter) throws SQLException {
 // 检查是否有缓存的 SQL语句和参数 String key = ms.getSql() + ":" + parameter;
 if (cachedMss.containsKey(key)) {
 MappedStatement cachedMs = cachedMss.get(key);
 Object cachedParameter = cachedParameters.get(key);

 // 执行批量更新操作 return db.update(cachedMs.getSql(), cachedMs.getParameterType());
 }

 // 没有缓存的 SQL语句和参数,直接执行并缓存 cachedMss.put(key, ms);
 cachedParameters.put(key, parameter);

 return db.update(ms.getSql(), ms.getParameterType());
 }
}

### 总结在本文中,我们分析了 MyBatis 中 Executor 组件的基本结构和三个核心类:SimpleExecutor、ReuseExecutor 和 CachingExecutor。这些类分别实现了不同的缓存策略,适用于不同场景下的需求。通过理解这些类的源码,可以更好地掌握 MyBatis 的底层机制,并且可以根据具体需求定制自己的 Executor 实现。

其他信息

其他资源

Top