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 に入れる必要があります。
EveryQueryBuilder.add()
は、いくつかの引数を PreparedStatement に追加し、クエリの末尾に特定の文字列を追加します。
に a を与える代わりに a を与えてから、後でそれらを配置するカスタム関数を作成するなど、いくつかの回避策が可能だとPreparedStatement
思います。QueryBuilder
List<Object>
PreparedStatement
しかし、これについてあなたの考えや提案は何ですか?
よろしく。
ソリューションが追加されました
最初にいくつかの重要な変更:
QueryBuilder
Builder パターンを適切に実装するようになりました。QueryBuilder.add()
一度に複数の を受け入れますConstraint
。AccountConstraint
すべての s を与える配列を与えることができます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{ }
try-with-resources により、1 つのステートメントで 2 つのステートメントが得られます。