是否可以在沒有設置初始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