3

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思います。QueryBuilderList<Object>PreparedStatement

しかし、これについてあなたの考えや提案は何ですか?

よろしく。

ソリューションが追加されました

最初にいくつかの重要な変更:

  • QueryBuilderBuilder パターンを適切に実装するようになりました。
  • 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 つのステートメントが得られます。

4

3 に答える 3

1

クレートした後、API を介して準備済みステートメントを変更することはできません。また、SQL ステートメントがないと作成できません。

クエリを個別に作成してから、パラメーターをバインドしてみませんか? Map を使用してパラメーターのプレースホルダーとその値を保持し、準備済みステートメントに設定できるようにすることができます。

Spring の JDBC テンプレートを使用して、同じことをより迅速に行うことができます。

于 2013-06-29T12:31:29.477 に答える