Java:
PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();
如果我的存储例程在 MySQL 中,未过滤的字符串是否有可能向我的代码中注入(inject)一些东西?
不,因为 PreparedStatement
是为了防止 SQL 注入(inject)
而构建的。
我看到您正在调用存储过程,所以最好使用 CallableStatement
。
String SQL = "{CALL myStoredRoutine(?, ?, ?)}";
CallableStatement cstmt = myConnection.prepareCall(SQL);
PreparedStatement 实例包含一条已编译的 SQL 语句。这就是使声明“准备好”的原因
因为 PreparedStatement 对象是预编译的,所以它们的执行速度可以比 Statement 对象快。
准备好的语句用于执行sql查询
CallableStatement 对象提供了一种以标准方式为所有 RDBMS 调用存储过程的方法。存储过程存储在数据库中;对存储过程的调用是 CallableStatement 对象包含的内容。
我是一名优秀的程序员,十分优秀!