JDBCを使用してデータベースに接続するアプリケーションでPreparedStatement
文字列を整理する際のベストプラクティスを見つけようとしています。
通常、これは私がデータベースからデータを取得する方法です。
PreparedStatement select = null;
String prepQuery = "SELECT * FROM user JOIN details ON user.id = details.user_id WHERE details.email = ? AND details.password = ?";
select = con.prepareStatement(prepQuery);
select.setString(1, email);
select.setString(2, pass);
ResultSet result = select.executeQuery();
// Handle the result.
これは、電子メールとパスワードを使用してユーザーエンティティを取得する方法です。すべてのメソッドで、これがクエリ文字列を保存する方法です。
頭に浮かぶ最初の欠点は、SQLプロバイダーを変更する場合、これが非常に面倒で管理が難しいことです(おそらく、すべてのクエリを定数ファイルに配置する方がより良い解決策になるでしょう)。さらに、JPAは、アプリケーションのパフォーマンスを向上させると言われている@NamedQuery
のようなツールを提供しています。
JDBCを使用してアプリケーションでクエリ文字列を整理する場合のベストプラクティスはありますか?ありがとうございました!
検討してください [〜#〜] jdbi [〜#〜]
JDBCと密接に連携して独自のSQLを作成し、アプリケーションでクエリパラメータ間のバインディングを管理する場合は、JDBIが適しています。
基本的に、DAOを記述する注釈付きインターフェースを作成すると、JDBIが実行時に実装を提供します。典型的なDAOは次のようになります。
public interface MyDAO
{
@SqlUpdate("create table something (id int primary key, name varchar(100))")
void createSomethingTable();
@SqlUpdate("insert into something (id, name) values (:id, :name)")
void insert(@Bind("id") int id, @Bind("name") String name);
@SqlQuery("select name from something where id = :id")
String findNameById(@Bind("id") int id);
/**
* close with no args is used to close the connection
*/
void close();
}
このアプローチは、SQLの非常に軽量な処理に役立ちます。複数のデータベースをサポートしたり、SQLからそれらのデータベースを抽象化して純粋なオブジェクトモデルに抽象化したりする必要がある場合は、JPAがおそらくより良いアプローチです。
最善の策は、SpringなどのIoCフレームワークを使用してクエリ文字列を外部化し、Javaクラスの途中ではなくXMLベースの構成ファイルに配置することです。Springも提供しますトランザクションなどを制御するためのいくつかの優れた機能。これは基本的にJPA @ NamedQueryが定義するものであり、SpringまたはHibernateにはJPAの適切な実装があります。
もう1つの可能性は、 Query Object パターンを使用することです。これには、クエリのロジックを独自のクラス/オブジェクトに分離することが含まれるため、クエリを維持するための単一の場所があります。