第三回 データベースアクセス
稚内北星大学東京サテライト校
客員准教授
河村 嘉之
WakHok0 Night SeminarSpring Frameworkを使ってアプリケーション開発
Spring Frameworkを用いたWebアプリケーション開発
3
Webアプリケーションの構成
DIDIコンテナコンテナ
ビジネスビジネスロジックロジック
WebWebフレームフレームワークワーク
データデータアクセスアクセスオブジェクオブジェクトト
DBDB
AOPAOP
Java EEJava EEサーバサーバ
4
Webアプリケーションの構成
WebMVC フレームワークWebブラウザからのアクセスを受け付ける。ロジックを呼び出し、遷移する先の画面を生成する。
ビジネスロジックそのアプリケーションが行いたい処理を記述する。
データアクセスオブジェクトJavaオブジェクトをデータベースに格納・データベースから取得する処理を受け持つ
5
DBのインストール
今回の演習では、H2 Databaseを使います。Javaで書かれたデータベースエンジン
H2 Databaseの入手http://www.h2database.com/Version 1.0を取得
Zipで圧縮されたアーカイブを取得し、ファイルを展開
6
H2の操作
起動> cd $H2_HOME/bin> java –cp h2.jar org.h2.tools.Server
各種パラメータJDBC URL→jdbc:h2:tcp://localhost/testJDBC Driver→org.h2.Driverユーザ名→saパスワード→なし
7
H2の操作
管理コンソールhttp://localhost:8082/各種パラメータを入力し、ログイン
停止
管理コンソールから
一旦ログアウトし、設定リンクを押す
シャットダウンボタンを押す
8
課題3-1
H2をインストール・セットアップしてくださいH2を起動してくださいH2の管理コンソールにアクセスしてくださいH2を停止してください
9
SQLの実行
H2の管理コンソールにアクセスします。ドライバ、JDBC URL、ユーザ名、パスワードを入力し、接続ボタンを押します。
右上のテキストエリアにSQL文を入力し、実行を押します。
10
課題3-2 (1/2)
ex3.zipをダウンロードして展開してください。H2を起動してください。H2の管理コンソールにアクセスしてください。
members_h2.sqlの内容をコピー&ペーストして、実行してください。
SELECT * FROM MEMBERを実行し、正しく初期データが入力されたか確認してください。
11
課題3-2 (2/2)
ex3.warをインポートしてください。インポートしたWebアプリケーションをサーバにデプロイし、サーバを起動してください。
http://localhost:8080/ex3/にアクセスし、問題なく動作しているか確認してください。
データベースとの連携
13
データベースとの連携 (1/2)
Spring Frameworkとデータベースの連携Spring DAOデータベースにアクセスするオブジェクト(Data Access Object)を作成するためのテクノロジーJDBCを利用してデータベースにアクセスするためのフレームワーク
14
データベースとの連携 (2/2)
Spring Frameworkとデータベースの連携Spring ORM
O/Rマッパーを利用して、データベースにアクセスするためのフレームワーク
多くのORMをサポートHibernateJDOiBatisOracle TopLinkJPA
15
JDBC
Java Database ConnectivityJava SEのAPIに含まれるJavaからデータベースにアクセスする共通のAPIデータベースに依存しないAPI
データベースアクセスは各データベースに対応したドライバが担当
ドライバがDBごとの差異を吸収
SQLを指定して実行DBごとのSQLの差異は吸収できない
16
JDBCを用いたデータベースアクセス
1. コネクションパラメータの設定2. コネクションのオープン3. SQLステートメントの定義4. SQLステートメントの実行5. 結果を受け取り、順々に処理を進める
個々のデータを処理
6. 例外処理7. トランザクション処理8. コネクションのクローズ
17
Spring Frameworkを用いたデータベースアクセス
1. コネクションパラメータの設定2. コネクションのオープン3. SQLステートメントの定義4. SQLステートメントの実行5. 結果を受け取り、順々に処理を進める
個々のデータを処理
6. 例外処理7. トランザクション処理8. コネクションのクローズ
緑の部分は
SFが受け持つ
18
JdbcTemplate
JdbcTemplateSpring Frameworkが提供するJDBCを用いたDBアクセスのためのテンプレートクラス
DBへのコネクションのオープン、クローズ、ステートメントの実行、例外処理などを受け持つ
開発者が実装すること
SQLステートメントの記述受け取った個々のResultSetをJavaBeanに移す処理
ResultSetをiterationする処理はSFが担当
19
JdbcTemplateの使い方 (1/2)public class MemberDaoJDBCImpl implements MemberDao {private SimpleJdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {jdbcTemplate = new SimpleJdbcTemplate(dataSource);
}
public void insert(final MemberData member) {this.jdbcTemplate.update(INSERT_SQL, new Object[] { member.getName(),member.getLoginname(), member.getPassword(),member.getDepartment(), member.getPhoneNumber()
});
}MemberDaoJDBCImpl.java
20
JdbcTemplateの使い方 (2/2)private static final String FIND_ALL_SQL =
"SELECT * FROM MEMBER";public List<MemberData> findAll() {return this.jdbcTemplate.query(FIND_ALL_SQL,new MemberRowMapper());
}
class MemberRowMapper implementsParameterizedRowMapper<MemberData> {public MemberData mapRow(ResultSet rs, int rowNum) throws SQLException {MemberData result = new MemberData();result.setId(rs.getLong("id"));......//各フィールドの値をBeanに移すreturn result;
}}
} MemberDaoJDBCImpl.java
21
DAOの設定<beans><bean id="memberService"
class="sample.service.MemberServiceImpl"><property name="memberDao" ref="memberDaoJDBC"/>
</bean>
<bean id="memberDaoJDBC"class="sample.dao.MemberDaoJDBCImpl">
<property name="dataSource" ref="dataSource"/></bean>
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.h2.Driver"/><property name="urn"
value="jdbc:h2:tcp://localhost/test"/><property name="username" value="sa"/><property name="password" value=""/>
</bean></beans>
WEB-INF/spring-servlet.xml
22
課題3-3ex33.zipをダウンロードし、プロジェクトにインポートする/src/sample/dao/MemberDaoJDBCImpl.javaの内容をレビューする/WebContents/WEB-INF/spring-servlet.xmlを編集するアプリケーションを実行し、動作確認する
O/Rマッピングツールとの連携
O/Rマッピングツール
O/Rマッピングツール
Public class User {private long id;private String name;public void setId(long id) {this.id = id;
}public long getId() {return id;
}……
}
…………
鈴木 一郎1
NameIDMapping
Javaオブジェクトデータベース
データベーステーブルとデータベーステーブルとJavaJavaオブジェクトを自動的にマッピングオブジェクトを自動的にマッピング開発者は、開発者は、JavaJavaオブジェクトに対して操作をするオブジェクトに対して操作をする
Hibernate
Gavin King氏が中心となって開発したJavaのO/Rマッピングツール
http://www.hibernate.org にて公開最新版(安定版)は3.2.4 (2007年7月現在)XMLを用いてJavaオブジェクトをRDBのテーブルとマップする扱うJavaオブジェクトはPOJOなので、フレームワークへの依存か少ない。
高機能な検索言語 HQLキャッシュやLazy Loadingなどによるハイパフォーマンス
POJO+マッピングファイルpublic class MemberData {
private long id;private String name;…public long getId() {
return id;}public void setId(long id) {
this.id = id;}public String getName() {
return name;}public void setName(String name) {
this.name = name;}…
}
public class MemberData {private long id;private String name;…public long getId() {
return id;}public void setId(long id) {
this.id = id;}public String getName() {
return name;}public void setName(String name) {
this.name = name;}…
}
<?xml version="1.0" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="sample.data.MemberData"table="MEMBER">
<id name="id" column="ID"><generator class="native"/>
</id><property name="name" column="NAME" />…
</class></hibernate-mapping>
<?xml version="1.0" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>
<class name="sample.data.MemberData"table="MEMBER">
<id name="id" column="ID"><generator class="native"/>
</id><property name="name" column="NAME" />…
</class></hibernate-mapping>
POJO
マッピングファイル
Session
Hibernate
DB
Session
アプリケーション
SessionFactory
開始
Session経由でデータにアクセス
Hibernate+Spring Framework
Hibernate
DB
Spring FrameworkSession
アプリケーション
SessionFactory
Sessionへのアクセスを簡略化する
HibernateTemplate
Spring Frameworkが提供するHibernateへのアクセス用ユーティリティクラス
org.springframework.orm.hibernate3.HibernateTemplateHibernateのSessionが持つメソッドとほぼ同等のメソッドを持つ。
30
HibernateTemplateコード例(1/2)public class MemberDaoHibernateImpl
implements MemberDao {private HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {this.hibernateTemplate =
new HibernateTemplate(sessionFactory);}
MemberDaoHibernateImpl.java
31
HibernateTemplateコード例(2/2)private static final String FIND_BY_DEPARTMENT_HQL = "FROM
MemberData WHERE department = ?";public void insert(final MemberData member) {
this.hibernateTemplate.persist(member);}public List<MemberData> findByDepartment(String department) {
return this.hibernateTemplate.find(FIND_BY_DEPARTMENT_HQL, department);
}}
MemberDaoHibernateImpl.java
32
DAOの設定 (1/2)<beans><bean id="memberService"
class="sample.service.MemberServiceImpl"><property name="memberDao" ref="memberDaoHibernate"/>
</bean>
<bean id="memberDaoHibernate"class="sample.dao.MemberDaoHibernateImpl">
<property name=”sessionFactory" ref=”sessionFactory"/></bean>
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.h2.Driver"/><property name="urn"
value="jdbc:h2:tcp://localhost/test"/><property name="username" value="sa"/><property name="password" value=""/>
</bean> WEB-INF/spring-servlet.xml
33
DAOの設定 (2/2)<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mappingResources">
<list><value>sample/data/MemberData.hbm.xml</value>
</list></property><property name="hibernateProperties">
<value>hibernate.dialect=org.hibernate.dialect.H2Dialecthibernate.show_sql=true
</value></property>
</bean></beans>
WEB-INF/spring-servlet.xml
34
課題3-4ex34.zipをダウンロードし、プロジェクトにインポートする/src/sample/dao/MemberDaoHibernateImpl.javaの内容をレビューする/src/sample/data/MemberData.hbm.xml、/src/sample/data/MemberData.javaの内容をレビューする/WebContents/WEB-INF/spring-servlet.xmlを編集するアプリケーションを実行し、動作確認する
35
データベースアクセス
参考資料Spring – Java/J2EE Application Frameworkhttp://static.springframework.org/spring/docs/2.0.x/reference/index.html
II Middle Tier Data Access10. DAO Support11. Data Access using JDBC12. Object Relational Mapping (ORM) data access
36
データベースアクセス
参考資料JDBC
Java SE – Java Database Connectivity (JDBC)http://java.sun.com/javase/technologies/database/index.jsp
HibernateHibernate Reference Documentationhttp://www.hibernate.org/hib_docs/v3/reference/en/html/