Как правильно использовать PreparedStatementCreator Spring JDBC?
Насколько я понимаю, использование PreparedStatement в Java, мы можем использовать его несколько раз. Но у меня есть некоторая путаница с использованием PreparedStatementCreator Spring JDBC.
Например, рассмотрите следующий код,
public class SpringTest {
JdbcTemplate jdbcTemplate;
PreparedStatementCreator preparedStatementCreator;
ResultSetExtractor<String> resultSetExtractor;
public SpringTest() throws SQLException {
jdbcTemplate = new JdbcTemplate(OracleUtil.getDataSource());
preparedStatementCreator = new PreparedStatementCreator() {
String query = "select NAME from TABLE1 where ID=?";
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
return connection.prepareStatement(query);
}
};
resultSetExtractor = new ResultSetExtractor<String>() {
public String extractData(ResultSet resultSet) throws SQLException,
DataAccessEx,ception {
if (resultSet.next()) {
return resultSet.getString(1);
}
return null;
}
};
}
public String getNameFromId(int id){
return jdbcTemplate.query(preparedStatementCreator, new Table1Setter(id), resultSetExtractor);
}
private static class Table1Setter implements PreparedStatementSetter{
private int id;
public Table1Setter(int id) {
this.id =id;
}
@Override
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, id);
}
}
public static void main(String[] args) {
try {
SpringTest springTest = new SpringTest();
for(int i=0;i<10;i++){
System.out.println(springTest.getNameFromId(i));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Согласно этому коду, когда я вызывал метод springTest.getNameFromId (int id), он возвращает имя из заданного идентификатора. Здесь я использовал PreparedStatementCreator для создания PreparedStatement и PreparedStatementSetter для установки входных параметров, и я получил результат из ResultSetExtractor. Но производительность очень низкая.
После отладки и изучения того, что происходит внутри PreparedStatementCreator и JdbcTemplate, я узнал, что PreparedStatementCreator каждый раз создает новый PreparedStatement ... !!!
Каждый раз, когда я вызываю метод jdbcTemplate.query (prepareStatementCreator, readyStatementSetter, resultSetExtractor), он создает новый PreparedStatement, и это замедляет производительность.
Это правильный способ использования PreparedStatementCreator? Потому что в этом коде я не смог повторно использовать PreparedStatement. И если это правильный способ использования PreparedStatementCreator, то как получить выгоду от повторного использования PreparedStatement?