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

Java

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

作業環境

  • 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 クラスについては以下の記事で説明しています。

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 を実行します。

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

コメント

タイトルとURLをコピーしました