在Spring中调用DB存储的例程

时间:2013-06-18 08:12:11

标签: spring stored-procedures

我有MySQL存储例程,需要从我的Java Spring应用程序中调用它们。目前我这样做:

result = org.springframework.jdbc.core.JdbcTemplate.query(
     "CALL MyRoutine(?, ?);", 
     myRowMapper, 
     parameterOne, 
     parameterTwo);

问题:

  • 在可靠性,安全性和性能方面,这是否是推荐的方法?或者还有其他最佳实践方法吗?
  • 此方法是否可以防止SQL注入攻击?
  • 参数顺序很重要,这使我容易混淆它。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用NamedParameterJdbcTemplate绕过参数顺序。见http://static.springsource.org/spring/docs/3.0.x/reference/jdbc.html

答案 1 :(得分:1)

  1. 您选择的方法使用供应商语法而不是JDBC调用语法(请参阅Syntax of JDBC Connection prepareCall SQL),因此不能跨数据库移植(这可能不是您的问题)。 Spring JDBC提供many different ways来调用存储过程,没有明显的最佳方法。
  2. 除非存储过程本身易受SQL注入攻击(将参数连接到查询中),否则这对SQL注入是安全的。
  3. 您可以使用#setX(String, X)上的CallableStatement方法按名称而不是索引来绑定存储过程的参数。您的数据库驱动程序可能不支持此功能。这与仍然按索引绑定的NamedParameterJdbcTemplate不同。另请注意,NamedParameterJdbcTemplate在分析和重写查询时会有一些开销。