企业网站建设和实现 论文seo网站推广的主要目的不包括
2025/12/25 0:40:11 网站建设 项目流程
企业网站建设和实现 论文,seo网站推广的主要目的不包括,百度输入法,电子商务主要学什么就业方向及前景5篇#xff1a;Executor执行器体系详解1. 学习目标确认1.0 第4篇思考题解答在深入学习Executor执行器体系之前#xff0c;让我们先回顾并解答第4篇中提出的思考题#xff0c;这将帮助我们更好地理解Executor在整个架构中的作用。思考题1#xff1a;为什么MyBatis选择JDK动态…5篇Executor执行器体系详解1. 学习目标确认1.0 第4篇思考题解答在深入学习Executor执行器体系之前让我们先回顾并解答第4篇中提出的思考题这将帮助我们更好地理解Executor在整个架构中的作用。思考题1为什么MyBatis选择JDK动态代理而非字节码增强如ASM/CGLIB答案要点接口代理特性MyBatis的Mapper接口都是接口JDK动态代理天然支持接口代理无需依赖第三方库性能考虑JDK动态代理在JVM层面有优化性能优于字节码增强方案兼容性JDK动态代理是Java标准库的一部分兼容性更好无需额外依赖简洁性实现相对简单代码量少维护成本低功能满足对于MyBatis的需求方法调用拦截和转发JDK动态代理完全满足Executor的作用Executor作为Mapper代理调用的最终执行者负责具体的SQL执行和结果处理。思考题2多返回值场景下MapperMethod如何区分集合、游标与映射类型答案要点返回类型检测通过反射获取方法返回类型判断是否为Collection、Cursor或Map类型注解识别通过MapKey注解识别Map类型通过泛型参数确定Map的key类型执行路径选择根据返回类型选择对应的SqlSession方法selectList、selectCursor、selectMap结果适配MapperMethod根据方法签名进行结果类型适配和转换异常处理对不匹配的返回类型进行异常处理和提示与Executor的协作Executor根据不同的执行类型SELECT/INSERT/UPDATE/DELETE和返回类型选择合适的执行策略。思考题3在开启二级缓存时哪些因素会导致缓存失效或绕过答案要点flushCache配置非SELECT语句默认flushCachetrue会清空相关缓存useCache配置SELECT语句可配置useCachefalse绕过缓存ResultHandler使用使用ResultHandler的查询会绕过二级缓存存储过程OUT参数带有OUT参数的存储过程会绕过缓存事务边界事务提交/回滚会影响TransactionalCache的缓存策略缓存Key变化参数或配置变化导致CacheKey不同无法命中缓存Executor的缓存管理CachingExecutor负责二级缓存的读写管理SimpleExecutor等负责一级缓存的维护。1.1 本篇学习目标通过本文你将能够深入理解MyBatis Executor执行器体系的设计思想和架构模式掌握BaseExecutor模板方法模式的实现原理和优势理解SimpleExecutor、ReuseExecutor、BatchExecutor的具体实现和适用场景掌握CachingExecutor装饰器模式在缓存管理中的应用了解Executor与StatementHandler、ParameterHandler、ResultSetHandler的协作关系具备自定义Executor扩展开发的能力2. Executor执行器体系总览2.1 执行器继承关系图delegates to«interface»Executorupdate(MappedStatement, Object) : intquery(MappedStatement, Object, RowBounds, ResultHandler) : ListEquery(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql) : ListEqueryCursor(MappedStatement, Object, RowBounds) : CursorEflushStatements() : ListBatchResultcommit(boolean) : voidrollback(boolean) : voidcreateCacheKey(MappedStatement, Object, RowBounds, BoundSql) : CacheKeyclearLocalCache() : voiddeferLoad(MappedStatement, MetaObject, String, CacheKey, Class) : voidgetTransaction() : Transactionclose(boolean) : voidisClosed() : boolean«abstract»BaseExecutor#localCache PerpetualCache#localOutputParameterCache PerpetualCache#deferredLoads ListDeferredLoad#queryStack int#closed boolean#doQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql) : ListE#doUpdate(MappedStatement, Object) : int#doFlushStatements(boolean) : ListBatchResult#doQueryCursor(MappedStatement, Object, RowBounds, BoundSql) : CursorE#queryFromDatabase(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql) : ListESimpleExecutordoQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql) : ListEdoUpdate(MappedStatement, Object) : intdoFlushStatements(boolean) : ListBatchResultdoQueryCursor(MappedStatement, Object, RowBounds, BoundSql) : CursorEReuseExecutor-statementMap MapString,StatementdoQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql) : ListEdoUpdate(MappedStatement, Object) : intdoFlushStatements(boolean) : ListBatchResultdoQueryCursor(MappedStatement, Object, RowBounds, BoundSql) : CursorEclose(boolean) : voidBatchExecutor-statementList ListStatement-batchResultList ListBatchResult-currentSql String-currentStatement MappedStatementdoQuery(MappedStatement, Object, RowBounds, ResultHandler, BoundSql) : ListEdoUpdate(MappedStatement, Object) : intdoFlushStatements(boolean) : ListBatchResultdoQueryCursor(MappedStatement, Object, RowBounds, BoundSql) : CursorEclose(boolean) : voidCachingExecutor-delegate Executor-transactionalCacheManager TransactionalCacheManagerquery(MappedStatement, Object, RowBounds, ResultHandler, CacheKey, BoundSql) : ListEupdate(MappedStatement, Object) : intcommit(boolean) : voidrollback(boolean) : voidflushStatements() : ListBatchResultgetTransaction() : Transactionclose(boolean) : voidisClosed() : boolean-ensureNoOutParams(MappedStatement, BoundSql) : void-flushCacheIfRequired(MappedStatement) : void2.2 执行器职责分工执行器类型 核心职责 适用场景 性能特点BaseExecutor 模板方法实现一级缓存管理 所有场景的基础 提供通用功能和缓存SimpleExecutor 简单执行每次创建新Statement 单次执行、简单查询 简单直接资源及时释放ReuseExecutor 重用Statement对象 重复执行相同SQL 减少Statement创建开销BatchExecutor 批量执行多个SQL 批量插入、更新、删除 大幅减少数据库交互次数CachingExecutor 二级缓存管理 需要缓存的查询场景 避免重复查询提升性能2.3 执行器协作关系DatabaseResultSetHandlerParameterHandlerStatementHandlerExecutorSqlSessionDatabaseResultSetHandlerParameterHandlerStatementHandlerExecutorSqlSessionquery(ms, param, rowBounds, handler)createCacheKey(ms, param, rowBounds, boundSql)queryFromDatabase(ms, param, rowBounds, handler, key, boundSql)newStatementHandler(wrapper, ms, param, rowBounds, handler, boundSql)prepare(connection, timeout)parameterize(statement)set parametersexecute queryResultSethandleResultSets(statement)ListObjectresultsListE3. BaseExecutor抽象基类深度解析3.1 模板方法模式实现BaseExecutor采用模板方法模式定义了SQL执行的标准流程子类只需实现具体的执行逻辑package org.apache.ibatis.executor;/*** 执行器抽象基类采用模板方法模式* 定义SQL执行的标准流程子类实现具体的执行逻辑*/public abstract class BaseExecutor implements Executor {// 事务管理器用于管理数据库事务protected Transaction transaction;// 执行器包装器通常是CachingExecutorprotected Executor wrapper;// 一级缓存本地缓存session级别缓存protected PerpetualCache localCache;// 存储过程出参缓存protected PerpetualCache localOutputParameterCache;// MyBatis全局配置对象protected Configuration configuration;// 查询栈深度用于控制嵌套查询protected int queryStack;// 执行器是否已关闭private boolean closed;// 延迟加载队列存储需要延迟加载的对象protected ListDeferredLoad deferredLoads new ArrayList();/*** 模板方法查询操作的标准流程重载方法1* param ms SQL映射语句* param parameter 查询参数* param rowBounds 分页参数* param resultHandler 结果处理器* return 查询结果列表*/Overridepublic E ListE query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {// 根据参数生成动态SQLBoundSql boundSql ms.getBoundSql(parameter);// 创建缓存键用于一级缓存CacheKey key createCacheKey(ms, parameter, rowBounds, boundSql);// 调用重载方法继续执行return query(ms, parameter, rowBounds, resultHandler, key, boundSql);}/*** 模板方法查询操作的标准流程重载方法2* 这是查询的核心方法包含完整的缓存和执行逻辑*/Overridepublic E ListE query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException {// 设置错误上下文便于调试和错误定位ErrorContext.instance().resource(ms.getResource()).activity(executing a query).object(ms.getId());// 检查执行器是否已关闭if (closed) {throw new ExecutorException(Executor was closed.);}// 如果是最外层查询且配置了刷新缓存则清空本地缓存if (queryStack 0 ms.isFlushCacheRequired()) {clearLocalCache();}ListE list;try {// 查询栈深度1用于处理嵌套查询queryStack;// 尝试从一级缓存中获取结果仅当没有结果处理器时list resultHandler null ? (ListE) localCache.getObject(cacheKey) : null;if (list ! null) {// 缓存命中处理存储过程的输出参数handleLocallyCachedOutputParameters(ms, cacheKey, parameter, boundSql);} else {// 缓存未命中从数据库查询list queryFromDatabase(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);}} finally {// 查询栈深度-1queryStack--;}// 如果回到最外层查询if (queryStack 0) {// 执行所有延迟加载for (DeferredLoad deferredLoad : deferredLoads) {deferredLoad.load();}// 清空延迟加载队列deferredLoads.clear();// 如果配置为STATEMENT级别缓存执行完成后清空缓存if (configuration.getLocalCacheScope() LocalCacheScope.STATEMENT) {clearLocalCache();}}return list;}/*** 抽象方法子类实现具体的数据库查询逻辑* 不同的执行器有不同的实现策略*/protected abstract E ListE doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException;/*** 模板方法更新操作的标准流程* 包括插入、更新、删除操作*/Overridepublic int update(MappedStatement ms, Object parameter) throws SQLException {// 设置错误上下文ErrorContext.instance().resource(ms.getResource()).activity(executing an update).object(ms.getId());// 检查执行器是否已关闭if (closed) {throw new ExecutorException(Executor was closed.);}// 清空本地缓存更新操作会影响缓存一致性clearLocalCache();// 调用子类的具体实现return doUpdate(ms, parameter);}/*** 抽象方法子类实现具体的数据库更新逻辑*/protected abstract int doUpdate(MappedStatement ms, Object parameter) throws SQLException;}3.2 一级缓存机制BaseExecutor实现了一级缓存本地缓存提升重复查询的性能/*** 从数据库查询数据并缓存结果* 这是一级缓存的核心实现方法*/private E ListE queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException {ListE list;// 在缓存中放入占位符防止循环引用localCache.putObject(cacheKey, EXECUTION_PLACEHOLDER);try {// 调用子类的具体实现执行数据库查询list doQuery(ms, parameter, rowBounds, resultHandler, boundSql);} finally {// 无论成功还是失败都要移除占位符localCache.removeObject(cacheKey);}// 将查询结果放入一级缓存localCache.putObject(cacheKey, list);// 如果是存储过程调用需要缓存输出参数if (ms.getStatementType() StatementType.CALLABLE) {localOutputParameterCache.putObject(cacheKey, parameter);}return list;}/*** 创建缓存键* 缓存键由多个因素组成确保唯一性*/Overridepublic CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql) {// 检查执行器是否已关闭if (closed) {throw new ExecutorException(Executor was closed.);}// 创建缓存键对象CacheKey cacheKey new CacheKey();// 添加SQL映射语句ID到缓存键中cacheKey.update(ms.getId());// 添加分页参数到缓存键中cacheKey.update(rowBounds.getOffset());cacheKey.update(rowBounds.getLimit());// 添加SQL语句到缓存键中cacheKey.update(boundSql.getSql());// 获取参数映射列表ListParameterMapping parameterMappings boundSql.getParameterMappings();TypeHandlerRegistry typeHandlerRegistry ms.getConfiguration().getTypeHandlerRegistry();// 遍历所有参数将参数值添加到缓存键中for (ParameterMapping parameterMapping : parameterMappings) {// 只处理输入参数不处理输出参数if (parameterMapping.getMode() ! ParameterMode.OUT) {Object value;String propertyName parameterMapping.getProperty();// 获取参数值的逐个判断逻辑if (boundSql.hasAdditionalParameter(propertyName)) {// 从额外参数中获取value boundSql.getAdditionalParameter(propertyName);} else if (parameterObject null) {// 参数对象为空value null;} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {// 参数对象有对应的类型处理器基本类型value parameterObject;} else {// 复杂对象通过反射获取属性值MetaObject metaObject configuration.newMetaObject(parameterObject);value metaObject.getValue(propertyName);}// 将参数值添加到缓存键中cacheKey.update(value);}}// 将环境ID添加到缓存键中区分不同环境if (configuration.getEnvironment() ! null) {cacheKey.update(configuration.getEnvironment().getId());}return cacheKey;}3.3 延迟加载机制BaseExecutor支持延迟加载懒加载通过DeferredLoad实现/*** 延迟加载类用于实现懒加载功能* 当访问某个属性时才真正执行相关查询*/public class DeferredLoad {// 结果对象的元数据包装器用于反射操作private final MetaObject resultObject;// 需要延迟加载的属性名private final String property;// 目标类型属性的类型private final Class? targetType;// 缓存键用于标识该次查询private final CacheKey key;// SQL映射语句包含延迟加载的SQL信息private final MappedStatement mappedStatement;// 执行器用于执行延迟加载查询private final Executor executor;/*** 构造延迟加载对象*/public DeferredLoad(MetaObject resultObject, String property, Class? targetType, CacheKey key, MappedStatement mappedStatement, Executor executor) {this.resultObject resultObject;this.property property;this.targetType targetType;this.key key;this.mappedStatement mappedStatement;this.executor executor;}/*** 执行延迟加载* 这个方法会在适当的时机被调用执行实际的数据库查询*/public void load() throws SQLException {// 检查属性是否已经有值如果已经有值则不需要加载if (resultObject.getValue(property) ! null) {return;}// 执行实际的数据库查询ListObject list (ListObject) executor.query(mappedStatement,key.getParameterObject(),RowBounds.DEFAULT,Executor.NO_RESULT_HANDLER,key,mappedStatement.getBoundSql(key.getParameterObject()));// 处理查询结果if (list ! null list.size() 0) {if (list.size() 1) {// 多个结果设置为列表resultObject.setValue(property, list);} else {// 单个结果设置为单个对象resultObject.setValue(property, list.get(0));}}}}4. SimpleExecutor简单执行器4.1 核心实现SimpleExecutor是最基础的执行器每次执行都创建新的Statementpackage org.apache.ibatis.executor;/*** 简单执行器MyBatis的默认执行器* 特点每次执行都创建新的Statement对象* 优点简单可靠资源管理清晰* 缺点每次都要创建新Statement有一定性能开销*/public class SimpleExecutor extends BaseExecutor {/*** 构造方法* param configuration MyBatis全局配置* param transaction 事务管理器*/public SimpleExecutor(Configuration configuration, Transaction transaction) {super(configuration, transaction);}/*** 执行查询操作* 每次查询都会创建新的Statement对象*/Overridepublic E ListE doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {Statement stmt null;try {// 获取全局配置Configuration configuration ms.getConfiguration();// 创建 StatementHandler用于处理 SQL 语句StatementHandler handler configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);// 准备 Statement创建并设置参数stmt prepareStatement(handler, ms.getStatementLog());// 执行查询并返回结果return handler.query(stmt, resultHandler);} finally {// 无论成功还是失败都要关闭 StatementcloseStatement(stmt);}}/*** 执行更新操作包括 INSERT、UPDATE、DELETE*/Overridepublic int doUpdate(MappedStatement ms, Object parameter) throws SQLException {Statement stmt null;try {// 获取全局配置Configuration configuration ms.getConfiguration();// 创建 StatementHandlerStatementHandler handler configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);// 准备 Statementstmt prepareStatement(handler, ms.getStatementLog());// 执行更新并返回影响行数return handler.update(stmt);} finally {// 关闭 StatementcloseStatement(stmt);}}/*** 刷新批量操作* SimpleExecutor 不支持批量操作返回空列表*/Overridepublic ListBatchResult doFlushStatements(boolean isRollback) throws SQLException {return Collections.emptyList();}/*** 执行游标查询* 游标查询适用于大结果集的流式处理*/Overridepublic E CursorE doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql) throws SQLException {// 获取全局配置Configuration configuration ms.getConfiguration();// 创建 StatementHandlerStatementHandler handler configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, null, boundSql);// 准备 StatementStatement stmt prepareStatement(handler, ms.getStatementLog());// 返回游标对象注意游标不在这里关闭由调用者负责关闭return handler.queryCursor(stmt);}/*** 准备 Statement对象* 包括创建、设置超时、设置参数等操作*/private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {Statement stmt;// 获取数据库连接Connection connection getConnection(statementLog);// 创建 Statement 并设置超时时间stmt handler.prepare(connection, transaction.getTimeout());// 设置 SQL 参数handler.parameterize(stmt);return stmt;}/*** 关闭 Statement对象* 安全关闭忽略异常*/private void closeStatement(Statement stmt) {if (stmt ! null) {try {stmt.close();} catch (SQLException e) {// 忽略关闭异常避免影响主逻辑}}}}4.2 特点分析优势简单可靠逻辑简单易于理解和维护资源管理及时释放Statement资源避免内存泄漏线程安全每次执行创建新Statement无状态共享问题适用广泛适合大多数业务场景劣势性能开销每次执行都创建新Statement有一定性能开销重复工作相同SQL的重复执行无法复用Statement5. ReuseExecutor重用执行器5.1 核心实现ReuseExecutor通过重用Statement对象来提升性能package org.apache.ibatis.executor;/*** 重用执行器通过重用Statement对象来提升性能* 特点相同SQL会重用同一个Statement对象* 优点减少Statement创建开销提升性能* 适用场景重复执行相同SQL的场景*/public class ReuseExecutor extends BaseExecutor {// Statement缓存Map以SQL为键Statement为值private final MapString, Statement statementMap new HashMap();/*** 构造方法*/public ReuseExecutor(Configuration configuration, Transaction transaction) {super(configuration, transaction);}/*** 执行查询操作* 会尝试重用已存在的Statement*/Overridepublic E ListE doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {Configuration configuration ms.getConfiguration();StatementHandler handler configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);// 准备Statement可能会重用已存在的Statement stmt prepareStatement(handler, ms.getStatementLog());return handler.query(stmt, resultHandler);}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询