私は文書を調べていたところ、DAO
という用語に出くわしました。それがデータアクセスオブジェクトであることがわかりました。誰かがこれが実際に何であるかを私に説明してもらえますか?
私は、この小さな調査の最中に、さまざまな種類のソースからデータにアクセスするためのある種のインターフェースであることを知っています。データソースまたはデータソースオブジェクトと呼ばれる概念にぶつかりました。
私は本当にDAO
がどこで使われているかという点でプログラム的に何であるかを知りたいのです。使い方は?非常に基本的なものからこの概念を説明するページへのリンクも評価されています。
データアクセスオブジェクトは、基本的に、基盤となるデータベースまたはその他の永続ストレージへのアクセスを提供するオブジェクトまたはインタフェースです。
その定義は次のとおりです。 http://en.wikipedia.org/wiki/Data_access_object
こちらのシーケンス図も確認してください。 http://www.Oracle.com/technetwork/Java/dataaccessobject-138824.html
簡単な例があなたが概念を理解するのを助けることができるかもしれません:
従業員を表すエンティティがあるとします。
public class Employee {
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;
}
}
従業員エンティティは、データベース内の対応するEmployee
テーブルに永続化されます。従業員エンティティを操作するために必要なデータベース操作を処理するための単純なDAOインタフェースは次のようになります。
interface EmployeeDAO {
List<Employee> findAll();
List<Employee> findById();
List<Employee> findByName();
boolean insertEmployee(Employee employee);
boolean updateEmployee(Employee employee);
boolean deleteEmployee(Employee employee);
}
次に、SQLサーバを扱うためのそのインタフェースのための具体的な実装と、フラットファイルなどを扱うための別の実装を提供しなければなりません。
データアクセスオブジェクト(DAO)とは -
これは object/interface であり、これは データストレージのデータベースからdata にアクセスするために使用されます。
WHY WE DAOを使用:
データベースなどのデータリソースからのデータの検索を抽象化します。その概念は "データリソースのクライアントインタフェースをそのデータアクセスメカニズムから切り離すこと"です。
データに直接アクセスすることの問題は、データの出所が変わる可能性があることです。たとえば、アプリケーションがOracleデータベースにアクセスする環境にデプロイされているとします。その後、Microsoft SQL Serverを使用する環境に展開されます。アプリケーションでストアドプロシージャとデータベース固有のコード(番号シーケンスの生成など)を使用している場合、アプリケーションでそれをどのように処理しますか? 2つの選択肢があります。
それは全体として DAOパターン と呼ばれ、以下のもので構成されています。
この例を確認してください。これにより、内容がより明確になります。
例
私はこのことがDAOに対するあなたの理解をある程度までクリアしたに違いないと思います。
DAO(データアクセスオブジェクト)は、エンタープライズアプリケーションで非常によく使用されるデザインパターンです。基本的にはあらゆるソース(DBMS、XMLなど)からデータにアクセスするために使用されるモジュールです。このような例をいくつか読むことをお勧めします。
オリジナルの DAOパターン を実装するにはさまざまな方法があり、作業を簡素化できるフレームワークがたくさんあります。たとえば、iBatisやHibernateなどのORM(Object Relational Mapping)フレームワークは、SQLクエリの結果をJavaオブジェクトにマッピングするために使用されます。
それが役立つことを願って、さようなら!
データアクセスオブジェクトパターンまたはDAOパターンは、低レベルのデータアクセスAPIまたはオペレーションを高レベルのビジネスサービスから分離するために使用されます。以下はデータアクセスオブジェクトパターンの参加者です。
データアクセスオブジェクトインタフェース - このインタフェースは、モデルオブジェクトに対して実行される標準操作を定義します。
データアクセスオブジェクト具象クラス - このクラスは上記のインタフェースを実装しています。このクラスは、database/xmlまたはその他の格納メカニズムになり得るデータソースからデータを取得します。
モデルオブジェクトまたは値オブジェクト - このオブジェクトは、DAOクラスを使用して取得したデータを格納するためのget/setメソッドを含む単純なPOJOです。
サンプルコード ここ ..
説明を混同しすぎないでください。 DAO:名前そのものから、オブジェクトを使ってデータにアクセスするということです。 DAOは他のビジネスロジックから切り離されています。
DAOとORMはすべての言語で使用されているので、私は一般的なもので、Javaに固有のものではありません。
DAOを理解するには、まずORM(Object Rational Mapping)を理解する必要があります。つまり、列が "name"と "age"の "person"というテーブルがある場合は、そのテーブル用のobject-templateを作成します。
type Person {
name
age
}
今、DAOの助けを借りて、特定のクエリを書くのではなく、すべての人を取得するために、今まで使っていたdbのタイプ(エラーが発生しやすい)に対して代わりに、
list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;
あなたは自分でDAOの抽象化を書くのではなく、代わりにそれはあなたが使っている言語とフレームワークに応じて、通常はオープンソースプロジェクトの一部です。
今ここに主な質問へ。 " 使用されている場所 "通常、複雑なビジネスコードやドメイン固有のコードを書いているのであれば、DAOがなければ人生は非常に困難になります。もちろん、提供されているORMやDAOを使用する必要はありません。代わりに、独自の抽象化とネイティブクエリを書くことができます。私は過去にそれをしました、そして、ほとんどいつも後にそれを後悔しました。
データアクセスオブジェクトは、データを取得および格納するためにデータソースとの接続を管理します。データソースへの透過的なアクセスを可能にするために、ビジネスオブジェクトの基になるデータアクセス実装を抽象化します。データソースは、RDBMS、XMLリポジトリ、フラットファイルシステムなどのデータベースです。
DAOは3層アーキテクチャの「持続マネージャ」のような行為であり、DAOも「Gang of Four」の本を参考にできるようにデザインパターンも設計しています。あなたのアプリケーションサービス層は、DAOのメソッドの隠された内部の詳細を知らずに、DAOクラスのメソッドを呼び出すだけです。
たとえば、いくつかのエンティティグループがあります。
このエンティティに対して、リポジトリGroupRepositoryを作成します。
public interface GroupRepository extends JpaRepository<Group, Long> {
}
次に、このリポジトリを使用するためのサービス層を作成する必要があります。
public interface Service<T, ID> {
T save(T entity);
void deleteById(ID id);
List<T> findAll();
T getOne(ID id);
T editEntity(T entity);
Optional<T> findById(ID id);
}
public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {
private final R repository;
protected AbstractService(R repository) {
this.repository = repository;
}
@Override
public T save(T entity) {
return repository.save(entity);
}
@Override
public void deleteById(ID id) {
repository.deleteById(id);
}
@Override
public List<T> findAll() {
return repository.findAll();
}
@Override
public T getOne(ID id) {
return repository.getOne(id);
}
@Override
public Optional<T> findById(ID id) {
return repository.findById(id);
}
@Override
public T editEntity(T entity) {
return repository.saveAndFlush(entity);
}
}
@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {
private final GroupRepository groupRepository;
@Autowired
protected GroupServiceImpl(GroupRepository repository) {
super(repository);
this.groupRepository = repository;
}
}
そしてコントローラーではこのサービスを使用しています。
@RestController
@RequestMapping("/api")
class GroupController {
private final Logger log = LoggerFactory.getLogger(GroupController.class);
private final GroupServiceImpl groupService;
@Autowired
public GroupController(GroupServiceImpl groupService) {
this.groupService = groupService;
}
@GetMapping("/groups")
Collection<Group> groups() {
return groupService.findAll();
}
@GetMapping("/group/{id}")
ResponseEntity<?> getGroup(@PathVariable Long id) {
Optional<Group> group = groupService.findById(id);
return group.map(response -> ResponseEntity.ok().body(response))
.orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
@PostMapping("/group")
ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
log.info("Request to create group: {}", group);
Group result = groupService.save(group);
return ResponseEntity.created(new URI("/api/group/" + result.getId()))
.body(result);
}
@PutMapping("/group")
ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
log.info("Request to update group: {}", group);
Group result = groupService.save(group);
return ResponseEntity.ok().body(result);
}
@DeleteMapping("/group/{id}")
public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
log.info("Request to delete group: {}", id);
groupService.deleteById(id);
return ResponseEntity.ok().build();
}
}
Daoクラスはjdbcロジックを再利用するために使用され、Dao(データアクセスオブジェクト)はデザインパターンです。 daoはJDBCロジックを含む単純なJavaクラスです。
データアクセス層は、独立したビジネスロジック層と永続層で優れていることが証明されています。 DAOデザインパターンは、データアクセスの実装をクライアントから完全に隠します。
Javaデータアクセスオブジェクト(Java DAO)は、ビジネスアプリケーションにおける重要なコンポーネントです。ビジネスアプリケーションは、ほとんどの場合、リレーショナルデータベースまたはオブジェクトデータベースからデータにアクセスする必要があり、Javaプラットフォームはこのデータにアクセスするための多くの技術を提供しています。最も古く最も成熟した手法は、JDBC(Java Database Connectivity)APIを使用することです。JavaDatabase Connectivity(JDBC)APIは、データベースに対してSQLクエリを実行し、結果を一度に1列ずつ取り出す機能を提供します。
Pojoは、私たちがprivateで定義された特定の変数のためのgetterとsetterを作成できるJavaのModelクラスとしても考えます。すべての変数はここでprivate修飾子で宣言されていることを忘れないでください