package jef.database.routing.jdbc; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.List; import jef.database.jdbc.GenerateKeyReturnOper; import jef.database.jdbc.JDBCTarget; import jef.database.jdbc.result.ResultSetHolder; public class SimpleSQLExecutor implements SQLExecutor { private String sql; private JDBCTarget db; private int fetchSize; private int maxRows; private int queryTimeout; public SimpleSQLExecutor(JDBCTarget target, String sql) { this.db = target; this.sql = sql; } @Override public UpdateReturn executeUpdate(GenerateKeyReturnOper oper, List<ParameterContext> params) throws SQLException { PreparedStatement st = oper.prepareStatement(db, sql); try { for (ParameterContext context : params) { context.apply(st); } UpdateReturn result = new UpdateReturn(st.executeUpdate()); oper.getGeneratedKey(result, st); return result; } finally { st.close(); } } @Override public ResultSet getResultSet(int type, int concurrency, int holder, List<ParameterContext> params) throws SQLException { if (type < 1) { type = ResultSet.TYPE_FORWARD_ONLY; } if (concurrency < 1) { concurrency = ResultSet.CONCUR_READ_ONLY; } if (holder < 1) { holder = ResultSet.CLOSE_CURSORS_AT_COMMIT; } PreparedStatement st = db.prepareStatement(sql, type, concurrency, holder); try { if (fetchSize > 0) st.setFetchSize(fetchSize); if (maxRows > 0) ; st.setMaxRows(maxRows); if (queryTimeout > 0) st.setQueryTimeout(queryTimeout); for (ParameterContext context : params) { context.apply(st); } ResultSet rs = st.executeQuery(); return new ResultSetHolder(db, st, rs); } finally { st.close(); } } @Override public void setFetchSize(int fetchSize) { this.fetchSize = fetchSize; } @Override public void setMaxResults(int maxRows) { this.maxRows = maxRows; } @Override public void setQueryTimeout(int queryTimeout) { this.queryTimeout = queryTimeout; } @Override public BatchReturn executeBatch(GenerateKeyReturnOper oper, List<List<ParameterContext>> params) throws SQLException { PreparedStatement st = oper.prepareStatement(db, sql); for (Collection<ParameterContext> param : params) { for (ParameterContext context : param) { context.apply(st); } st.addBatch(); } try { int[] re = st.executeBatch(); BatchReturn result = new BatchReturn(re); oper.getGeneratedKey(result, st); return result; } finally { st.close(); } } }