WakHok0Night Seminar Spring Frameworkを使って...

Preview:

Citation preview

第三回 データベースアクセス

稚内北星大学東京サテライト校

客員准教授

河村 嘉之

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/

Recommended