作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个方法“getAllIDs()
”,用于获取数据库中特定表的 ID。它被我项目中的许多方法使用。
public static int[] getAllIDs (String TableName, String WhereClause, String trxName)
{
ArrayList<Integer> list = new ArrayList<Integer>();
StringBuffer sql = new StringBuffer("SELECT ");
sql.append(TableName).append("_ID FROM ").append(TableName);
if (WhereClause != null && WhereClause.length() > 0)
sql.append(" WHERE ").append(WhereClause);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql.toString(), trxName);
rs = pstmt.executeQuery();
while (rs.next())
list.add(new Integer(rs.getInt(1)));
}
}
Whereclause 是查询的条件部分。由于这个whereclause,有可能进行sql注入(inject)。所以我需要修改这个方法来使用准备语句参数设置来设置参数。我遇到的问题是因为“getAllIDs()
”不知道每个 whereclause 有多少个参数。
每个where子句的参数都会不同,可以是任意数字。对于某些类,参数将为 3,对于某些类,参数将为 2,等等,具有不同的数据类型。那么我如何使用 setstring()、setint() 等。用我发布的代码解释一下。
最佳答案
将额外的 PreparedStatementBinder
参数传递给该方法:
public interface PreparedStatementBinder {
/**
* Binds all the arguments to the given prepared statement
*/
public void bindArguments(PreparedStatement statement) throws SQLException;
}
调用者必须传递一个 where 子句(例如 "foo = ? and bar = ?"
),以及该接口(interface)的一个实例,例如
new PreparedStatementBinder() {
@Override
public void bindArguments(PreparedStatement statement) throws SQLException {
statement.setString(1, theFoo);
statement.setInt(2, theBar);
}
}
关于java - 将动态 WHERE 子句传递给 Java/JDBC 中的函数的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316015/
我是一名优秀的程序员,十分优秀!