Webアプリの常識をJSPとStrutsで身につける
連載インデックスへ
Webアプリの常識をJSPStrutsで身につける(8)

MySQLの常識を知りセットアップしてJSPからDB操作


株式会社メセナ・ネットコム
眞野 寿彦
2009/4/7


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アプリケーションを実行してみます。

1-2-3-4

 Index
第8回 MySQLの常識を知りセットアップしてJSPからDB操作
  Page1
「データベース操作」ぐらいできるよね?
いまさら聞けない「MySQL」とは?
MySQL 6.0.9のダウンロードとインストール
  Page2
JavaのDB操作の“要”、「JDBC」とは?
DBと連携したWebアプリを作ってみよう
  Page3
注意! 「DBとの切断は必ず行いましょう」
  Page4
次回は、BeanとO/Rマッピングについて





Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH