当前位置: 首页 > Web前端 > HTML

说说Mybatis的Executor的模板方法模式

时间:2023-03-28 18:57:29 HTML

说说Mybatis的Executor的模板方法模式。模板方法模式通过模板方法指定流程,具体的子类实现具体的逻辑。让我们看一下Executor接口。它的实现类包括BaseExecutor抽象类和CachingExecutor类。BaseExecutor抽象类用作模板方法的抽象模板类。它实现了缓存和事务,具体改变数据库操作由子类实现。事务方法下面说一下事务管理的commit()方法的实现:@Overridepublicvoidcommit(booleanrequired)throwsSQLException{if(closed){thrownewExecutorException("不能提交,事务已经关闭");}clearLocalCache();冲洗语句();如果(必需){transaction.commit();}}清除一级缓存,调用flushStatements()方法。此方法调用doFlushStatements抽象方法。具体操作由子类实现。主要作用是清除Statement对象上一次提交事务回滚事务的逻辑,与本次提交逻辑基本一致,不再分析。Mybatis默认开启一级缓存,在SqlSession级别。即通过SqlSession建立会话。如果在本次会话中执行同一条sql,第一次执行的结果会被缓存起来,然后我们从缓存中查找缓存数据,从它的query()方法中分析:@OverridepublicListquery(MappedStatementms,Objectparameter,RowBoundsrowBounds,ResultHandlerresultHandler)抛出SQLException{BoundSqlboundSql=ms.getBoundSql(parameter);说说MybatisExecutor的模板方法模式CacheKeykey=createCacheKey(ms,parameter,rowBounds,boundSql);返回查询(ms,参数,rowBounds,resultHandler,键,boundSql);}list=resultHandler==null?(List)localCache.getObject(key):null;deferredLoad.load();我们可以知道缓存是通过HashMap存储的,key是一个CacheKey对象。哪些元素会影响CacheKey对象?cacheKey.update(ms.getId());cacheKey.update(rowBounds.getOffset());cacheKey.update(rowBounds.getLimit());cacheKey.update(boundSql.getSql());我们通过createCacheKey()可以看出,决定CacheKey对象的因素有:MappedStatement的id(对增删改查标签节点的封装),RowBounds的offset属性和limit属性,以及对应的SQL语句。总结本文主要讲Mybatis的Executor接口及其抽象实现类BaseExecutor,BaseExecutor是一个抽象类,提供事务管理和缓存功能,我们从query()方法分析其一级缓存的实现