データアクセスオブジェクト(DAO)。 クラスレベル

情報システムを設計するとき、システムのさまざまなモジュールの相互作用を担当するいくつかの層が識別されます。 データベース接続は、アプリケーションの最も重要なコンポーネントの1つです。 コードの一部は常に割り当てられ、モジュールはデータベースにリクエストを送信し、データベースから受信したレスポンスを処理します。 一般に、 データアクセスオブジェクトの定義は、データベースとシステムの間のレイヤーとしてそれを説明します。 DAOはシステムエンティティを抽象化し、それらをデータベースに表示し、接続、その受信、クローズ、および(または) 接続プールへの戻りを使用するための一般的なメソッドを定義します。



DAO階層の最上位は、データベースと対話するときに使用される一般的なメソッドの説明を含む抽象クラスまたはインターフェイスです。 通常、これらは検索方法、キーの削除、更新などです。



public abstract class AbstractController <E, K> { public abstract List<E> getAll(); public abstract E getEntityById(K id); public abstract E update(E entity); public abstract boolean delete(K id); public abstract boolean create(E entity); }
      
      





メソッドのセットは完全ではなく、特定のシステムに依存します。 ダミータイプKはエンティティキーであり、エンティティを記述するまれなテーブルには主キーがありません。 また、このクラスでは、 PrepareStatementのインスタンスを閉じるメソッドを配置するのが論理的です



 public void closePrepareStatement(PreparedStatement ps) { if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } }
      
      





クラスレベル


クラスレベルでDAOを実装するには、単一の接続を使用して、継承されたDAOクラスの複数のメソッドを呼び出す必要があります。 この場合、DAO AbstractController階層の最上部で、 接続がフィールドとして宣言されます。 抽象クラスは次のようになります。





 public abstract class AbstractController<E, K> { private Connection connection; private ConnectionPool connectionPool; public AbstractController() { connectionPool = ConnectionPool.getConnectionPool(); connection = connectionPool.getConnection(); } public abstract List<E> getAll(); public abstract E update(E entity); public abstract E getEntityById(K id); public abstract boolean delete(K id); public abstract boolean create(E entity); //   Connection    public void returnConnectionInPool() { connectionPool.returnConnection(connection); } //   PrepareStatement public PreparedStatement getPrepareStatement(String sql) { PreparedStatement ps = null; try { ps = connection.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } //  PrepareStatement public void closePrepareStatement(PreparedStatement ps) { if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
      
      







この例では、接続プールからConnectionのインスタンスを取得します。したがって、既成のソリューションを実装または使用する価値があります。 getPrepareStatement( String sqlを取得して閉じるメソッドを作成し、 closePrepareStatement( PreparedStatement psを閉じます。 このロジックを使用した特定のDAOクラスの実装は、そのメソッドでデータベース接続を閉じないでください。 接続は、メソッドが呼び出されたビジネスロジックのその部分で閉じられます。 特定のDAOクラスの例は次のようになります。



 public class UserController extends AbstractController<User, Integer> { public static final String SELECT_ALL_USERS = "SELECT * FROM SHEMA.USER"; @Override public List<Planet> getAll() { List<User> lst = new LinkedList<>(); PreparedStatement ps = getPrepareStatement(SELECT_ALL_PLANET); try { ResultSet rs = ps.executeQuery(); while (rs.next()) { User user = new User(); planet.setId(rs.getInt(1)); planet.setName(rs.getString(2)); lst.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { closePrepareStatement(ps); } return lst; } @Override public Planet getEntityById(Integer id) { return null; } @Override public boolean delete(Integer id) { return false; } @Override public boolean create(Planet entity) { return false; } }
      
      





エンティティクラスの例。



 public class User implements Serializable { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
      
      





Connectionインスタンスは、 getPrepareStatement(String sql)メソッドで使用できます。このメソッドは、特定のDAOクラスのすべてのメソッドで使用できます。 PrepareStatementインスタンスは、finallyブロックで処理された直後に閉じ、メソッドが呼び出されたシステムロジックの一部にあるreturnConnectionInPool()プールに接続を戻す必要があることを覚えておく価値があります。



All Articles