検索
連載

【新人研修向け特別企画】JavaでPHPを使ってみた小山博史のJavaを楽しむ(5)(3/3 ページ)

教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた筆者が、独自の視点からJavaの面白さを掘り下げていく。(編集部)

Share
Tweet
LINE
Hatena
前のページへ |       

Pure JavaのDB、Derbyと連携させるには?

 日本語が使えたので、今度はDBアクセスです。オンラインマニュアルによると、MySQLを使うPHPの関数を使ってDBへアクセスできるようです。しかし、ここではJavaプログラマが一番興味を持つであろう、Pure Javaで動作させることを目標として、JDK 6に標準で同梱されているDerbyと連携させてみました。厳密に調べると、全部は必要ないはずですが、動作させることを優先して、resin-3.1.0/webapps/ROOT/WEB-INF/lib へDerbyのjarファイルを一式コピーしておきます。

編集部注:Derbyについての詳細を知りたい読者は、本連載第3回の「待望のJava SE 6 でパーシステンス」をご参照願います。

 また、DB用にresin-3.1.0/dbディレクトリを作り、derby.properties設定ファイルを配置しておきます。なお、ここでは改良したResinを使って確認をしています。

$ mkdir ~/resin-3.1.0/webapps/ROOT/WEB-INF/lib
$ cp /usr/java/jdk1.6.0/db/lib/*.jar \
    /resin-3.1.0/webapps/ROOT/WEB-INF/lib/
DerbyのJARファイルをコピー
derby.connection.requireAuthentication=true
derby.authentication.provider=BUILTIN
derby.user.adminuser=sapass
設定ファイル(resin-3.1.0/db/derby.properties)

 実際に使うDBのディレクトリとしてresin-3.1.0/db/sample/を作成してDerbyをサーバモードで起動しました。サーバ側はJDK 6同梱版なので、ここではJDK 6を使いました。別コンソールから起動している点には、注意してください。

$ export JAVA_HOME=/usr/java/jdk1.6.0
$ export DERBY_HOME=$JAVA_HOME/db
$ cd ~/resin-3.1.0/db/
$ $DERBY_HOME/frameworks/NetworkServer/bin/startNetworkServer.ksh
Derbyをサーバモードで起動

 サーバの起動ができたら、DBとテーブルの作成をする必要があります。ですから、新しくコンソールを開いて次のようにijコマンドを実行してサーバへ接続して、SQL文を実行しました。

$ export JAVA_HOME=/usr/java/jdk1.6.0
$ export DERBY_HOME=$JAVA_HOME/db
$ $DERBY_HOME/frameworks/NetworkServer/bin/ij.ksh
ij バージョン 10.2
ij> connect 'jdbc:derby://localhost/sampledb;create=true;user=adminuser;
password=sapass';
ij> create table users (
id integer not null generated
always as identity (start with 1, increment by 1),
name varchar(20)
);
0 行が挿入/更新/削除されました
テーブルの作成

 なお、Derbyを停止するには次のようにコンソールからコマンドを入力します。動作確認が終了した後は、このコマンドを入力してシャットダウンをするようにしましょう。

$ $DERBY_HOME/frameworks/NetworkServer/bin/stopNetworkServer.ksh
Derbyを停止

 DerbyをPHPから使うためには、JNDIデータソースを登録する必要があります。webapps/ROOT/WEB-INF/resin-web.xmlを次のように作成しました。org.apache.derby.jdbc.ClientDriverを使って、ローカルホストのDerbyサーバへ接続するように設定をしています。PHPプログラムでこのデータソースを使う場合には、「jdbc/sampledb」というJNDI名を利用します。

<web-app xmlns="http://caucho.com/ns/resin"
        xmlns:resin="http://caucho.com/ns/resin/core">
    <database jndi-name='jdbc/sampledb'>
        <driver type="org.apache.derby.jdbc.ClientDriver">
            <url>jdbc:derby://localhost/sampledb</url>
            <user>adminuser</user>
            <password>sapass</password>
        </driver>
    </database>
</web-app>
resin-web.xml

編集部注:JNDIデータソースについての詳細を知りたい読者は、Java TIPSの「JNDI活用でデータソース管理を一元化する」をご参照願います。

PHPからDBにデータを挿入するには?

 結構手間が掛かりますが、準備をしてから、PDO(PHP Database Object)を使うPHPプログラムを作成して動作させてみました。最初は、検索がうまくできずに慌てましたが、DB側でカラム名が大文字になっていたので、それに合わせたところ動作するようになりました。insert.phpを1回表示してから、search.phpを表示すると、「テストユーザ」というデータが表示されます。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; 
                charset=utf-8">
        <title>挿入テスト</title>
    </head>
    <body><p>
<?php
    $pdo = new PDO("java:comp/env/jdbc/sampledb","adminuser","sapass");
    echo "<h2>挿入 \$pdo->exec</h2>\n";
    $name = "テストユーザ";
    $pdo->exec("INSERT INTO users (NAME) VALUES ('$name')")
    || die("ユーザ $name を登録できませんでした");
?>
    </p></body>
</html>
insert.php

 「http://localhost:8080/insert.php」へアクセスすると、自動的に「テストユーザ」というNAMEの値を持つレコードがusersテーブルへ挿入されます。実行画面は次のとおりですし、実際にDBへ挿入されていることはijを起動したコンソールから確認できます。

図9 insert.phpの表示
図9 insert.phpの表示
ij> select * from users;
ID         |NAME 
--------------------------------
1          |テストユーザ 
 
1 行が選択されました
insert.phpの実行結果

PHPからDBを検索するには?

 なお、検索にはいくつか方法がありますが、配列を使う方法オブジェクトとして取得する方法のどちらも動作しました。「http://localhost:8080/search.php」へアクセスすると、DBに格納された値が表示されました。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; 
                charset=utf-8">
        <title>挿入テスト</title>
    </head>
    <body><p>
<?php
    $pdo 
    = new PDO("java:comp/env/jdbc/sampledb","adminuser","sapass");
 
    echo "<h2>foreachで検索、配列を使用</h2>\n"; 
    echo "<table border='2'>\n";
    foreach ($pdo->query("SELECT * FROM users") as $row) {
        echo "<tr><td>${row['NAME']}</td></tr>\n";
    }
    echo "</table>\n";
 
    echo "<h2>whileで検索、配列を使用</h2>\n";
    $rs = $pdo->query("SELECT * FROM users");
    echo "<table border='2'>\n";
    while (($row = $rs->fetch(PDO::FETCH_ASSOC))) {
        echo "<tr><td>${row['NAME']}</td></tr>\n";
    }
    echo "</table>\n";
 
    echo "<h2>オブジェクトの使用</h2>\n";
    $rs = $pdo->query("SELECT * FROM users");
    echo "<table border='2'>\n";
    while (($obj = $rs->fetch(PDO::FETCH_OBJ))) {
        echo "<tr><td>$obj->NAME</td></tr>\n";
    }
    echo "</table>\n";
?>
    </p></body>
</html>
search.php
図10 search.phpの表示
図10 search.phpの表示

JavaクラスをPHPから使ってみよう!

 今回はResinに同梱されているPure JavaのPHP実行エンジンであるQuercusを使ってみました。また、Pure JavaのDBであるDerbyをResinで動作するPHPプログラムから使えることも確認してみました。オンラインマニュアルによると、JavaクラスをPHPプログラムから使用することもできるようなので、ほかにもいろいろなプログラミングが楽しめそうです。

 さらに、オープンソースなら、今回紹介したように自分でソースコードを改良して使うことも可能です。腕に覚えのある人はパッチを作って本家へフィードバックをしてみるということもできるはずですが、まずはちょっとした改良から試してみると楽しいと思います。読者の皆さんも自分なりに使ってみてはいかがでしょうか?

参考

筆者プロフィール

小山博史(こやま ひろし)

Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクトへ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)bugs(J)の活動へも参加している。



Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る