1 16 package scriptella.jdbc; 17 18 import scriptella.spi.ParametersCallback; 19 import scriptella.spi.QueryCallback; 20 import scriptella.util.ExceptionUtils; 21 import scriptella.util.IOUtils; 22 23 import java.io.Closeable ; 24 import java.sql.PreparedStatement ; 25 import java.sql.ResultSet ; 26 import java.sql.SQLException ; 27 import java.sql.Statement ; 28 import java.util.List ; 29 30 36 abstract class StatementWrapper<T extends Statement > implements Closeable { 37 protected final JdbcTypesConverter converter; 38 protected final T statement; 39 40 43 protected StatementWrapper() { 44 converter = null; 45 statement = null; 46 } 47 48 protected StatementWrapper(T statement, JdbcTypesConverter converter) { 49 if (statement == null) { 50 throw new IllegalArgumentException ("statement cannot be null"); 51 } 52 if (converter == null) { 53 throw new IllegalArgumentException ("converter cannot be null"); 54 } 55 this.statement = statement; 56 this.converter = converter; 57 } 58 59 62 public void close() { 63 JdbcUtils.closeSilent(statement); 64 } 65 66 67 74 public abstract int update() throws SQLException ; 75 76 82 protected abstract ResultSet query() throws SQLException ; 83 84 public void query(final QueryCallback queryCallback, final ParametersCallback parametersCallback) throws SQLException { 85 ResultSetAdapter r = null; 86 try { 87 r = new ResultSetAdapter(query(), parametersCallback, converter); 88 while (r.next()) { 89 queryCallback.processRow(r); 90 } 91 } finally { 92 IOUtils.closeSilently(r); 93 } 94 } 95 96 public void setParameters(final List <Object > params) throws SQLException { 97 } 98 99 102 public void clear() { 103 } 104 105 108 public String toString() { 109 return statement.toString(); 110 } 111 112 113 116 static class Simple extends StatementWrapper<Statement > { 117 private final String sql; 118 119 122 protected Simple(String sql) { 123 this.sql = sql; 124 } 125 126 public Simple(Statement s, String sql, JdbcTypesConverter converter) { 127 super(s, converter); 128 this.sql = sql; 129 } 130 131 @Override 132 public int update() throws SQLException { 133 return statement.executeUpdate(sql); 134 } 135 136 @Override 137 protected ResultSet query() throws SQLException { 138 return statement.executeQuery(sql); 139 } 140 141 } 142 143 146 static class Prepared extends StatementWrapper<PreparedStatement > { 147 150 protected Prepared() { 151 } 152 153 public Prepared(PreparedStatement s, JdbcTypesConverter converter) { 154 super(s, converter); 155 } 156 157 164 @Override 165 public void setParameters(List <Object > params) throws SQLException { 166 for (int i = 0, n = params.size(); i < n; i++) { 167 Object o = params.get(i); 168 converter.setObject(statement, i + 1, o); 169 } 170 } 171 172 @Override 173 public int update() throws SQLException { 174 try { 175 return statement.executeUpdate(); 176 } finally { 177 converter.close(); } 179 } 180 181 @Override 182 protected ResultSet query() throws SQLException { 183 return statement.executeQuery(); 184 } 185 186 @Override 187 public void clear() { 188 try { 189 statement.clearParameters(); 190 } catch (SQLException e) { 191 ExceptionUtils.ignoreThrowable(e); 192 } 193 194 } 195 196 } 197 198 199 } 200 | Popular Tags |