您的位置:首页 > 其它

Mybatis执行ReuseExecutor(五)

2016-09-23 21:51 399 查看
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: