是否可以在没有设置初始SQL查询的情况下在java中创建PreparedStatement
?Java创建没有SQL内容的PreparedStatement
示例代码:
@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。
每个QueryBuilder.add()
都会在PreparedStatement中添加一些参数,并将特定的字符串附加到查询的末尾。
我想一些解决方法是可能的,如不是给一个PreparedStatement
到QueryBuilder
你会给一个List<Object>
,然后你会写这使他们在PreparedStatement
以后的自定义功能。
但你有什么想法,对此有何建议?
问候。
溶液
一些关键变化第一:
QueryBuilder
现在可以正确地实现了Builder模式。QueryBuilder.add()
一次接受多个Constraint
s。AccountConstraint
可以给出一个数组,现在给出所有的Constraint
。
@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);
}
}
PS。由于试用资源,我在一个try{ }
中得到两个陈述。
对于“帮助”,我的意思是如果您有拼写错误而不是普通的SQL,那么在运行时只会导致异常,您将得到编译器错误。 – avidD