Java Servlet を使ってデータベースに接続する Part 2

Java

この記事は以下の記事の続きです。

Java Servlet を使ってデータベースに接続する Part 1

作業環境

  • Windows 10
  • Eclipse 4.4
  • Tomcat 8.0
  • MySQL 5.7 系

Java からデータベースへアクセスする

本来であればデータベースアクセス用のクラス(いわゆる DAO クラス)を作るべきですが、今回は Servlet クラスからデータベースへアクセス、取得したデータを bean クラスに保存して JSP を通して表示、という仕組みを実装していきます。

なお、今回は database という名前のパッケージを作成して、その中にクラスを作ってソースコードを書いていきます。

データベースへアクセスする Servlet を作る

Users.java という名前で Servlet クラスを作成します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = null; String url = "jdbc:mysql://localhost:3306/servlet?characterEncoding=UTF-8&serverTimezone=JST&autoReconnect=true&useSSL=false"; String user = "root"; String password = "password"; // beanList を生成 ArrayList<UserBean> beanList = new ArrayList<UserBean>(); try { // JDBC ドライバを読み込み Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, user, password); // データベースへ SQL 文を発行 Statement stmt = conn.createStatement(); String sql = "SELECT * FROM users"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { // bean を生成 UserBean bean = new UserBean(); // SQL リザルトからデータを取得し、bean に保存していく bean.setId(rs.getInt("id")); bean.setMail(rs.getString("mail")); bean.setName(rs.getString("name")); // データを保存した bean を beanList に追加 beanList.add(bean); } rs.close(); stmt.close(); } catch (ClassNotFoundException e) { // 例外処理 e.printStackTrace(); } catch (SQLException e) { // 例外処理 e.printStackTrace(); } catch (Exception e) { // 例外処理 e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { // 例外処理 e.printStackTrace(); } } // beanList をリクエストにセット request.setAttribute("beanList", beanList); ServletContext context = this.getServletContext(); // フォワード先を指定 RequestDispatcher dispatcher = context .getRequestDispatcher("/database/show_users.jsp"); // フォワード処理 dispatcher.forward(request, response); }

上のようなソースコードになりました。例によって doGet メソッド以外は省略しています。

DBViewer のときと違い、接続文字列を少し長くしていますが、tomcat の設定によってこうしないとつながらないことがあるようです。問題なければどっちでもよいと思います。

UserBean クラスはあとで作成します。

また、Connection や Statement などでインポートを求められると思いますが、java.sql 系のものをインポートしておいてください。

このソースコードで重要となってくるのは以下のコードです。

while (rs.next()) { // bean を生成 UserBean bean = new UserBean(); // SQL リザルトからデータを取得し、bean に保存していく bean.setId(rs.getInt("id")); bean.setMail(rs.getString("mail")); bean.setName(rs.getString("name")); // データを保存した bean を beanList に追加 beanList.add(bean); }

rs には SELECT 文で取得したデータが入っています。

今回は users テーブルの中身をすべて取得しているので、4 行のデータが入っているわけです。

本来、これが何行あるかは取得してみるまでわかりません。ここで役立つのが rs.next というメソッドです。

rs は一番初めは「SQL で取得したデータの 0 行目」を示しています。この状態を「カーソルが 0 番目にある」と表現します。

この状態で rs.getInt などを使用すると、取得したデータの 0 行目を取得できます。まあ 0 行目なんて存在しないので要するに null です。

で、このカーソルをどうやって動かすかというところで rs.next メソッドが出てきます。

rs.next メソッドには 2 つの役割があります。ひとつは、SQL で取得したデータの「カーソル」を一つすすめることです。

カーソルの行が 1…2…と進んでいく中で getInt, getString などで取得したデータを拾っていけば、1 行ずつそれぞれのデータが取得できることになります。

もう一つの役割が戻り値の返却です。rs.next メソッドは、カーソルをすすめたあとに戻り値として真偽値を返却します。

rs.next は取得したデータに「次の行」が存在する限り延々と true を返却し続けます。

つまり上記のソースコードでは、次の行がなくなるまで bean にデータを保存、それを beanList に追加、という処理が記述されている while 文を回し続けてくれるということになります。

データの受け渡しに使う Bean クラスを作る

UserBean という名前でクラスファイルを作成します。

bean クラスについては以下の記事で説明しています。

Servlet における Bean クラスとは Part 1

package database; import java.io.Serializable; public class UserBean implements Serializable { private static final long serialVersionUID = 1L; private int id; private String mail; private String name; UserBean(){} public int getId() { return id; } public void setId(int id) { this.id = id; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

users テーブルのカラムを基準とした Bean クラスを作成しました。

データベースから取得したデータを表示する JSP を作る

今回はわかりやすいように、パッケージと同じく WebContent の中に database というフォルダを作成します。

その database フォルダの中に show_users.jsp という名前で JSP ファイルを作ります。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.ArrayList" %> <%@ page import="database.UserBean" %> <% ArrayList<UserBean> beanList = (ArrayList<UserBean>)request.getAttribute("beanList"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ユーザ表示</title> </head> <body> <table> <tbody> <tr> <th>ユーザID</th> <th>メールアドレス</th> <th>ユーザ名</th> </tr> <% for(UserBean bean : beanList){ %> <tr> <td><%= bean.getId() %></td> <td><%= bean.getMail() %></td> <td><%= bean.getName() %></td> </tr> <% } // endfor %> </tbody> </table> </body> </html>

上のようなソースコードになりました。

実行して動作を確認する

MySQL を起動した状態で Users.java を実行します。

データベースの中身が表示されていることが確認できました。

広告

関連記事

新着記事

広告

Servlet における Bean クラスとは Part 1
Java Servlet を使ってデータベースに接続する Part 1