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语句并返回结果 Listquery(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 Listquery(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 Listquery(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 MapcachedMss; 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 实现。