O/Rマッピングおよび Hibernateの有用性の比較評価 P R E S E N T A T I O N 信州大学工学系研究科情報工学 専攻 海尻・海谷研究室 03TA545B 塩沢 裕己 背景 システム開発 ・オブジェクト指向プログラミング ・リレーショナルデータベース 2 背景 オブジェクト指向プログラミング 役割や振る舞いをもったオブジェク ト(もの)の集まりとしてプログラム を作成していく手法 3 背景 オブジェクト指向プログラミング 人 オブジェクト(Object) ↓ 祖父 クラス(Class) 畑仕事 ・呼吸する ・食事する 次男 祖母 畑仕事 学生 父 会社勤め 母 家事・育児 長男 学生 4 背景 オブジェクト指向プログラミング オブジェクト指向プログラミング言語 C++・Python・Java・Ruby・ JavaScript・C# 5 背景 オブジェクト指向プログラミング Webアプリケーション Java JSP MVC技術 Model・View・Controller Servlet Struts 6 背景 リレーショナルデータベース ・RDB ・正規化 7 背景 リレーショナルデータベース (1)第一正規形 従業員コード 氏名 エリア 住所記号 1001 東京 太郎 {中央エリア, 東京} T01 1002 埼玉 花子 {中央エリア, 埼玉} S02 1003 宮城 敦子 {北エリア, 宮城} M01 1004 青森 順次 {北エリア, 青森} A01 1005 北海 次郎 {北エリア, 北海道} H01 8 背景 リレーショナルデータベース (1)第一正規形 従業員コード 氏名 エリア 所在地 住所記号 1001 東京 太郎 中央エリア 東京 T01 1002 埼玉 花子 中央エリア 埼玉 S02 1003 宮城 敦子 北エリア 宮城 M01 1004 青森 順次 北エリア 青森 A01 1005 北海 次郎 北エリア 北海道 H01 9 背景 リレーショナルデータベース (2)第二正規形 エリアコード エリア 01 北エリア 02 中央エリア 03 南エリア 従業員コード 氏名 エリア 所在地 住所記号 1001 東京 太郎 02 東京 T01 1002 埼玉 花子 02 埼玉 S02 1003 宮城 敦子 01 宮城 M01 1004 青森 順次 01 青森 A01 1005 北海 次郎 01 北海道 H01 10 背景 リレーショナルデータベース (3)第三正規形 所在地コード 所在地 住所記号 01 東京 T01 02 埼玉 S02 03 宮城 M01 04 青森 A01 05 北海道 H01 エリアコード エリア 01 北エリア 02 中央エリア 03 南エリア 従業員コード 氏名 エリア 所在地 1001 東京 太郎 02 01 1002 埼玉 花子 02 02 1003 宮城 敦子 01 03 1004 青森 順次 01 04 1005 北海 01 05 次郎 11 目的 O/Rマッピング ・オブジェクト ・リレーショナルデータベース ↓ インピーダンス・ミスマッチ (使用目的の相違による不整合) 12 目的 O/Rマッピングツール ・Hibernate ・Spring(J2EEフレームワーク)の併用 ↓ インピーダンス・ミスマッチの軽減 13 O/Rマッピングの概要 従来のコーディングの問題点 ・SQL文の直接埋め込み ・インピーダンス・ミスマッチ 14 O/Rマッピングの概要 従来のコーディングの問題点 検索の場合 Emp.java SELECT , , FROM WHERE EMP_ID EMP_NAME ADDRESS EMP AGE > 35 ResultSet Ob.setEmpId(); Ob.setEmpName(); Ob.setAddress(); 15 O/Rマッピングの概要 従来のコーディングの問題点 更新の場合 Emp.java 更新 UPDATE SET , WHERE EMP EMP_NAME = empName ADDRESS = address EMP_ID = 10 emp.getEmpId(); emp.getEmpName(); emp.getAddress(); 16 O/Rマッピングの概要 O/Rマッピングツール ・Hibernate ・iBATIS ・Torque ・Torque ・Castor ・PriDE ・Cayenne ほか多数存在する 17 O/Rマッピングの概要 O/Rマッピング ・マッピングファイル ・クラス 18 O/Rマッピングの概要 O/Rマッピング ・マッピングファイル <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="sample.entity.User" table="User"> <id name="id" type="java.lang.Integer" column="ID"> <generator class="native" /> </id> <property name="userId" type="java.lang.String" column="USER_ID" length="10" /> <property name="userName" type="java.lang.String" column="USER_NAME" length="20" /> </class> </hibernate-mapping> 19 package sample.entity; import java.io.Serializable; /** * @hibernate.class table = "User" */ public class User implements Serializable { private Integer id; private String userId; private String userName; public User() { } public User(String userId, String userName) { this.userId = userId; this.userName = userName; } /** * @hibernate.id column = "ID" generator-class = "native" */ public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } /** * @hibernate.property column = "USER_ID" length = "10" */ public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } /** * @hibernate.property column = "USER_NAME" length = "20" */ public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; O/Rマッピングの概要 ・クラス POJO (Plain Old Java Object) 20 O/Rマッピングの概要 マッピングファイルの自動生成 ・XDoclet ・Ant 21 O/Rマッピングの概要 Hibernate ・http://www.hibernate.org/ Latest release: 3.2.5.ga Release date : 2007.04.02 22 Hibernate Spring ・http://www.springframework.org/ Latest release: 2.1.5 Release date : 2008-01-09 ・Dependency Injection ・DIコンテナ ・AOP(アスペクト指向) 23 Hibernate マッピングファイル many-to-one ・外部キー(多対一) <many-to-one name="salesOrderLine" class="sample.SalesOrderLine" update="false" insert="false" fetch="select"> <column name="SALES_ORDER_ID" length="7" not-null="true" /> <column name="SALES_ORDER_LINE_ID" length="6" not-null="true" /> </many-to-one> 24 Hibernate マッピングファイル one-to-one ・他の永続クラスへの一対一関連 <one-to-one name="salesOrderLine" class=“sample.SalesOrderLine" /> 25 Hibernate マッピングファイル join ・テーブル間に一対一の関係 <id name="id" column="PERSON_ID">...</id> <join table="ADDRESS"> <key column="ADDRESS_ID"/> <property name="address"/> <property name="zip"/> <property name="country"/> </join> 26 Hibernate CriteriaクエリAPI Criteria クエリ ・criteria クエリ API の使用 Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); 27 Hibernate CriteriaクエリAPI Criteria クエリ ・絞込み List cats = sess.createCriteria(Cat.class) .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) ) ) .list(); 28 Hibernate CriteriaクエリAPI Criteria クエリ ・並び替え List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list(); 29 Hibernate データベースへのアクセス ・DAO(データ・アクセス・オブジェクト) ・HibernateDaoSupport org.springframework.orm.hibernate.suppot ・HibernataTemplateクラス 30 Hibernate HibernataTemplateクラス 主なメソッド ・load(Class entityClass, Selializable id) ・find(String queryString) ・find(String queryString, Object[] values, Type[] types) ・save(Object entity) ・update(Object entity) ・saveOrupdate(Object entity) ・delete(Object entity) ・delete(String queryString) ・delete(String queryString, Object[] values, Type[] types) 31 Hibernate Daoクラス package sample.dao; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import sample.entity.User; public class UserDaoImpl extends HibernateDaoSupport implements UserDao public User load(Integer id) { return (User)getHibernateTemplate().load(User.class, id); } public List selectAllUsers() { return getHibernateTemplate().loadAll(arg0); } public void insertUser(User user) { getHibernateTemplate().save(user); } public void updateUser(User user) { getHibernateTemplate().update(user); } public void deleteUser(Integer id) { String queyString = "from User as user where user.id=?"; getHibernateTemplate().delete(queyString, id, Hibernate.Integer); } } 32 考察 従来のコーディング ActionServlet Struts-config.xml JSP Actionクラス JavaBean 33 考察 Hibernateを使用した場合 ActionServlet Struts-config.xml Actionクラス JSP Spring併用 Dao DaoImpl Service ServiceImpl 永続化クラス 34 考察 比較 ・従来のコーディング ・Hibernateを使用した場合 メリット ・可読性 メリット ・保守性 デメリット ・保守性 デメリット ・技術取得 ・リソース ・(可読性) 35 結論 結論 ・保守性の向上 ・データベースへとのやり取りに関す るコーディング負担の減少 36 結論 結論 ・ Hibernate を使用することで保守性が増し、データベース とのやり取りを意識することなく開発を進めることができるた め、コーディングの負担が軽減される。開発者はビジネスロ ジックに重点を置くことができる。 Springフレームワークの併用により、さらにHibernateを効 率よく記述できる。 よって従来のSQLを記述するプログラミングより、 Hibernateの使用は有用であるといえる。 37 結論 今後の課題 ・ Hibernateの有用性は確認されたが、 (1)技術取得に多少時間を有すること (2)リソースに関する課題が残ること など新たな問題の発生を確認した。 これらの問題について、解決または軽減させるにはどのよ うな手法が必要となるか、その手法は存在するのか 38 39 40
© Copyright 2024 ExpyDoc