繁体   English   中英

如何在Spring JDBCTemplate中正确使用准备好的语句?

[英]How to use a prepared statement correctly with Spring JDBCTemplate?

我必须对将经常执行的数据库进行选择查询。 使用正常语句,它可以正常工作:

 List<Invoice> l = this.jdbcTemplate.query(
                     "SELECT id, name, stuff FROM example WHERE amount > ?",
                     new Object[] { "100" }, new RowMapper<Invoice>() {...} );

我经常执行上面的语句,因此出于性能原因,我想使用准备好的语句。 但是我现在不确定如何正确地使用spring API来实现这一点。

我很困惑,为什么spring希望我提供一个PreparedStatementCreator的实例作为查询的参数? 我认为这就是我每次使用查询方法时都不创建新的准备好的语句的关键。 因此,我认为以下代码段中的内容绝对是毫无意义的,因为每次我调用query -method时都会创建新的预处理语句:

 List<Invoice> l = this.jdbcTemplate.query(
                     new PreparedStatementCreator() {
                         String query = "SELECT id, name, stuff FROM example WHERE amount > ?";
                         public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                              return connection.prepareStatement(query);
                         }
                     },
                     new PreparedStatementSetter() {...}, 
                     new RowMapper<Invoice>() {...} );

我必须创建自己的ReusablePreparedStatementCreator吗? 这只会在第一次调用createPreparedStatement创建一个新方法。

PreparedStatementCreatorFactory帮助我吗?

因此,换句话说,我如何正确创建一个选择查询,该查询使用带有Spring JDBCTemplate的预准备语句来真正获得性能优势而又不失去RowMapper的优势?

首先,我不确定您不必每次都不重新创建预备语句会显着提高性能,因为JDBC驱动程序/数据库通常会缓存预备语句。

但是,如果您想使用一个准备好的语句执行多个查询,只需使用JdbcTemplate的execute()方法之一,它就可以通过SQL查询创建一个准备好的语句(或让您创建它),然后执行一个使用准备好的语句作为参数。 您可以在此回调内部循环,并根据需要多次执行该语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM