PPT原稿 - 研究室

Download Report

Transcript PPT原稿 - 研究室

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