Как минимум, вам, вероятно, следует переключиться на PreparedStatement
вместо простых утверждений.Причина этого заключается в том, что драйвер JDBC в большинстве случаев отправляет инструкцию в базу данных при создании, чтобы ее можно было предварительно скомпилировать.Затем вы можете связать свои параметры с оператором и выполнить.Помимо преимуществ производительности при прекомпиляции, вы также получаете небольшую защиту от атак с использованием SQL-инъекций, поскольку способ задания параметров более строго типизирован.На сайте Oracle есть хорошее описание подготовленных операторов.
Если вы используете Spring (или хотите сделать скачок, чтобы добавить его в свою систему), вы можете посмотретьв классах JdbcTemplate
и JdbcDaoSupport
(оба обозначены здесь ).Основным преимуществом является то, что он заботится о коде очистки соединения для вас (так что вам не нужно сильно беспокоиться о пропущенном вызове close
).
Аналогичным образом, если вы добавите Spring в свой проект, вы можете использовать его для настройки транзакций (с помощью аннотаций или из файла контекста Spring).Это позволит вам вывести управление транзакциями из реальной реализации и сделать код в вашем Dao немного чище.
Что касается обработки commit / close: вы должны убрать свои операторы commit из вашего finallyблоки и в основной путь выполнения.Вы должны хранить свои операторы close в блоке finally, хотя, поскольку вы хотите следовать, они происходят независимо от того, что.
Пример того, как будет выглядеть ваш код обновления с использованием PreparedStatements:
public void updateMethod() {
Connection con = null;
PreparedStatement stmt = null;
int updateCount = null;
try {
con = BoneCPConnection.getConnectionPool().getConnection();
stmt = con.prepareStatement("update example set id = ?");
stmt.setInt(1,1);
updateCount = stmt.executeUpdate(query);
con.commit();
} catch (Exception e) {
if(con != null){
con.rollback();
}
} finally {
try {
if(stmt != null){
stmt.close();
}
if(con != null){
con.close();
}
} catch (Exception e) {
con = null;
}
}
}
Если вы используете Spring JdbcDaoSuport, он будет выглядеть так:
public class YourDao extends JdbcDaoSupport{
public void updateMethod(){
String sql = "update example set id = ?";
getJdbcTemplate().update(sql, new Object[] { new Integer(1)});
}
}