Mybatis执行ReuseExecutor
Posted 归田
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis执行ReuseExecutor相关的知识,希望对你有一定的参考价值。
ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map<String, Statement>,将执行的sql作为key,将执行的Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了,源码及分析如下:
/**
* @author Clinton Begin
*/
public class ReuseExecutor extends BaseExecutor
private final Map<String, Statement> statementMap = new HashMap<String, Statement>();
public ReuseExecutor(Configuration configuration, Transaction transaction)
super(configuration, transaction);
@Override
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException
//获得配置文件
Configuration configuration = ms.getConfiguration();
//获得statementHandler 包括插件内容
StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
//转换为PrepareStatement
Statement stmt = prepareStatement(handler, ms.getStatementLog());
return handler.update(stmt);
@Override
public <E> List<E> 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 stmt = prepareStatement(handler, ms.getStatementLog());
return handler.<E>query(stmt, resultHandler);
@Override
public List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException
for (Statement stmt : statementMap.values())
//关闭Statement
closeStatement(stmt);
//清空sql
statementMap.clear();
return Collections.emptyList();
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException
Statement stmt;
BoundSql boundSql = handler.getBoundSql();
//获得sql语句
String sql = boundSql.getSql();
//查看是否存在Statement
if (hasStatementFor(sql))
//如果存在就获取Statement
stmt = getStatement(sql);
else
Connection connection = getConnection(statementLog);
//否则通过连接创建一个Statement
stmt = handler.prepare(connection);
//将sql语句及对应的Statement 保存到map中
putStatement(sql, stmt);
handler.parameterize(stmt);
return stmt;
private boolean hasStatementFor(String sql)
try
//查看map中是否含有sql语句对应的Statement
return statementMap.keySet().contains(sql) && !statementMap.get(sql).getConnection().isClosed();
catch (SQLException e)
return false;
private Statement getStatement(String s)
//获得Sql语句对应的Statement
return statementMap.get(s);
private void putStatement(String sql, Statement stmt)
//将sql语句及对应的Statement保存到map中
statementMap.put(sql, stmt);
以上是关于Mybatis执行ReuseExecutor的主要内容,如果未能解决你的问题,请参考以下文章