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 实现。

