PreparedStatement
是否可以在不设置初始 SQL 查询的情况下在 java中创建?
示例代码:
@Override
public List<AccountBean> search(AccountConstraint... c) {
if (c.length == 0) {
throw new IllegalArgumentException("dao.AccountDAO.search: c.length == 0");
}
try {
List<AccountBean> beans = new ArrayList<>();
for (AccountConstraint ac : c) {
PreparedStatement ps = connection.prepareStatement(null);
QueryBuilder queryBuilder = new QueryBuilder(ps, "SELECT * FROM accounts");
queryBuilder.add(ac.getAccountIdConstraint());
queryBuilder.add(ac.getUsernameConstraint());
queryBuilder.add(ac.getPasswordConstraint());
queryBuilder.add(ac.getEmailConstraint());
//INSERT QUERY INTO PS
ResultSet rs = ps.executeQuery();
while (rs.next()) {
beans.add(new AccountBean(rs));
}
}
return beans;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
诀窍在于QueryBuilder
,此类负责根据初始 SELECT 部分构建查询的部分,然后添加相应的 WHERE 和 AND 子句。
然而,为了确保所有数据都是安全的,实际的参数也必须放在 PreparedStatement 中,这就是为什么它被传递给 QueryBuilder。
EveryQueryBuilder.add()
将一些参数添加到 PreparedStatement 中,并将特定字符串附加到查询的末尾。
我认为一些变通方法是可能的,例如不给 aPreparedStatement
你QueryBuilder
会给 aList<Object>
然后你会写一个自定义函数把它们放在PreparedStatement
后面。
但是您对此有何想法和建议?
问候。
添加了解决方案
首先有几个关键变化:
QueryBuilder
现在正确地实现了 Builder 模式。QueryBuilder.add()
一次接受多个Constraint
s。AccountConstraint
现在可以给出一个给出所有Constraint
s 的数组。
@Override
public List<AccountBean> search(AccountConstraint... c) {
if (c.length == 0) {
throw new IllegalArgumentException("dao.AccountDAO.search: c.length == 0");
}
try {
List<AccountBean> beans = new ArrayList<>();
for (AccountConstraint ac : c) {
try (PreparedStatement ps = new QueryBuilder("SELECT * FROM accounts").add(ac.getConstraints()).build();ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
beans.add(new AccountBean(rs));
}
}
}
return beans;
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
附言。try{ }
由于 try-with-resources,我将两个语句合二为一。