0

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

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

问题:

  • 就可靠性、安全性和性能而言,这是一种推荐的方法吗?还是有另一种最佳实践方法?
  • 这种方法可以防止 SQL 注入攻击吗?
  • 参数顺序很重要,让我很容易混淆它。有什么办法可以解决这个问题?
4

2 回答 2

1

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

于 2013-06-18T08:32:25.243 回答
1
  1. 您选择的方法使用供应商语法而不是 JDBC 调用语法(请参阅JDBC 连接prepareCall SQL 的语法),因此不能跨数据库移植(这对您来说可能不是问题)。Spring JDBC 提供了许多不同的方法来调用存储过程,没有明显的最佳方法。
  2. 这对 SQL 注入是安全的,除非存储过程本身容易受到 SQL 注入(将参数连接到查询中)。
  3. #setX(String, X)您可以使用 on 上的方法按名称而不是索引为存储过程绑定参数CallableStatement。您的数据库驱动程序可能不支持此功能。这与NamedParameterJdbcTemplate仍然按索引绑定的不同。另请注意,NamedParameterJdbcTemplate它在解析和重写您的查询时会产生一些开销。
于 2017-11-22T08:25:51.150 回答