将预准备语句与 JDBC 模板结合使用

我正在使用JDBC模板,并希望使用预准备语句从数据库中读取。我循环访问.csv文件中的许多行,并在每一行上执行一些具有相应值的 SQL 选择查询。

我想加快从数据库读取的速度,但我不知道如何让JDBC模板使用准备好的语句。

ReadyStatementCreatorReadyStatementSetter。在此示例中,它们都是使用匿名内部类创建的。但在 PreparedStatementSetter 类中,我无权访问要在预准备语句中设置的值。

由于我正在迭代.csv文件,因此我无法将它们硬编码为字符串,因为我不了解它们。我也不能将它们传递给ReadkStatementSetter,因为构造函数没有参数。将我的价值观设定为最终值也是愚蠢的。

我习惯于创建准备的语句相当简单。类似的东西

PreparedStatement updateSales = con.prepareStatement(
    "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75); 
updateSales.setString(2, "Colombian"); 
updateSales.executeUpdate():

就像在这个Java教程中一样。


答案 1

默认情况下,如果您只使用窗体,则在内部执行自己的操作。Spring和您的数据库将为您管理编译的查询,因此您不必担心打开,关闭,资源保护等。春天的救赎恩典之一。指向Spring 2.5文档的链接。希望它能让事情变得更清晰。此外,语句缓存可以在 JDBC 级别完成,例如至少一些 Oracle 的 JDBC 驱动程序。这将比我所能胜任的更详细。JDBCTemplatePreparedStatement.update(String sql, Object ... args)


答案 2
class Main {
    public static void main(String args[]) throws Exception {
        ApplicationContext ac = new
          ClassPathXmlApplicationContext("context.xml", Main.class);
        DataSource dataSource = (DataSource) ac.getBean("dataSource");
// DataSource mysqlDataSource = (DataSource) ac.getBean("mysqlDataSource");

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        String prasobhName = 
        jdbcTemplate.query(
           "select first_name from customer where last_name like ?",
            new PreparedStatementSetter() {
              public void setValues(PreparedStatement preparedStatement) throws
                SQLException {
                  preparedStatement.setString(1, "nair%");
              }
            }, 
            new ResultSetExtractor<Long>() {
              public Long extractData(ResultSet resultSet) throws SQLException,
                DataAccessException {
                  if (resultSet.next()) {
                      return resultSet.getLong(1);
                  }
                  return null;
              }
            }
        );
        System.out.println(machaceksName);
    }
}

推荐