160 likes | 373 Vues
O/R Mapping. EJB 3.0 コース 第 6 回 2006 年 8 月 5 日. ここでの目標. O/R Mapping の考え方がなぜ必要なのか理解する. オブジェクト指向開発と データベース. オブジェクト指向プログラミング言語と RDB. リレーショナルデータベース (Relational Database = RDB) のデータを、オブジェクト指向プログラミング言語で表すことはなかなか難しい そもそもデータの表現方法がまったく違う 例えば、 RDB の主キーをオブジェクト指向言語でどう表す?
E N D
O/R Mapping EJB 3.0 コース 第6回 2006年8月5日
ここでの目標 • O/R Mapping の考え方がなぜ必要なのか理解する
オブジェクト指向プログラミング言語とRDB • リレーショナルデータベース (Relational Database = RDB) のデータを、オブジェクト指向プログラミング言語で表すことはなかなか難しい • そもそもデータの表現方法がまったく違う • 例えば、RDBの主キーをオブジェクト指向言語でどう表す? • こうした違いを「インピーダンス・ミスマッチ」と呼ぶ
オブジェクト指向データベース • じゃあ、せっかくオブジェクト指向言語を使っているんだから、データもオブジェクト指向データベースで管理してみたら? • インピーダンス・ミスマッチも起こらないんじゃないの?
やっぱりRDB • オブジェクト指向データベースは、なかなか普及しない • (オブジェクト指向データベースと比べて)RDBは • はやい • 安定している • スケーラビリティに優れている • SQLという統一的なデータアクセス言語がある • やはり、RDBが使われることが多い • じゃあ、どうやってRDBを使う?
JDBC (1) Connection con = ......; String select = "select title from books"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(select); while (rs.next()) { String title = rs.getString("title"); }
JDBC (2) • オブジェクト指向的でない • 基本的には、SQLをラッピングしただけ
Data Access Object (DAO)パターン(1) BookDAO dao = new BookDAO(); List<Book> l = dao.searchBooks(word); for (Book b: l) { System.out.println(b.title); …… }
Data Access Object (DAO)パターン • J2EEパターンのひとつ • 永続ストレージにあるデータにアクセスするためのプログラムをひとまとめにしておく • 永続ストレージ = データをメモリ上ではなく、ディスク上に管理しているもののこと • リレーショナルデータベース、LDAP、XML、そのほかテキストファイルなど
DAOのメリット • リレーショナルデータベースにアクセスするためのコードをひとつのクラスにまとめることができる • その結果、JDBCのコードがDAOの中に隠蔽される • DAOを利用するプログラマは、DAOがどのように実装されているのか知る必要はない。 • データベースにアクセスするコードを DAO に局所化する。 • オブジェクト指向的 • JDBCはあいかわらず残っているが・・・
O/R Mapping • Object/Relational Mapping • インピーダンス・ミスマッチを解消させつつ、POJOを永続化させる。 • POJO = Plain Old Java Object = (普通の)Javaオブジェクト • RDBのデータとPOJOを直接対応させる • オブジェクトに対する CRUD (Create / Read / Update / Delete) とRDBとの対応 • SQLよりも便利な統一的なクエリ言語を用意 • JDBCのコードは登場しない。
O/R Mapping のソフトウェア • Entity Bean • JDO • Oracle Toplink • Hibernate • Cayenne • ……
Java Persistence API • 永続化のための API • EJB 3.0 Entity Bean で採用 • JSR 220 で議論されている • 将来的には、J2SE 環境下でも利用可能 • Hibernate でも利用可能 • Hibernate Annotations / Hibernate EntityManager