关于mybatis里面的Executor--转载

关于mybatis里面的Executor--转载,第1张

概述原文地址:http://blog.csdn.net/w_intercool/article/details/7893344使用mybatis查寻数据,跟踪其执行流程最开始执行的语句 [java] view plaincopyprint? this.getSqlSession().selectList("QUERY-QUESTION", data, rowBounds);  这里需要找到sqlsession是从哪里来的getSqlSession是SqlSessionDaoSupport类里面的方法,该类通过spring的自动注入可以把sqlSessionTemplate注入进来,当然这里的sqlSessionTemplate是需要spring配置的 [java] view plaincopyprint? @Autowired(required = false)  public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {    this.sqlSession = sqlSessionTemplate;    this.externalSqlSession = true;  }   [html] view plaincopyprint? <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">          <constructor-arg index="0" ref="sqlSessionFactory"/>          <constructor-arg index="1" value="BATCH"/>      </bean>  @Autowired(required = false)是通过类型匹配来注入的,如果没有找到相应对,就不用注入所以selectList方法为SqlSessionTemlate里面的,再看SqlSessionTemplage,里面的都是通过sqlSessionProxy来执行selectList方法的,也就是通过代理方式来的 [java] view plaincopyprint? public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,      PersistenceExceptionTranslator exceptionTranslator) {      notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");    notNull(executorType, "Property 'executorType' is required");      this.sqlSessionFactory = sqlSessionFactory;    this.executorType = executorType;    this.exceptionTranslator = exceptionTranslator;    this.sqlSessionProxy = (SqlSession) newProxyInstance(        SqlSessionFactory.class.getClassLoader(),        new Class[] { SqlSession.class },        new SqlSessionInterceptor());  }  这里用到了java的动态代理,详细可以见java api,有详细的说明 SqlSessionInterceptor实现了InvocationHandler,在invoke方法里面的开始有这样代码,那里是真正的sqlsession [java] view plaincopyprint? final SqlSession sqlSession = getSqlSession(           SqlSessionTemplate.this.sqlSessionFactory,           SqlSessionTemplate.this.executorType,           SqlSessionTemplate.this.exceptionTranslator);  跟踪geteSqlSession可以找到他的创建来源,见 [java] view plaincopyprint? SqlSession session = sessionFactory.openSession(executorType);  继续跟踪可以找到DefaultSqlSessionFactory里面的该方法  [java] view plaincopyprint? private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {    Transaction tx = null;    try {      final Environment environment = configuration.getEnvironment();      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);      final Executor executor = configuration.newExecutor(tx, execType, autoCommit);      return new DefaultSqlSession(configuration, executor);    } catch (Exception e) {      closeTransaction(tx); // may have fetched a connection so lets call close()      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);    } finally {      ErrorContext.instance().reset();    }  }  通过[java] view plaincopyprint? final Executor executor = configuration.newExecutor(tx, execType, autoCommit);   你就知道executor是怎么回来的了mybatis默认使用了cache,在创建exector时,外面就包了一层CacheExecutor,详细见 [java] view plaincopyprint? public Executor newExecutor(Transaction transaction, ExecutorType executorType, boolean autoCommit) {    executorType = executorType == null ? defaultExecutorType : executorType;    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;    Executor executor;    if (ExecutorType.BATCH == executorType) {      executor = new BatchExecutor(this, transaction);    } else if (ExecutorType.REUSE == executorType) {      executor = new ReuseExecutor(this, transaction);    } else {      executor = new SimpleExecutor(this, transaction);    }    if (cacheEnabled) {      executor = new CachingExecutor(executor, autoCommit);    }    executor = (Executor) interceptorChain.pluginAll(executor);    return executor;  }  CachingExecutor可以使mybatis先从缓存中提取数据,数据缓存中没有数据时才从数据库里面提取数据。

原文地址:http://blog.csdn.net/w_intercool/article/details/7893344

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

最开始执行的语句

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

 

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

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

   

<div >
<div >
<div >
[HTML] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

                     

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

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

     PersistenceExceptionTranslator exceptionTranslator) {    notNull(sqlSessionFactory,             }  

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

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

          sqlSessionTemplate.         sqlSessionTemplate.

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

 

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

 
  Transaction tx =         tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);          closeTransaction(tx);   }   }  

通过

[java]  

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

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

<div >
<div >
<div >
[java] <a title="view plain" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;view plain<a title="copy" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;copy<a title="print" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;print<a title="?" href="http://blog.csdn.net/w_intercool/article/details/7893344"&gt;?

 
  executorType = executorType ==   Executor executor;      executor =     executor =     executor =     }    

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

总结

以上是内存溢出为你收集整理的关于mybatis里面的Executor--转载全部内容,希望文章能够帮你解决关于mybatis里面的Executor--转载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1169163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存