Javaアプリケーション開発ガイド入門編

Similar documents
PowerPoint Presentation

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

プレポスト【問題】

Javaアプリケーション開発ガイド一般編

Microsoft Word - Lab6.doc

Microsoft Word - Android_SQLite講座_画面800×1280

tkk0408nari

データベースアクセス

1 ex01.sql ex01.sql ; user_id from (select user_id ;) user_id * select select (3+4)*7, SIN(PI()/2) ; (1) select < > from < > ; :, * user_id user_name

Java 入門 6 Java 入門 6 - データベースにアクセスする Version 1.0 Kyosuke Yanai Copyright(c) 2010 Kyosuke Yanai

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

Android Layout SDK プログラミング マニュアル

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

プログラミング基礎I(再)

0315_F1_8iJDBC-SQLJ.PDF

Microsoft PowerPoint - prog09.ppt

Thesis Template

Microsoft Word - ACCESSINGO...

MxLogonサーバサイドツールキット用UI

WebOTX V6 JDBCアプリケーションのトラブルシューティング(JDBCデータソース)

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

— intra-mart Accel Platform セットアップガイド (WebSphere編)   第7版  

intra-mart Accel Platform

Prog1_10th

PowerPoint プレゼンテーション

PowerPoint Presentation

Microsoft PowerPoint - prog09.ppt

Javaアプリケーション開発ガイド応用編

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

◎phpapi.indd

PowerPoint プレゼンテーション

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第3版  

// JDBC // CallableStatement cs = null; try { cs = conn.preparecall("{call DUMMY_PROC(?,?)}"); cs.setstring(1, "This is a test"); cs.registeroutparame

Prog1_15th

PowerPoint Presentation

Webアプリケーションでのlog4j利用ガイド

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

Calpont InfiniDBマルチUM同期ガイド

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

intra-mart Accel Platform — OData for SAP HANA セットアップガイド   初版  

Webシステム授業資料

Javaプログラムの実行手順

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

intra-mart Accel Platform

データアダプタ概要

Microsoft PowerPoint ppt

全商情報処理検定プログラミング部門 サンプル問題1級解説

mySQLの利用

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

FileMaker ODBC and JDBC Guide

スライド 1

インストールガイド

PowerPoint プレゼンテーション

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

GEC-Java

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー

Prog2_9th

PowerPoint プレゼンテーション

機能紹介 : Java ゲートウェイとインターシステムズ製品

Microsoft Word - tutorial3-dbreverse.docx

HeartCoreインストールマニュアル

PostgreSQL Plus 管理者ガイド

GUIプログラムⅡ

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Red Hat Enterprise Linuxのcron(8)デーモンにデフォルト定義されたtmpwatch命令の動作による、WebOTXのトラブル対処方法

Microsoft PowerPoint - chap10_OOP.ppt

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

FileMaker 16 ODBC と JDBC ガイド

GEC-Java

WebOTXでのMySQL利用方法

Microsoft PowerPoint - prog03.ppt

第14回若年者ものづくり競技大会「業務用ITソフトウェア・ソリューションズ」職種 模擬競技課題

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

TestDesign for Web

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

はじめに 注意事項本資料に記載の内容は 弊社が特定の環境において 基本動作や接続動作を確認したものであり すべての環境で機能 性能 信頼性を保証するものではありません 輸出時の注意 AX シリーズに関し 本製品を輸出される場合には 外国為替及び外国貿易法の規制並びに米国輸出管理規制など外国の輸出関連

Microsoft PowerPoint - 4-MySQL50_JDBC_failover.ppt

FileMaker 15 ODBC と JDBC ガイド

JavaプログラミングⅠ

Oracleセキュア・エンタープライズ・サーチ

新OS使用時の留意事項

Microsoft Word - J-jdev_dba_db_developers.doc

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

SQL Server Integration Services 連携機能編

オブジェクト指向プログラミング・同演習 5月21日演習課題

第1章 ビジュアルプログラミング入門

TFTP serverの実装

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

CONTEC DIOプロバイダ ユーザーズガイド

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ

PowerPoint プレゼンテーション

WebReportCafe

プログラミング入門1

MySQL5.0データベース ログファイルおよびステータスの収集

GEC-Java

TopLink å SampleClient.java... 5 Ò readallsample() querysample() cachesample() Ç..

Transcription:

Javaアプリケーション開発ガイド入門編 第 2 版 2011 年 9 月 富士通株式会社

まえがき 本書の目的本書は JavaアプリケーションからSymfoware Serverを利用する方法について 説明しています 以下の内容が理解できることを目標としています JDBCを用いてJavaアプリケーションからSymfoware Serverに接続する方法 (DriverManagerを用いてSymfoware Serverに接続する方法 ) JavaアプリケーションからSymfoware Serverにアクセスして SQLを実行する方法 (Statementを用いてSQLを実行し ResultSetからデータを取り出す方法 ) 本書の読者本書は Symfoware ServerにアクセスするJavaアプリケーションを開発される方に読んでいただくように書かれています 本書を読むには 以下の知識が必要です Symfoware Serverに関する知識 SQLに関する知識 (SELECT INSERT UPDATE DELETE COMMIT ROLLBACK) Javaに関する一般知識 ( クラス メソッド オブジェクト ) i

目次 第 1 章 アプリケーションの処理の流れ... 1 1.1 Javaアプリケーションからデータベースを利用する方法... 2 1.2 アプリケーションの処理の流れ... 3 第 2 章 JDBCドライバのインストール... 5 2.1 JDBCドライバ... 6 2.2 JDBCドライバのインストール... 7 2.3 JDBCドライバのセットアップ... 8 第 3 章 データベースへの接続... 9 3.1 データベースへの接続とは何をすることか... 10 3.2 Connectionオブジェクトを作成する方法... 12 3.3 リモート接続とローカル接続... 15 3.4 リモート接続の場合のURL 記述形式... 16 3.5 ローカル接続の場合のURL 記述形式... 17 3.6 自動コミットの解除... 18 第 4 章 SQL 文の準備... 19 4.1 データベースに処理を依頼する方法... 20 4.2 Statementクラス... 21 第 5 章 データの挿入 更新 削除... 23 5.1 データを挿入 更新 削除する方法... 24 第 6 章 データの検索... 26 6.1 データを検索する方法... 27 第 7 章 検索結果の取り出し... 30 7.1 ResultSetクラス... 31 7.2 ResultSetオブジェクトのカーソル... 32 7.3 ResultSetオブジェクトから値を取り出す方法... 34 第 8 章 後始末... 35 8.1 オブジェクトのクローズ... 36 8.2 データベースからの切断... 37 第 9 章 例外処理... 38 9.1 SQLException... 39 付録 A サンプルプログラム... 42 A.1 サンプルで扱う表... 43 ii

A.2 データを検索するプログラム... 46 A.3 データを更新するプログラム... 50 iii

第 1 章 アプリケーションの処理の流れ Javaのアプリケーションからデータベースを利用する場合 アプリケーションの処理の流れには 決まった手順があります 具体的なアプリケーションの説明に入る前に 本章ではアプリケーションの全体的な流れについて説明します 1

1.1 Java アプリケーションからデータベースを利 用する方法 Java のアプリケーションから一般的なデータベースを利用するには JDBC という API を用います JDBC は Java の標準 API の一部です アプリケーションは JDBC の API を用いて データベースに SQL 文の実行を依頼し 結果を受け取ります クライアントコンピュータ データベースサーバ Java アプリケーション JDBC ドライバ データベース SQL 検索結果 2

1.2 アプリケーションの処理の流れ アプリケーションは JDBC の API を利用して JDBC の様々なオブジェクトを作成します そして JDBC のオブジェクトのメソッドを使用することで データベースにアクセスします JDBC の API は 特定のデータベースソフトに依存しません そのため どのデータベースソフトを使っていても 共通の方法でデータベースにアクセスすることができます データベースを検索する処理を行う場合 処理の流れは以下のようになります データベースに接続する (Connection オブジェクトを作成する ) SQL 文を準備する (Statement オブジェクトを作成する ) 検索を実行する (ResultSet オブジェクトを作成する ) 検索結果を取り出す 作成したオブジェクトをクローズする 3

データベースを更新する処理を行う場合 処理の流れは以下のようになります データベースに接続する (Connection オブジェクトを作成する ) SQL 文を準備する (Statement オブジェクトを作成する ) 更新を実行する 作成したオブジェクトをクローズする 4

第 2 章 JDBC ドライバのインストール Javaのアプリケーションからデータベースを利用するには JDBCのAPIを使用します JDBCのAPIを使用するためには JDBCドライバが必要です JDBCドライバは データベース製品ごとに専用のものが付属しています 本章ではJDBC ドライバを使用できるようにする方法について説明します 5

2.1 JDBC ドライバ JDBC の API を用いてデータベースを利用するには JDBC の機能を実装した JDBC ドライバが必要です JDBC ドライバは データベースソフトのベンダから提供されています JDBC の API はデータベースソフトに依存しませんが データベースを利用するための方法 (SQL 文を送ったり 結果を受け取ったりする方法 ) は データベースソフトごとに異なっています その差を JDBC ドライバが吸収しています すなわち JDBC を用いてデータベースを利用する Java のアプリケーションの処理手順はどのデータベースでも共通ですが JDBC ドライバは利用するデータベースソフト専用のものを使用する必要があります アプリケーションは JDBC の API を利用して JDBC の様々なオブジェクトを作成します そして JDBC のオブジェクトのメソッドを使用することで データベースにアクセスします [ 補足 ]JDBC の API がすべて使用可能とは限らない Java の API は容易に拡張することが可能なため データベースソフトのベンダによって JDBC の API が拡張されている場合があります また JDBC の規格で決まっている API が JDBC ドライバで すべて実装されているとは限りません そのため JDBC を用いた Java アプリケーションが どのデータベースソフトでも完全に共通に動 作するわけではありません 6

2.2 JDBC ドライバのインストール Symfoware Server の製品には Symfoware Server 専用の JDBC ドライバが付属しています JDBC ドライバは Symfoware Server クライアント機能をインストールすることでインストールされます また Symfoware Server サーバ機能をインストールすると 同時にクライアント機能もインストールされます インストール方法の詳細は それぞれ以下を参照してください Symfoware Server Standard Edition Symfoware Server Enterprise Edition または Symfoware Server Enterprise Extended Edition の場合 マニュアル インストールガイ ド ( クライアント編 ) および インストールガイド ( サーバ編 ) Symfoware Server Lite Edition の場合 マニュアル インストールガイド ( クライアント編 ) および データベース簡単運用ガイド 7

2.3 JDBC ドライバのセットアップ JDBC ドライバを使用するには JDBC ドライバの実行環境を設定しておく必要があります 実行環境の設定とは 各種のモジュールへのパスを環境変数に設定することです CLASSPATH PATH LD_LIBRARY_PATH 等の環境変数に 必要なモジュールのパスを設定しま す Symfoware Server V10 では 3 種類の JDBC ドライバのモジュールが付属しています それぞれ対応している JDBC の規約のバージョンが異なっています 通常は 最新版である JDBC4.x 対応のモジュールを使用してください 詳細は マニュアル アプリケーション開発ガイド (JDBC 編 ) の アプリケーションの実行 を参照してください [ 補足 ] Windows 版の Symfoware Server では 必要な設定がインストーラによって自動的に行われます 8

第 3 章 データベースへの接続 Javaのアプリケーションからデータベースを利用するには まずデータベースに接続する必要があります データベースに接続するとは JDBCのAPIを使用してConnectionオブジェクトを作成することです 本章では Connectionオブジェクトを作成する方法を説明します 9

3.1 データベースへの接続とは何をすることか 接続とは 通信を確立すること アプリケーションがデータベースを利用するためにまず行うべきことは アプリケーションからデータベースに接続することです データベースを管理している Symfoware Server と データベースを利用する Java アプリ ケーションは 別々のプログラムです Java アプリケーションが Symfoware Server に処理 を依頼して結果を受け取るためには 二つのプログラムが通信を行う必要があります Java アプリケーションが Symfoware Server との通信ができるようにすることを データベースに接続する と言います 通信の確立は JDBC ドライバで行う JDBC には データベースに接続する処理を行うための API が用意されています アプリケーションは この API を用いてデータベースに接続します アプリケーションは JDBC の API を通じて どのデータベースに接続したいのか 接続しようとしているユーザーは誰なのか といった情報を JDBC ドライバに伝えます 通信の確立や実際のデータベースサーバとの通信は JDBC ドライバが行います 通信の確立とは Connection オブジェクトを作成すること Java アプリケーションにおいてデータベースに接続するということは Connection オブジェクトを作成することと同義です Connection クラスは JDBC で定義されている データベースへの接続を表すクラスです 10

JDBC の API を用いてデータベースに接続すると Connection オブジェクトが作成されます アプリケーションは その後のデータベースに関する様々な処理を Connection オブジェクトを用いて実行します 11

3.2 Connection オブジェクトを作成する方法 Connection オブジェクトを作成する方法は 2 種類ありますが ここでは簡単な方の方法を説明します Java アプリケーションから Symfoware Server に接続するためには DriverManager クラス を用いて 以下のようにします ( 例 ) Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); Connection con = DriverManager.getConnection( 1 "jdbc:symford://myhost:26551/company", "UID","PWD"); 3 2 この処理の流れは どのデータベースソフトでも共通のおまじないです このおまじないの中で 以下を指定しています 1 どの JDBC ドライバを使用するのか Symfoware Server を利用する場合は 常に com.fujitsu.symfoware.jdbc.symdriver を指定します 12

2 どのデータベースに接続するのか 接続先のデータベースに関する情報を決められたフォーマットで指定します この情報を URL と呼びます URL の書き方はデータベースソフトによって異なります 3 誰がデータベースを利用するのか データベースを利用するユーザーのユーザー名とパスワードを指定します この例では データベースに接続するのは UID という名前のユーザーで そのパスワードは PWD であることを意味しています URL の書き方の詳細は 次節以降で説明します 上記の例の jdbc:symford://myhost:26551/company という URL は 以下のことを示して います 接続するデータベースがあるのは myhost というマシンである 接続するためのポート番号は 26551 である 接続するデータベースの名前は COMPANY である アプリケーションが動作するマシンから myhost というマシンにリモート接続する [ 補足 ] Connection オブジェクトを作成するためのもう一つの方法 DataSource オブジェクトの getconnection メソッドを用いることで Connection オブジェクトを作 成することもできます 具体的な方法は Java アプリケーション開発ガイド一般編 で説明し ます [ 補足 ] おまじないの意味 DriverManager は JDBC の管理を行っています JDBC ドライバを使用するためには その JDBC ドラ イバが DriverManager に登録されている必要があります 13

Class.forName メソッドを実行することによって 指定した JDBC ドライバがロードされます クラスをロードしただけでは DriverManager には登録されません しかし Java には STATIC イニシャライザという仕組みがあります クラスをロードしたとき そのクラスの中の static で宣言されたコードが 1 回だけ実行されます クラスのロード時に 1 回だけ実行される部分で JDBC ドライバを DriverManager に登録するように なっています そのため Class.forName メソッドで JDBC ドライバのクラスをロードするだけで JDBC ドライバの 機能を使用できるようになります [ 補足 ] DriverManager オブジェクトはいつ作られたのか DriverManager のメソッドは static であり DriverManager クラスのインスタンスを作成しなくて も いつでも呼び出すことができます getconnection メソッドを利用するために DriverManager オブジェクトを作成する必要はありませ ん 実は DriverManager のコンストラクタは private になっているので DriverManager オブジェクト をアプリケーションが作成することはできません 14

3.3 リモート接続とローカル接続 DriverManager クラスの getconnection メソッドで Connection オブジェクトを作成する際 接続先のデータベースを指定するために記述する文字列を URL と呼びます URL の書き方は データベースへの接続方式によって異なります Symfoware Server には リモート接続とローカル接続の 2 種類の接続方式があります リモート接続 Java アプリケーションと Symfoware Server が別々のコンピュータ上で動作している場合の接続方式です 2 台のコンピュータ間で通信を行う必要があるため TCP/IP を用いて通信を行います Symfoware Server では これを RDB2_TCP 連携と呼びます ローカル接続 Java アプリケーションと Symfoware Server が同一のコンピュータ上で動作している場合の接続方式です プログラム同士の通信は 1 台のコンピュータ内で行われます [ 補足 ] RDA-SV 連携 Symfoware Server V9 までは 2 台のコンピュータ間で通信を行うときに RDA-SV というソフトウェ アを使用する方式も使われていました しかし これは古い方式であるため Symfoware Server V10 からは RDA-SV 連携は廃止されました 15

3.4 リモート接続の場合の URL 記述形式 リモート接続の場合は 以下の形式で記述します jdbc:symford://<host>:<port_no>/<db_env>[;<options>] リモート接続の場合 接続先のコンピュータを指定する必要があります 別のコンピュータと通信を行うには 接続先のコンピュータを特定する情報としてホスト名または IP アドレス (<host> の部分 ) と 通信を行うためのポート番号 (<port_no> の部分 ) を指定する必要があります コンピュータを特定する情報に続けて データベースを特定する情報としてデータベース名 (<db_env>) を指定します 接続先のコンピュータで複数の Symfoware/RDB を動作させている場合もありますが リモート接続の場合には RDB システム名を指定する必要はありません なぜなら RDB システムごとにポート番号が異なっているからです ポート番号を指定することで 接続先の RDB システムは特定されます URL に指定できるオプション (<options> の部分 ) は ローカル接続の場合と同じです URL の書き方 指定できるオプションの詳細については マニュアル アプリケーション開発ガイド (JDBC 編 ) の DriverManager クラスからの接続 を参照してください 16

3.5 ローカル接続の場合の URL 記述形式 ローカル接続の場合は 以下の形式で記述します jdbc:symfold:///[<db_sys>.]<db_env>[;<options>] ローカル接続であれば 接続先のコンピュータを指定する必要はありません 指定する必要があるのは 接続先のデータベース名 (<db_env> の部分 ) です もし 1 台のコンピュータで複数の Symfoware/RDB を動作させているなら (RDB システム名を付ける運用をしているなら ) 接続先の RDB システム名 (<db_sys> の部分 ) も指定する必要があります 接続先以外の情報をオプションとして追加することもできます (<options> の部分 ) ここには アプリケーションの動作環境をチューニングするためのパラメーターや 接続するユーザー名やパスワードなどを指定できます URL の書き方 指定できるオプションの詳細については マニュアル アプリケーション開発ガイド (JDBC 編 ) の DriverManager クラスからの接続 を参照してください [ 補足 ] 接続するユーザー名やパスワードは getconnection メソッドの引数としても指定できますが URL 内に指定しておくこともできます Java ではオーバーロードという仕組みを用いて 引数の型や個数が異なるメソッドを同じ名前で複 数定義することができます そのため 同じメソッドであっても 状況によって引数の設定方法を 変えることができます 使用可能なメソッドの詳細は マニュアル Java API リファレンス を参照してください 17

3.6 自動コミットの解除 Connection オブジェクトを作成したら データベースに対して様々な処理を依頼することができます しかし データベースにアクセスする前に まず自動コミットの解除を行っておきます JDBC のデフォルトでは SQL 文を 1 個実行するたびに自動的にコミット処理が行われるようになっています つまり 複数の SQL 文を 1 個のトランザクションとして扱うことができません そこで Connection オブジェクトを作成したら 最初に自動コミットを解除します 自動コミットを解除するには Connection オブジェクトの setautocommit メソッドを用い ます ( 例 ) // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // 自動コミットを解除する con.setautocommit(false); [ 補足 ] SQL 文ごとに自動的にコミットさせたいならば 設定を変更する必要はありません 18

第 4 章 SQL 文の準備 Connectionオブジェクトを作成したら データベースにデータの検索やデータの更新を依頼することができます データベースへの処理の依頼は SQL 文を用います JavaのアプリケーションでSQL 文を扱うには SQL 文を表すオブジェクトを作成する必要があります 本章では実行したいSQL 文のオブジェクトを作成する方法について説明します 19

4.1 データベースに処理を依頼する方法 データベースのデータを検索したり更新したりするためには SQL を用います Java アプリケーションからデータベースサーバに SQL 文を送信するためには まず SQL 文を表すオブジェクトを作成する必要があります JDBC では SQL 文は Statement クラスのオブジェクトとして表します 20

4.2 Statement クラス Statement オブジェクトは Connection オブジェクトの createstatement メソッドを用い て作成します ( 例 ) // Statement オブジェクトを作成する Statement stmt = con.createstatement(); Statement オブジェクトを作成した段階では まだ SQL 文自体は設定しません SQL 文を指定するのは SQL 文を実行するときです ( 例 ) // Statement オブジェクトを作成する Statement stmt = con.createstatement(); // SELECT 文を実行して 検索結果を受け取る ResultSet rs = stmt.executequery( "SELECT ID,NAME FROM GENERAL.EMPLOYEE"); ( 例 ) // Statement オブジェクトを作成する 21

Statement stmt = con.createstatement(); // DELETE 文を実行する stmt.executeupdate("delete FROM GENERAL.EMPLOYEE WHERE ID=1"); 例えばデータを更新する SQL 文を実行する場合 Statement オブジェクトの executeupdate メソッドを用います また データを検索する SQL 文を実行する場合 Statement オブジェクトの executequery メソッドを用います SQL 文は executeupdate メソッドや executequery メソッドを実行する際 メソッドの引数として指定します すなわち Statement オブジェクトには SQL 文をデータベースに送信して実行させるための メソッドが用意されており そのメソッドに SQL 文を文字列 (String オブジェクト ) として渡すことで SQL 文を実行することができます 22

第 5 章 データの挿入 更新 削除 SQL 文を表すStatementオブジェクトには SQL 文を実行するためのメソッドが用意されています INSERT 文 UPDATE 文 DELETE 文といった データベースを更新するSQL 文を実行する場合には executeupdateメソッドを用います 本章では更新系のSQL 文を実行する方法について説明します 23

5.1 データを挿入 更新 削除する方法 データベースの更新は SQL 文の INSERT 文 DELETE 文 UPDATE 文を用います これらの SQL 文を実行するには executeupdate メソッドを利用します 手順は以下のようになります Connection オブジェクトを作成する Connection オブジェクトから Statement オブジェクトを作成する Statement オブジェクトの executeupdate メソッドを実行する 表にデータを INSERT するには 以下のようにします ( 例 ) // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); 24

// 自動コミットを解除する con.setautocommit(false); // Statement オブジェクトを作成する Statement stmt = con.createstatement(); // INSERT 文を実行する stmt.executeupdate( "INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(1,'tiger')"); // Statement オブジェクトを破棄する stmt.close(); // INSERT 文をコミットする con.commit(); // データベースから切断する con.close(); UPDATE 文や DELETE 文を実行したい場合は INSERT 文の場合と同様に Statement オブジェクトの executeupdate メソッドの引数で SQL 文を指定します 25

第 6 章 データの検索 SQL 文を表す Statement オブジェクトには SQL 文を実行するためのメソッドが用意されて います SELECT 文を実行する場合には executequery メソッドを用います 本章ではデータベースを検索して結果を得る SQL 文を実行する方法について説明します 26

6.1 データを検索する方法 データベースの検索は SQL 文の SELECT 文を用います SELECT 文を実行するには executequery メソッドを利用します executequery メソッドを実行すると ResultSet オブジェクトが作成されます ResultSet オブジェクトは 検索結果を表すオブジェクトです ResultSet オブジェクトについては 次章で説明します 検索結果を参照するには ResultSet オブジェクトのメソッドを用いて値を取り出します 手順は以下のようになります Connection オブジェクトを作成する Connection オブジェクトから Statement オブジェクトを作成する Statement オブジェクトの executequery メソッドを実行する ResultSet オブジェクトが作成される ResultSet オブジェクトから検索結果を取り出す 27

SELECT 文を実行して検索結果を得るには 以下のようにします ( 例 ) // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // 自動コミットを解除する con.setautocommit(false); // Statement オブジェクトを作成する Statement stmt = con.createstatement(); // SELECT 文を実行して ResultSet オブジェクトを得る ResultSet rs = stmt.executequery( "SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1"); // ResultSet から 1 行ずつデータを取り出す while (rs.next()) { // ID と NAME の値を取り出す int iid = rs.getint(1); 28

String sname = rs.getstring(2); // 取り出した値を表示させる System.out.println("ID = " + iid); System.out.println("NAME = " + sname); } // ResultSet オブジェクトを破棄する rs.close(); // Statement オブジェクトを破棄する stmt.close(); // SELECT 文をコミットする con.commit(); // データベースから切断する con.close(); 29

第 7 章 検索結果の取り出し SELECT 文を実行すると 検索結果がデータベースから返却されます 検索結果は ResultSet オブジェクトとして作成されています 本章では ResultSet オブジェクトから検索結果の値を取り出す方法について説明します 30

7.1 ResultSet クラス executequery メソッドを用いてデータベースの検索を行うと 検索結果を表す ResultSet オブジェクトが作成されます SELECT 文を実行して得られる検索結果は 1 個の表の形をしています 例えば SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1 という SELECT 文を実行した結果は ID 列と NAME 列で構成される 1 個の表になります ResultSet は この表を表すオブジェクトです ResultSet オブジェクトを用いて 検索結果の表を行単位で操作することができます 検索結果の値を得るには 検索結果の特定の行に位置づけ ResultSet オブジェクトのメソッドを用いて ResultSet オブジェクトから値を取り出します 31

7.2 ResultSet オブジェクトのカーソル 検索結果の表のデータは 1 度に 1 行ずつ参照することができます そのためには どの行を参照するのかを指定する必要があります 参照する行を指定するためにカーソルという仕組みを用います ResultSet オブジェクトには 1 個のカーソルが用意されています カーソルを 1 行ずつ進めながら 検索結果を 1 行ずつ参照します カーソルを 1 行進めるためには ResultSet オブジェクトの next メソッドを実行します ResultSet オブジェクトが作成された時点では カーソルは第 0 行に位置づけられています したがって 検索結果の最初の行を参照するには まず最初に next メソッドを呼び出す必要があります 第 1 列 第 2 列 ResultSet 第 1 行 第 2 行 カーソル 1 tiger 3 cat 4 monkey 7 snake 9 beaver SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE SECTION= A の検索結果 next で 1 行進む 32

( 例 ) // next メソッドでカーソルを 1 行ずつ進める while (rs.next()) { nextメソッドを実行 結果の行があればtrue なければfalseが返る // ID と NAME の値を取り出す int iid = rs.getint(1); String sname = rs.getstring(2); // 取り出した値を表示させる System.out.println("ID = " + iid); System.out.println("NAME = " + sname); } 検索結果の最終行まで達した状態で さらに next メソッドを実行すると next メソッドは false を返します これによって アプリケーションはすべての検索結果を参照し終わったことを知ることができます もしも SELECT 文による検索の結果 条件に合うレコードが 1 行も存在しなかったらどうなるでしょうか その場合 結果が 1 行もない ResultSet オブジェクトが作成されます そして 最初の next メソッドの呼び出しで false が返却されます 33

7.3 ResultSet オブジェクトから値を取り出す方法 カーソルである行に位置づけたら ResultSet オブジェクトからデータを取り出すことができます データを取り出すメソッドはデータの型ごとに用意されています それらのメソッドは getxxxx という形の名前になっており getter メソッドと呼ばれます データを取り出す列は 先頭から何番目かという順番で指定します 前節の例では SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE SECTION='A' の結果を想定しています 検索結果 の表は 1 番目の列が ID 2 番目の列が NAME になっています getstring(2) という操作は 2 番目の列にあるデータを文字列として取り出すことを意味しています これによって Java アプリケーションの中で利用できる String オブジェクトとして NAME の値が取り出されます [ 補足 ] ResultSet から列の値を取り出す方法には 列の番号を指定する方法のほかに 列名を指定する方 法もあります 列名を指定すると結果表の列の並び順を考慮する必要がないため プログラムが柔 軟になります 一方 列の番号を指定する方が処理は効率的に行えます 34

第 8 章 後始末 Java のアプリケーションからデータベースを利用するために 様々なオブジェクトを作 成します 処理が終了したら それらのオブジェクトを削除します 本章では用の済んだオブジェクトを破棄する方法について説明します 35

8.1 オブジェクトのクローズ Java のアプリケーションでは 使用しなくなったオブジェクトは JavaVM のガベージコレク タによって 自動的に破棄されます しかし データベースをアクセスするアプリケーションでは 使用しなくなったオブジェクトは close メソッドを実行して 明示的にオブジェクトを破棄するようにしてください 例えば Connection オブジェクトを作成するということは データベースに接続することを意味します 処理が終わった後も Connection オブジェクトをそのままにしておくと ずっとデータベースに接続したままになっています データベースは多数のユーザーが共同で使用するものです データベースに同時に接続できるユーザー数は限られています そのため 用が済んだのにデータベースに接続したままにしておくと データベースを使用したい別のユーザーが接続できなくなってしまいます 36

8.2 データベースからの切断 データベースを利用する処理が終了したら データベースへの接続を切断する必要があります 切断は Connection オブジェクトの close メソッドを呼び出すことで行います ( 例 ) // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // データベースから切断する con.close(); 同時にデータベースに接続できる個数は データベースサーバの設定によって制限されています 自分の処理が済んだのにデータベースからの切断を行わないと 他のユーザーがデータベースに接続できなくなることがあります そのため 処理が終了したらデータベースから切断するようにしてください 37

第 9 章 例外処理 Java のアプリケーションでは エラー事象を例外という仕組みで扱います 本章ではデータベースを利用する処理で発生した例外を処理する方法について説明しま す 38

9.1 SQLException Java のアプリケーションでは 例外という仕組みを用いてエラーを扱います 例外は Exception クラスで表されます JDBC を用いたデータベースの操作でエラーが発生した場合も 例外が発生します データベースに関する例外は Exception クラスを継承した SQLException クラスで表します JDBC のオブジェクトは エラーを検出すると SQLException クラスの例外をスローします アプリケーションはこの例外をキャッチして SQLEexception オブジェクトから SQLSTATE やエラーメッセージなどの情報を取り出すことができます SQLSTATE やエラーメッセージの意味については マニュアル アプリケーション開発ガイド (JDBC 編 ) を参照してください ( 例 ) try { // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // 自動コミットを解除する con.setautocommit(false); // Statement オブジェクトを作成する 39

Statement stmt = con.createstatement(); // SELECT 文を実行して ResultSet オブジェクトを得る ResultSet rs = stmt.executequery( "SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1"); // ResultSet から 1 行ずつデータを取り出す while (rs.next()) { // ID と NAME の値を取り出す int iid = rs.getint(1); String sname = rs.getstring(2); // 取り出した値を表示させる System.out.println("ID = " + iid); System.out.println("NAME = " + sname); } // ResultSet オブジェクトを破棄する rs.close(); // Statement オブジェクトを破棄する stmt.close(); 40

// INSERT 文をコミットする con.commit(); // データベースから切断する con.close(); } // データベースに関する例外をキャッチする catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); System.out.println("SQLSTATE : " + e.getsqlstate()); System.out.println("ERROR CODE : " + e.geterrorcode()); e.printstacktrace(); } // データベース以外のエラーが発生した場合の例外をキャッチする catch (Exception e) { // エラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); e.printstacktrace(); } 41

付録 A サンプルプログラム 本書で説明した内容を使用する Java のアプリケーションのサンプルを示します 42

A.1 サンプルで扱う表 表の構成 本章のサンプルプログラムでは 以下のデータベースにアクセスするとします データベース名 スキーマ名 表名 COMPANY GENERAL EMPLOYEE 表の構成は以下のとおりとします 列名 ID NAME データ型 INT CHARACTER(10) データベースは Windows 上に作成し ローカル接続でアクセスするものとします 表の作成 Symfoware Server Standard Edition Symfoware Server Enterprise Edition または Symfoware Server Enterprise Extended Edition では 表を作成する際 表定義の他に表に対応する DSI と DSO を定義し データの格納先となるデータベーススペースを定義する必要があります Symfoware Server Lite Edition では デフォルトデータベーススペースに作成されます 各種の資源の定義操作は Symfoware Server に付属している WebDBtools という Web ブラウザベースのツールを用いて 対話的に行うことができます 定義操作を DDL 文を直接実行することによって行うこともできます その場合は 以下の DDL 文を rdbddlex コマンドで実行してください Symfoware Server Standard Edition Symfoware Server Enterprise Edition または Symfoware Server Enterprise Extended Edition の場合 43

CREATE DATABASE COMPANY; CREATE DBSPACE MYDBSP_1 ALLOCATE FILE C: COMPANY.dbs ATTRIBUTE SPACE (1M); CREATE SCHEMA GENERAL; CREATE TABLE GENERAL.EMPLOYEE (ID INT,NAME CHARACTER(10)); CREATE DSO DSO01 FROM GENERAL.EMPLOYEE TYPE SEQUENTIAL (PAGESIZE(4)); CREATE DSI DSI01 DSO DSO01 ALLOCATE DATA ON MYDBSP_1 SIZE 100K; GRANT ALL PRIVILEGES ON GENERAL.EMPLOYEE TO PUBLIC; GRANT ALL PRIVILEGES ON SCHEMA GENERAL TO PUBLIC; GRANT ALL PRIVILEGES ON DBSPACE MYDBSP_1 TO PUBLIC; Symfoware Server Lite Edition の場合 CREATE DATABASE COMPANY; CREATE SCHEMA GENERAL; CREATE TABLE GENERAL.EMPLOYEE (ID INT,NAME CHARACTER(10)); GRANT ALL PRIVILEGES ON GENERAL.EMPLOYEE TO PUBLIC; GRANT ALL PRIVILEGES ON SCHEMA GENERAL TO PUBLIC; GRANT ALL PRIVILEGES ON DBSPACE MYDBSP_1 TO PUBLIC; 表へのデータ投入 44

表を作成したら 初期データを格納しておきます Symfoware Server Standard Edition Symfoware Server Enterprise Edition または Symfoware Server Enterprise Extended Edition の場合 データを投入するには rdbsloader コマンドを使用します rdbsloader -mi -i COMPANY.DSI01 -t C: TABLE01.dat ここで TABLE01.dat は 以下のような内容のテキストファイルです これが初期投入するデータとなります 1, dog 2, cat 3, lion Symfoware Server Lite Edition の場合 データを投入するには rdbupt コマンドを使用します rdbupt ma b COMPANY.GENERAL.EMPLOYEE t C: TABLE01.dat 45

A.2 データを検索するプログラム データを検索する Java アプリケーションです Symfoware Server に接続するユーザーのユーザー名を UID パスワードを PWD としています 環境に合わせて変更してください import java.sql.*; import java.io.*; public class test01 { public static void main(string args[]) { try { // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // 自動コミットを解除する 46

con.setautocommit(false); // Statement オブジェクトを作成する Statement stmt = con.createstatement(); // SELECT 文を実行して ResultSet オブジェクトを得る ResultSet rs = stmt.executequery( ID=3"); "SELECT ID,NAME FROM GENERAL.EMPLOYEE WHERE ID=1 OR // ResultSet から 1 行ずつデータを取り出す while (rs.next()) { // ID と NAME の値を取り出す int iid = rs.getint(1); String sname = rs.getstring(2); // 取り出した値を表示させる System.out.println("ID = " + iid); System.out.println("NAME = " + sname); } // ResultSet オブジェクトを破棄する rs.close(); 47

// Statement オブジェクトを破棄する stmt.close(); // INSERT 文をコミットする con.commit(); // データベースから切断する con.close(); } // データベースに関する例外をキャッチする catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); System.out.println("SQLSTATE : " + e.getsqlstate()); System.out.println("ERROR CODE : " + e.geterrorcode()); e.printstacktrace(); } // データベース以外のエラーが発生した場合の例外をキャッチする catch (Exception e) { 48

// エラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); e.printstacktrace(); } } } 49

A.3 データを更新するプログラム データを更新する Java アプリケーションです Symfoware Server に接続するユーザーのユーザー名を UID パスワードを PWD としています 環境に合わせて変更してください import java.sql.*; import java.io.*; public class test02 { public static void main(string args[]) { try { // データベースに接続する Class.forName("com.fujitsu.symfoware.jdbc.SYMDriver"); String url = "jdbc:symfold:///company"; Connection con = DriverManager.getConnection(url,"UID","PWD"); // 自動コミットを解除する con.setautocommit(false); 50

// Statement オブジェクトを作成する Statement stmt = con.createstatement(); // INSERT 文を実行する stmt.executeupdate( "INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(4,'tiger')"); stmt.executeupdate( "INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(5,'monkey')"); stmt.executeupdate( "INSERT INTO GENERAL.EMPLOYEE(ID,NAME) VALUES(6,'rat')"); // UPDATE 文を実行する stmt.executeupdate( "UPDATE GENERAL.EMPLOYEE SET NAME = 'gorilla' WHERE ID=5"); // DELETE 文を実行する stmt.executeupdate( "DELETE FROM GENERAL.EMPLOYEE WHERE id=6"); // 更新をコミットする con.commit(); // Statement オブジェクトを破棄する stmt.close(); 51

// データベースから切断する con.close(); } // データベースに関する例外をキャッチする catch (SQLException e) { // 例外オブジェクトからエラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); System.out.println("SQLSTATE : " + e.getsqlstate()); System.out.println("ERROR CODE : " + e.geterrorcode()); e.printstacktrace(); } // データベース以外のエラーが発生した場合の例外をキャッチする catch (Exception e) { // エラー情報を取り出す System.out.println("ERROR MESSAGE : " + e.getmessage()); e.printstacktrace(); } } } 52