36
第三回 データベースアクセス 稚内北星大学東京サテライト校 客員准教授 河村 嘉之 WakHok0 Night Seminar Spring Frameworkを使って アプリケーション開発

WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

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

客員准教授

河村 嘉之

WakHok0 Night SeminarSpring Frameworkを使ってアプリケーション開発

Page 2: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

Spring Frameworkを用いたWebアプリケーション開発

Page 3: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

3

Webアプリケーションの構成

DIDIコンテナコンテナ

ビジネスビジネスロジックロジック

WebWebフレームフレームワークワーク

データデータアクセスアクセスオブジェクオブジェクトト

DBDB

AOPAOP

Java EEJava EEサーバサーバ

Page 4: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

4

Webアプリケーションの構成

WebMVC フレームワークWebブラウザからのアクセスを受け付ける。ロジックを呼び出し、遷移する先の画面を生成する。

ビジネスロジックそのアプリケーションが行いたい処理を記述する。

データアクセスオブジェクトJavaオブジェクトをデータベースに格納・データベースから取得する処理を受け持つ

Page 5: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

5

DBのインストール

今回の演習では、H2 Databaseを使います。Javaで書かれたデータベースエンジン

H2 Databaseの入手http://www.h2database.com/Version 1.0を取得

Zipで圧縮されたアーカイブを取得し、ファイルを展開

Page 6: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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パスワード→なし

Page 7: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

7

H2の操作

管理コンソールhttp://localhost:8082/各種パラメータを入力し、ログイン

停止

管理コンソールから

一旦ログアウトし、設定リンクを押す

シャットダウンボタンを押す

Page 8: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

8

課題3-1

H2をインストール・セットアップしてくださいH2を起動してくださいH2の管理コンソールにアクセスしてくださいH2を停止してください

Page 9: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

9

SQLの実行

H2の管理コンソールにアクセスします。ドライバ、JDBC URL、ユーザ名、パスワードを入力し、接続ボタンを押します。

右上のテキストエリアにSQL文を入力し、実行を押します。

Page 10: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

10

課題3-2 (1/2)

ex3.zipをダウンロードして展開してください。H2を起動してください。H2の管理コンソールにアクセスしてください。

members_h2.sqlの内容をコピー&ペーストして、実行してください。

SELECT * FROM MEMBERを実行し、正しく初期データが入力されたか確認してください。

Page 11: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

11

課題3-2 (2/2)

ex3.warをインポートしてください。インポートしたWebアプリケーションをサーバにデプロイし、サーバを起動してください。

http://localhost:8080/ex3/にアクセスし、問題なく動作しているか確認してください。

Page 12: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

データベースとの連携

Page 13: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

13

データベースとの連携 (1/2)

Spring Frameworkとデータベースの連携Spring DAOデータベースにアクセスするオブジェクト(Data Access Object)を作成するためのテクノロジーJDBCを利用してデータベースにアクセスするためのフレームワーク

Page 14: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

14

データベースとの連携 (2/2)

Spring Frameworkとデータベースの連携Spring ORM

O/Rマッパーを利用して、データベースにアクセスするためのフレームワーク

多くのORMをサポートHibernateJDOiBatisOracle TopLinkJPA

Page 15: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

15

JDBC

Java Database ConnectivityJava SEのAPIに含まれるJavaからデータベースにアクセスする共通のAPIデータベースに依存しないAPI

データベースアクセスは各データベースに対応したドライバが担当

ドライバがDBごとの差異を吸収

SQLを指定して実行DBごとのSQLの差異は吸収できない

Page 16: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

16

JDBCを用いたデータベースアクセス

1. コネクションパラメータの設定2. コネクションのオープン3. SQLステートメントの定義4. SQLステートメントの実行5. 結果を受け取り、順々に処理を進める

個々のデータを処理

6. 例外処理7. トランザクション処理8. コネクションのクローズ

Page 17: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

17

Spring Frameworkを用いたデータベースアクセス

1. コネクションパラメータの設定2. コネクションのオープン3. SQLステートメントの定義4. SQLステートメントの実行5. 結果を受け取り、順々に処理を進める

個々のデータを処理

6. 例外処理7. トランザクション処理8. コネクションのクローズ

緑の部分は

SFが受け持つ

Page 18: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

18

JdbcTemplate

JdbcTemplateSpring Frameworkが提供するJDBCを用いたDBアクセスのためのテンプレートクラス

DBへのコネクションのオープン、クローズ、ステートメントの実行、例外処理などを受け持つ

開発者が実装すること

SQLステートメントの記述受け取った個々のResultSetをJavaBeanに移す処理

ResultSetをiterationする処理はSFが担当

Page 19: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 20: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 21: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 22: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

22

課題3-3ex33.zipをダウンロードし、プロジェクトにインポートする/src/sample/dao/MemberDaoJDBCImpl.javaの内容をレビューする/WebContents/WEB-INF/spring-servlet.xmlを編集するアプリケーションを実行し、動作確認する

Page 23: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

O/Rマッピングツールとの連携

Page 24: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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オブジェクトに対して操作をするオブジェクトに対して操作をする

Page 25: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

Hibernate

Gavin King氏が中心となって開発したJavaのO/Rマッピングツール

http://www.hibernate.org にて公開最新版(安定版)は3.2.4 (2007年7月現在)XMLを用いてJavaオブジェクトをRDBのテーブルとマップする扱うJavaオブジェクトはPOJOなので、フレームワークへの依存か少ない。

高機能な検索言語 HQLキャッシュやLazy Loadingなどによるハイパフォーマンス

Page 26: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

マッピングファイル

Page 27: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

Session

Hibernate

DB

Session

アプリケーション

SessionFactory

開始

Session経由でデータにアクセス

Page 28: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

Hibernate+Spring Framework

Hibernate

DB

Spring FrameworkSession

アプリケーション

SessionFactory

Sessionへのアクセスを簡略化する

Page 29: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

HibernateTemplate

Spring Frameworkが提供するHibernateへのアクセス用ユーティリティクラス

org.springframework.orm.hibernate3.HibernateTemplateHibernateのSessionが持つメソッドとほぼ同等のメソッドを持つ。

Page 30: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

30

HibernateTemplateコード例(1/2)public class MemberDaoHibernateImpl

implements MemberDao {private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {this.hibernateTemplate =

new HibernateTemplate(sessionFactory);}

MemberDaoHibernateImpl.java

Page 31: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 32: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 33: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 34: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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を編集するアプリケーションを実行し、動作確認する

Page 35: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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

Page 36: WakHok0Night Seminar Spring Frameworkを使って ...satellite.wakhok.ac.jp/files/spring/Spring3.pdf17 Spring Frameworkを用いたデータベー スアクセス 1. コネクションパラメータの設定

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/