代码很简单,需要注意一个地方:
事务提交或者回滚无需手动setAutoCommit(true)
因为数据库连接池的connection是一个包装类,他的close方法中会还原connection为初始状态。
Connection conn = null;
QueryRunner runner = new QueryRunner();
//获取数据库连接
try {
conn = getConnection(wrapper.getDataSource(), wrapper.getTest());
//开启事务
if (needTransaction) {
conn.setAutoCommit(false);
}
//将每条sql的返回值保存在input中: $1 $2 $3以此类推,用于之后的sql使用
for (int i = 0; i < sqlList.size(); i++) {
String sql = sqlList.get(i);
SqlAndParams sqlAndParams = DynamicSqlParser.parseSql(sql, input);
output = executeSql(conn, runner, sqlAndParams);
input.put("$" + (i + 1), output);
}
//提交事务
if (needTransaction) {
commitAndCloseQuietly(conn);
}
return output;
} catch (Exception e) {
//回滚
if (needTransaction) {
rollbackAndCloseQuietly(conn);
}
throw new BaseException(e, INTERNAL_ERROR_CODE, SQL_ERROR + e.getCause());
} finally {
closeQuietly(conn);
}
网友评论