私はREST APIを作成しています。すべてのリソースに対して1つのサービスクラスを定義しました。Javaでデータアクセスクラスを設計する
私はPersonリソースを持っています。これが私がデータベースとやり取りする方法です。
public class TeacherService {
public static List<Person> getAll() throws SQLException{
//define the query string and objects
try{
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
connection = (Connection) DriverManager.getConnection(ConnectDb.CONN_STRING, ConnectDb.USERNAME, ConnectDb.PASSWORD);
statement = (PreparedStatement) connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
resultSet = statement.executeQuery(query);
//process results
}catch (SQLException e) {
System.err.println(e);
}finally{
//close all shit
}
return list;
}
public static Person getById(int id) throws SQLException{
//repeat
}
public static void addPerson(Person person) throws SQLException {
//repeat
}
public static void upateTeacher(Person person) throws SQLException {
//repeat
}
public static void deleteTeacher(int id) throws SQLException {
//repeat
}
}
したがって、すべてのケースと結果セット処理ロジックで異なるクエリを除いて、すべてのものはほぼ同じです。 これは多くのレベルでDRYに違反するだけでなく、維持するのが非常に扱いにくいようです。それを行う良い方法はありますか?
私は新しい接続を開くことに対してお勧めします - クエリを実行している> - >接続、照会するたびに閉じます。開閉はオーバーヘッドの*ロット*を作り、かなり遅くなる。代わりに、新しいTeacherServiceオブジェクトを作成するときに接続を開き、TeacherServiceオブジェクトを閉じる/停止/破棄するまで接続を開いたままにしておきます。接続を再使用してください。あなたはPreparedStatementで同じことをすることができます(つまり、開いている接続上でそれらをすべて準備し、作成したオブジェクトへの参照を保持して、迅速な再利用を可能にします)。 – SnakeDoc
結果セットとステートメントがすべて異なるので、コードスニペットをいくつか用意してください。どちらを閉じるかは問題です。 – Zeus