关于mybatis里面的Executor

设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!! 告别手动画图,提高效率~ 阅读详情

原文地址:http://blog.youkuaiyun.com/w_intercool/article/details/7893344

使用mybatis查寻数据,跟踪其执行流程

最开始执行的语句

 

[java]  view plain copy print ?
 
  1. this.getSqlSession().selectList("QUERY-QUESTION", data, rowBounds);  

这里需要找到sqlsession是从哪里来的

getSqlSession是SqlSessionDaoSupport类里面的方法,该类通过spring的自动注入可以把sqlSessionTemplate注入进来,当然这里的sqlSessionTemplate是需要spring配置的

 

[java]  view plain copy print ?
 
  1. @Autowired(required = false)  
  2. public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {  
  3.   this.sqlSession = sqlSessionTemplate;  
  4.   this.externalSqlSession = true;  
  5. }  

 

[html]  view plain copy print ?
 
  1. <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
  2.         <constructor-arg index="0" ref="sqlSessionFactory"/>  
  3.         <constructor-arg index="1" value="BATCH"/>  
  4.     </bean>  

@Autowired(required = false)是通过类型匹配来注入的,如果没有找到相应对,就不用注入

所以selectList方法为SqlSessionTemlate里面的,再看SqlSessionTemplage,里面的都是通过sqlSessionProxy来执行selectList方法的,也就是通过代理方式来的

 

[java]  view plain copy print ?
 
  1. public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,  
  2.     PersistenceExceptionTranslator exceptionTranslator) {  
  3.   
  4.   notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");  
  5.   notNull(executorType, "Property 'executorType' is required");  
  6.   
  7.   this.sqlSessionFactory = sqlSessionFactory;  
  8.   this.executorType = executorType;  
  9.   this.exceptionTranslator = exceptionTranslator;  
  10.   this.sqlSessionProxy = (SqlSession) newProxyInstance(  
  11.       SqlSessionFactory.class.getClassLoader(),  
  12.       new Class[] { SqlSession.class },  
  13.       new SqlSessionInterceptor());  
  14. }  


这里用到了java的动态代理,详细可以见java api,有详细的说明

 

SqlSessionInterceptor实现了InvocationHandler,在invoke方法里面的开始有这样代码,那里是真正的sqlsession

 

[java]  view plain copy print ?
 
  1. final SqlSession sqlSession = getSqlSession(  
  2.          SqlSessionTemplate.this.sqlSessionFactory,  
  3.          SqlSessionTemplate.this.executorType,  
  4.          SqlSessionTemplate.this.exceptionTranslator);  

跟踪geteSqlSession可以找到他的创建来源,见

 

[java]  view plain copy print ?
 
  1. SqlSession session = sessionFactory.openSession(executorType);  


继续跟踪可以找到DefaultSqlSessionFactory里面的该方法

 

 

[java]  view plain copy print ?
 
  1. private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {  
  2.   Transaction tx = null;  
  3.   try {  
  4.     final Environment environment = configuration.getEnvironment();  
  5.     final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);  
  6.     tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);  
  7.     final Executor executor = configuration.newExecutor(tx, execType, autoCommit);  
  8.     return new DefaultSqlSession(configuration, executor);  
  9.   } catch (Exception e) {  
  10.     closeTransaction(tx); // may have fetched a connection so lets call close()  
  11.     throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);  
  12.   } finally {  
  13.     ErrorContext.instance().reset();  
  14.   }  
  15. }  


通过

[java]  view plain copy print ?
 
  1. final Executor executor = configuration.newExecutor(tx, execType, autoCommit);  

 

你就知道executor是怎么回来的了

mybatis默认使用了cache,在创建exector时,外面就包了一层CacheExecutor,详细见

 

[java]  view plain copy print ?
 
  1. public Executor newExecutor(Transaction transaction, ExecutorType executorType, boolean autoCommit) {  
  2.   executorType = executorType == null ? defaultExecutorType : executorType;  
  3.   executorType = executorType == null ? ExecutorType.SIMPLE : executorType;  
  4.   Executor executor;  
  5.   if (ExecutorType.BATCH == executorType) {  
  6.     executor = new BatchExecutor(this, transaction);  
  7.   } else if (ExecutorType.REUSE == executorType) {  
  8.     executor = new ReuseExecutor(this, transaction);  
  9.   } else {  
  10.     executor = new SimpleExecutor(this, transaction);  
  11.   }  
  12.   if (cacheEnabled) {  
  13.     executor = new CachingExecutor(executor, autoCommit);  
  14.   }  
  15.   executor = (Executor) interceptorChain.pluginAll(executor);  
  16.   return executor;  
  17. }  


CachingExecutor可以使mybatis先从缓存中提取数据,数据缓存中没有数据时才从数据库里面提取数据。

上万条对话白分析了?智能客服质检避坑指南:90%团队倒在这些误区 当前客服质检普遍存在投入产出失衡的现象,根源在于十大误区:过度关注单点技术指标而忽视端到端解决能力、僵化的话术模板限制AI应变、数据孤岛阻碍知识进化、盲目追求拟人化牺牲效率、传统整改机制跟不上机器速度等。破局需重构质检体系,包括建立决策树质检法、设计复杂问题测试集、构建实时数据闭环、重置AI专属评价指标、实施分钟级热修复机制等。关键在于将质检从被动纠错升级为主动赋能,通过根因分析、场景化反馈、标准化评分和数据驱动优化,打造"问题诊断-改进-验证" 阅读详情

相关推荐

Windows 11安装 SQLServer 2008 R2 失败问题处理

Windows 11安装SQL Server 2008 R2失败解决方案 由于Windows 11移除了对PowerShell 2.0的支持,导致SQL Server 2008 R2安装失败。经过多次尝试,最终通过**方案六(修改注册表模拟PowerShell 2.0环境)**成功安装。其他可行方案包括: 使用SP3集成版安装包 通过命令行跳过检查(/SUPPRESSPOWERShellCHECK参数) 创建特殊配置文件 替代方案建议: 使用Docker容器运行 在虚拟机中安装 升级到新版SQL Serve

oDengWei的博客 7210

mybatis批量插入优化(ExecutorType.BATCH/BatchInsert/executeBatch)

Mybatis内置的有3种,默认的是simple单句模式,该模式下它为每个语句的执行创建一个新的预处理语句,单句提交sql;batch模式重复使用已经预处理的语句,并且批量执行所有语句,大批量模式下性能更优。请注意batch模式在Insert操作时事务没有提交之前,是没有办法获取到自增的id,所以请根据业务情况使用。使用simple模式提交10000条数据,时间为19s,batch模式为6s ,大致情况如此,优化的具体还要看提交的语句情况。如果需要使用foreach。

★【World Of Moshow 郑锴】★ 3万+

PointNetLK实战:5步搞定点云配准(附ModelNet40数据集训练技巧)

本文提供了一份详细的PointNetLK实战指南,帮助读者在5步内掌握点云配准技术。文章以ModelNet40数据集为例,深入讲解了环境搭建、数据预处理、模型训练与调试等核心步骤,并分享了关键的训练技巧和调参策略,旨在让开发者快速实现并应用这一高效的深度学习配准方法。

wind6的博客 462

Mybatis中的Executor

使用mybatis查寻数据,跟踪其执行流程 最开始执行的语句 [java] view plaincopyprint? this.getSqlSession().selectList("QUERY-QUESTION", data, rowBounds);   这里需要找到sqlsession是从哪里来的 getSqlSessi

秋水长天的专栏 1362

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南

本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。

weixin_42525005的博客 222

Python数据可视化 Pyecharts 制作 Map 地图

大家好,我是Mr数据杨。想象一下,作为一名军师,如诸葛亮或郭嘉,'Map’就如同那战争的沙盘,兵马行动的轨迹,都需要准确的地图作为基础。‘基本设置’,就如同摆设这张战争沙盘,规定棋子的起始位置。‘数据配置选项’和’地图数据项’,就好比是军师们手中的情报,了解各路诸侯的兵力、粮草、地形等重要信息,以便于他们更好地布局。‘Demo’则代表着练兵之地,军师们可以在此基于已有数据,试验各种战术。

Mr数据杨 4万+

Mybatis源码分析之-Executor,java程序员面试简历

这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

2401_83973995的博客 319

Jetson nano 系列之2—板载摄像头IMX219启动

我选用的是亚博科技jetson nano的开发板。

驽马十驾,功在不舍;锲而不舍,金石可镂。 4275

MyBatis 批量插入ExecutorType.BATCH效率对比

一、在mybatis中ExecutorType的使用 1.Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句, 并且批量执行所有更新语句,显然batch性能将更优;   2.但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法...

u012045045的博客 4767

串口、COM、UART、TTL、USB、RS-232、RS-485、I2C、SPI、CAN、1-WIRE

一文搞定,赶紧收藏吧

记得诚 3万+

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 610

Mybatis中的执行器(Executor)

在之前的文章中介绍了mybatis的基本使用,从使用流程中可知,在每次执行CURD的时候,都需要获取SqlSession这个对象,接口如下: 可以看出来这个接口主要定义类关于CRUD、数据库事务、数据库刷新等相关操作。下面看它的默认实现类: 可以看到DefaultSqlSession 实现了SqlSession中的方法,(其实我们自己也可根据需要去实现) 而在这个方法中,存在一个属性就是今天需要将的主角,Mybatis的执行器(Executor)。 Executor简单介绍 Exec.

liming0025的专栏 8092

YOLO26改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达

简单相加、拼接融合无法建立深浅层双向约束关系,浅层微小目标易被深层背景覆盖,深层全局信息难以修正浅层噪声;普通单路自注意力仅单一层内建模依赖,缺少跨层级特征互引导机制,深浅特征信息割裂;标准多头跨注意力计算量大、参数量高,轻量化单模态检测/分割网络部署困难,无法区分前景目标与背景噪声。为此设计单模态轻量化交叉注意力LCA,构建浅层细节、深层语义双分支双向引导结构,轻量完成跨层级特征交互,同步降噪并强化单模态微小目标特征。

Limiiiing的博客 523

MyBatis【Executor】

MyBatis Excutor、一级缓存、二级缓存

cinnabar2016的博客 1403

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Mybatis解析-执行器Executor详解

本文基于mybatis-spring 1.3.1和mybatis 3.4.4版本 SqlSession执行增删改查都是委托给Executor完成的。 Executor主要完成以下几项内容: 处理缓存,包括一级缓存和二级缓存 获取数据库连接 创建Statement或者PrepareStatement对象 访问数据库执行SQL语句 处理数据库返回结果 CachingExecutor BaseExecutor SimpleExecutor BatchExecutor ReuseExecutor

龚厂长的博客 3463

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mybatis四大对象之Executor

mybatis中sqlsession下的四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。这篇文章主要介绍了Mybatis中SqlSession下的四大对象之执行器(executor),需要的朋友可以参考下 首先我先解释一下标题 四大对象是指:executor, statementHandler,parameter...

s297485987的专栏 659

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精通Mybatis之Executor执行器

前言 之前小编写的文章从未有过精通二字,因为感觉自己不配,这次发奋图强努力做到第一个框架的精通,就是这Mybatis了。为什么挑Mybatis因为他比较简洁(源码里面连注释都不太有),然后国内用的比较广泛以及代码量不大。小编还是比较有信心的,这次学习源码如之前在其他文章中所说的,我们从最核心开始,然后一步一步往外扩展,毕竟最外部的调用Api往往做了层层封装运用了各种设计模式,代码的联调也会不断的跳跃,让人很痛苦。所以咱们扒开外层看本质。一如既往的废话不多说,进入正题。 JDBC回顾 众所周知,Mybatis

a1032722788的博客 6201

mybatis Executor

Executor (https://my.oschina.net/zudajun/blog/667214) when? SqlSessionFactory创建Executor,并将Executor作为defaultSqlSession的构造参数传进去 what? sqlsession中利用Executor完成实际的sql操作 executor操作包括查询及更新(CUD) E...

绿香蕉fighting 525

MyBatis 中 Executor

功能描述SQL 执行引擎统一调度 StatementHandler、ParameterHandler、ResultSetHandler事务管理提供 commit / rollback 接口一级缓存避免重复查询相同 SQL二级缓存支持通过装饰器实现批处理支持提升批量插入/更新效率可扩展性强可以自定义 Executor 实现特定业务逻辑。

红血哥 491

mybatis-executor解析

概述 执行器包主要包含了 Executor、ParameterHandler、ResultSetHandler、StatementHandler。 这些都是sql执行中非常重要的一环,本篇从Executor开始。 Executor:执行器,主要职责是在sql执行过程中添加缓存和事务的功能。与jdbc相关的操作会继续委托给StatementHandler。 Executor public interface Executor { ResultHandler NO_RESULT_HANDLER = nu

qq_28695733的博客 426

Mybatis的Executor执行器

Executor功能概述 每一个sql语句的执行都会先到Executor执行器中在调用相应StatementHandler执行jdbc操作。源码如下SimpleExecutor中的代码片段 public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLExc

qq_39791272的博客 471

MyBatis之Executor组件

一、整体介绍 先看Executor继承结构图: 再看其内部结构图: 可以看到,Executor在SqlSession中,实际上我们都是面向SqlSession编程的,不会直接调用Executor来执行业务逻辑,这里只是深入研究一下。 常用的Executor有三个,SimpleExecutor、BatchExecutor、ReuseExecutor。模式是SimpleExecutor,可以在mybatis配置文件中进行配置: <settings> <setting nam

敲代码的小小酥的博客 771

Mybatis的源码学习之Executor

1.概述 Executor接口是Mybatis的执行器,是Mybatis的调度中心,是SQL语句的生成和查询缓存的维护。Executor是通过Configuration的newExecutor函数来生成的。 2.Executor结构 下面介绍一下Executor接口的实现类以及实现类的继承类之间关系。 从上面的Executor的结构图,我们得到了Executor接口有两个实现类分别为:...

gelong_bokewang的博客 260

Mybatis源码学习(四)——Executor

根据之前对 SqlSession 类的分析()可以发现 SqlSession 与数据库交互的方法都是通过 Executor 对象进行;因此首先对 Executor 接口进行分析,看其拥有什么方法;第一步我们可以发现 Executor 接口拥有一个 ResultHandler 的常量,但其值却为 null,起作用之后再详述;

weixin_63445802的博客 1410

Mybatis中如何指定使用Executor执行器

MyBatis 提供了和三种主要的Executor类型,每种类型都适用于不同的场景。开发者可以通过全局配置或在代码中动态选择合适的Executor,以优化数据库操作的性能。全局配置:在中设置来指定全局默认使用的Executor类型。局部配置:在代码中通过方法动态指定Executor类型。

Flying_Fish_roe的博客 1441
上一篇: 在FreeMarker框架中使用Shiro的Tag标签
下一篇: 使用Redis做MyBatis的二级缓存
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值