MySQLの常識を知りセットアップしてJSPからDB操作Webアプリの常識をJSPとStrutsで身につける(8)(3/4 ページ)

» 2009年04月07日 00時00分 公開
[眞野寿彦株式会社メセナ・ネットコム]

Javaファイル上で、DB接続はどのように行われているのか

 次に、「C:\PKG\Hello\WEB-INF\src」配下に「login」を作成して、下記のJavaファイル「LoginAction.java」を作成してください。

LoginAction.java
package login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;

import login.form.LoginForm;

public final class LoginAction extends Action {

    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)
    throws Exception {

        LoginForm loginForm = (LoginForm)form;

        int count = 0;
        String status = null;
        String id = loginForm.getId();
        String password = loginForm.getPassword();

        InitialContext ic = null;
        DataSource ds = null;
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        ActionMessages errors = new ActionMessages();

        try {
            // DB情報取得
            ic = new InitialContext();
            Context envCtx = (Context) ic.lookup("java:comp/env");
            ds = (DataSource) envCtx.lookup("jdbc/mysql");

            con = ds.getConnection();
            ps = con.prepareStatement(
                "select id, password, name from user where id = ?");
            ps.setString(1, id);
            rs = ps.executeQuery();

            // 認証処理
            while (rs.next()) {
                count++;
                if (count == 1) {
                    // 一致しなければ認証失敗
                    if (! id.equals(rs.getString("id")) ||
                    ! password.equals(rs.getString("password"))) {
                        errors.add(ActionMessages.GLOBAL_MESSAGE,
                            new ActionMessage("errors.login"));
                    }else{//一致データを取得
                        loginForm.setName(rs.getString("name"));
                    }
                }
            }

            // 0件ならば認証失敗
            if (count == 0) {
                errors.add(ActionMessages.GLOBAL_MESSAGE,
                    new ActionMessage("errors.login"));
            }

        } catch (Exception e) {
            throw e;
        } finally {
            con.close();
        }

        if(rs != null){
            return mapping.findForward("success");
        }else{
            return mapping.findForward("errors");
        }
    }
}

 ここで、今回のLoginAction.javaのデータベースのアクセス処理について説明します。まず、初期値としてクラスや各種インターフェイスを定義します。

表 DB操作のクラス/インターフェイス
クラス/
インターフェイス名
概要
InitialContext ネーミング操作を実行するための開始コンテキストで、コンテキストを基準にしている
DataSource 物理データソースへの接続に対する情報を保持するためのインターフェイス
Connection DBへの接続のために使用するオブジェクト
PreparedStatement プリコンパイルされたSQL文を表すオブジェクト
ResultSet DBから取得した結果を格納できるオブジェクト。DBに照会する文を実行することによって生成される

 次に、JDBCドライバの情報をTomcatの設定ファイル「server.xml」のコンテキストContext)から取得します。

            // DB情報取得
            ic = new InitialContext();
            Context envCtx = (Context)ic.lookup("java:comp/env");
            ds = (DataSource) envCtx.lookup("jdbc/mysql");

 JDBCドライバの情報の情報を使用して、DBへアクセスします。

            con = ds.getConnection();

 DBにアクセスした状態で、SQL文を作成してIDを条件にセットし、実行した結果を取得します。

            ps = con.prepareStatement(
                "select id, password, name from user where id = ?");
            ps.setString(1, id);
            rs = ps.executeQuery();

 SQL文の「?」は引数を意味し、setStringメソッドで引数をセットしています。また、PreparedStatementは通常のStatementとは異なり、事前にコンパイルされたSQL文を使用するので、Statementよりも処理が高速です。詳細は、記事「準備済みSQL命令でデータベースアクセスを効率化する」を参照してください。

注意! 「DBとの切断は必ず行いましょう」

注意すべきポイントとして、DB操作の際はエラー発生の有無にかかわらず、必ずDBとの切断を行わなければなりません。今回は、例外処理の「finally」を使用してDBとの切断を行っています。

        } finally {
            con.close();
        }

本稿では詳細まで解説しませんが、finally内の処理を含めたDBの切断はとても重要なことですので、記事「データベースに接続したら後始末は確実に」を参照してください。


 次ページではいよいよ、DBと連携したWebアプリケーションを実行してみます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。