Servlet/JSP 応用編04 Javaとデータベース

はじめに

今回は、Javaプログラムとデータベースを操作する方法を解説したいと思う。
まず、Javaからデータベースに操作するには、JDBCを使わないといけない。これを利用することで、データベース管理システムにSQL文を発行して、結果を取得できる。さらに、他の利点としては、データベース間の違いを吸収してくれる点である。データベースは様々あり、それぞれ性能が違う。しかし、そのようなことを気にせずに操作できるようにしたのがJDBCである。

データベース接続

データベースを操作するには、接続しなければならない。接続するのにjava.sql.Connectionクラスのインスタンスが必要となる。また、java.sql.DriverManagerのクラスメソッドも必要。使い方は以下の通りになる。

 

Class.forName("JDBCのクラス名");

Connection conn = DriverManager.getConnection("接続文字列" , "ユーザ名" , "パスワード");

 

このように、JDBCのクラス名や他の情報が必要となる。なので、接続する情報を変更しないといけないとき、広範囲の修正が必要となる。しかし、現在のJDBC2.0では、データソースという機能が増えた。データソースというのは、アプリケーションサーバを利用してデータベースに接続する仕組みである。

利点は2つある。

1つ目は、接続に必要な情報をアプリケーションサーバの設定ファイルに記述することができる。なので、情報の変更が簡単、または、容易になる。

2つ目は、データベースの接続の際に、再利用することで、性能を向上させることができる。

では、データベースにアクセスする手順を説明していく。

簡単に言うと、データベースに接続し、SQLを作成、実行。結果を取得、必要な処理の実行。最後に切断を行う。

一つ一つに様々なメソッドを使う。実際のプログラムの中で解説していく。

今回作成するプログラム

今回は、データベースに接続する練習なので、商品一覧を取得し、表示するサーブレットを作成する。つまり、サーブレットの中で、

select * from product;

を実行すればよい。

実際に書いていく。

import tool.Page;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@WebServlet(urlPatterns={"/chapter14/all"})
public class All extends HttpServlet{

    public void doGet(HttpServletRequest request , HttpServletResponse response)
     throws ServletException,IOException{
        PrintWriter out = response.getWriter();
        Page.header(out);
        try{
            InitialContext ic = new InitialContext();
            DataSource ds = (DataSource)ic.lookup("java:/comp/env/jdbc/book");
            Connection con = ds.getConnection();

            PreparedStatement st = con.prepareStatement("select * from product");
            ResultSet rs = st.executeQuery();

            while(rs.next()){
                out.println(rs.getInt("id"));
                out.println(":");
                out.println(rs.getString("name"));
                out.print(":");
                out.println(rs.getInt("price"));
                out.println("<br>");
            }


            st.close();
            con.close();
        }catch(Exception e){
            e.printStackTrace(out);
        }

        Page.footer(out);
    }
}

 まず、データベースを扱ううえで必要なクラスなどをインポートする。

try文の中は、最初にInitialContextオブジェクトを生成。これにより、データやオブジェクトを名前で参照することができる。しかし、これだけでは意味がないので、lookupメソッドを使う。引数には、データソースのオブジェクトを入れる。ここで、注意があり、lookupメソッドの返り値はObject型であるから、キャストが必要となる。そして、DataSource型の変数に入れれば、あとは、接続するだけである。getConnectionを使用すれば、接続できる。接続が終われば、次は、SQLの作成と実行である。実行するためにPreparedStatementオブジェクトを取得する。そして、このSQL文をexecuteQueryメソッドを実行し、ResultSetオブジェクトとして取得する。

これで、データを取得できたので、while文の中で、nextメソッドを使用し、行ごとに、IDとname、priceの値を取っていく。nextメソッドの返り値はbooleanで、データがなくなれば、falseで帰ってくる。最後には、closeメソッドで、データベースとの接続を切る。

実際に実行すると下記のようになった。

 

10 : つぶ貝 :100
11 : サラダ軍艦 :150
12 : ねぎとろ軍艦 :150
13 : ねぎとろ巻 :150
14 : アボガド巻 :150

 

前の記事で、idが10より下、14より上を消したので全部のデータが表示されていることが分かる。

おわりに

今回は、データベースに接続する方法を紹介した。次回からは、Javaプログラムから商品を検索、追加などをしていこうと思う。