データベース連携(JDBC)
(ブログ記事の一覧は「こちら」)
JavaのWebアプリで、DB(データベース)にアクセスする方法について確認していきましょう。
DBの作成、準備
Windowsの環境の場合、XAMMPを用いて、以下を構築してください。
DBを作成
db_sa2_sample
テーブルを生成
tbl_sa2_sample
テーブルの構造
名前 | データ型 | その他 |
---|---|---|
id | int | primary |
name | varchar(128) | - |
hobby | varchar(128) | - |
【参考】テーブル作成のSQL文
CREATE TABLE `db_sa2_sample`.`tbl_sa2_sample` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(128) NOT NULL , `hobby` VARCHAR(128) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;
ダウンロード
以下のURLから、必要なjarファイルをダウンロードします。
https://downloads.mysql.com/archives/c-j/
バージョンは「5.1.xx」を選択してください。「mysql-connector-java-5.1.xx-bin.jar」を使用します。
プロジェクトの設定
「プロジェクト名」を右クリックして、「ビルド・パス」-「ビルド・パスの構成」を選択します。 (Eclipseの環境によっては、「プロジェクト名」を右クリックして、「プロパティ」を選択して、「Javaのビルド・パス」を選択します。)
「Javaのビルド・パス」ウィンドウの「ライブラリー」タブが開きますので、右側の「外部JARの追加」ボタンをクリックして、ダウンロードしたjarファイルを追加します。
次に、左側のリストから「デプロイメント・アセンブリー」を選択します。右側の「追加」ボタンをクリックするとダイアログが開くので、「Javaビルド・パス・エントリー」が選択された状態で「次へ」ボタンをクリックして、表示されているjarファイルを選択して「完了」ボタンをクリックします。
プロジェクトの設定は以上です。
サンプルプログラム(データの登録)
「セッションスコープ」のサンプルプログラムを利用して、入力フォームの値をDBに保存するサンプルを作成します。
画面の流れは、変更はありません。「確認画面」で「進む」を選択すると、「DBに保存」の処理を行い、「完了画面」に移ります。
「入力フォーム」 ⇒ 「確認画面」 ⇒ (「DBに保存」→「完了画面」)
対応するプログラムのファイルは以下のようになります。
[form.jsp]
⇒ (( [MainServlet.java] ↔ [UserInfo.java] )→ [confirm.jsp] )
⇒ (( [MainServlet.java] ↔ [DbManager.java] )→ [done.jsp] )
プロジェクト名、パッケージ名は、以下のようにしています。
プロジェクト名:SessionTest
パッケージ名:com.test.session
【M】JavaBeans(UserInfo.java)
「セッションスコープ」のサンプルプログラムと同じです。
DBに接続、データを保存(DbManager.java)
新規にクラスを作成します。(最初に作成した)DBに接続して、SQL(ここでではINSERT文)を実行します。
package com.test.session; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DbManager { public void InsertUserInfo(UserInfo userInfo) { final String DSN = "jdbc:mysql://localhost/db_sa2_sample?characterEncoding=utf8"; final String USER = "root"; final String PASSWORD = ""; Connection conn = null; try { // JDBCドライバのロード Class.forName("com.mysql.jdbc.Driver"); // DBに接続 conn = DriverManager.getConnection(DSN, USER, PASSWORD); // SQL String sql = "INSERT INTO tbl_sa2_sample (name, hobby) values (?, ?)"; PreparedStatement pStmt = conn.prepareStatement(sql); pStmt.setString(1, userInfo.getName()); pStmt.setString(2, userInfo.getHobby()); // 実行 int num = pStmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // DBを切断 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
jarファイルのバージョンによっては、プログラムも変わってきます。「mysql-connector-java-8.0.xx.jar」を使用した場合、該当の箇所について、それぞれ以下のように書き換えてください。
final String DSN = "jdbc:mysql://localhost:3306/db_sa2_sample?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9:00&rewriteBatchedStatements=true";
// JDBCドライバのロード Class.forName("com.mysql.cj.jdbc.Driver");
【V】JSP(form.jsp)
「セッションスコープ」のサンプルプログラムと同じです。
【V】JSP(confirm.jsp)
「セッションスコープ」のサンプルプログラムと同じです。
【V】JSP(done.jsp)
セッションスコープのサンプルプログラムを利用していますのでJSPファイルですが、データの読み込みは行っていないのでHTMLファイルでも構いません。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>完了画面</title> </head> <body> <p>登録が完了しました。</p> <a href="/SessionTest/MainServlet">戻る</a> </body> </html>
【C】サーブレット(MainServlet.java)
doGetメソッドにて、パラメータが「action=done」の場合に、セッションスコープに保存された情報をDBに保存する処理を追加します。その後、不要となったセッションスコープ内のインスタンスを削除して、完了画面に移動します。
@WebServlet("/MainServlet") public class MainServlet extends HttpServlet { private static final long serialVersionUID = 1L; public MainServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); // フォワード先 String strForwardPath = null; String strAction = request.getParameter("action"); if (strAction == null) { // フォワード先を設定(入力フォーム) strForwardPath = "/form.jsp"; } else if (strAction.equals("done")) { // セッションスコープに保存された情報 HttpSession session = request.getSession(); UserInfo userInfo = (UserInfo) session.getAttribute("user_info"); // DBに保存 DbManager dbManager = new DbManager(); dbManager.InsertUserInfo(userInfo); // 不要となったセッションスコープ内のインスタンスを削除 session.removeAttribute("user_info"); // 登録後のフォワード先を設定(完了画面) strForwardPath = "/done.jsp"; } // 設定されたフォワード先にフォワード RequestDispatcher dispatcher = request.getRequestDispatcher(strForwardPath); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); String strName = request.getParameter("name"); String strHobby = request.getParameter("hobby"); // UserInfoクラス(JavaBeans) UserInfo userInfo = new UserInfo(); userInfo.setName(strName); userInfo.setHobby(strHobby); // セッションスコープに保存 HttpSession session = request.getSession(); session.setAttribute("user_info", userInfo); // フォワード(確認画面) RequestDispatcher dispatcher = request.getRequestDispatcher("/confirm.jsp"); dispatcher.forward(request, response); } }
実行
「MainServlet.java」を実行します。完了画面に進んだとき、入力した値がDBに保存されていることを確認してください。
サンプルプログラム(データの取得)
DBに接続、データの読み込み(DbManager.java)
DbManager.java に以下のメソッドを追加します。
public ArrayList<UserInfo> getUserInfo() { final String DSN = "jdbc:mysql://localhost/db_sa2_sample?characterEncoding=utf8"; final String USER = "root"; final String PASSWORD = ""; ArrayList<UserInfo> arUserInfo = new ArrayList(); Connection conn = null; try { // JDBC ドライバのロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 conn = DriverManager.getConnection(DSN, USER, PASSWORD); // SQL String sql = "SELECT * FROM tbl_sa2_sample"; PreparedStatement pStmt = conn.prepareStatement(sql); // 実行 ResultSet rs = pStmt.executeQuery(); // 結果表に格納されたレコードの内容を表示 while (rs.next()) { String name = rs.getString("name"); String hobby = rs.getString("hobby"); UserInfo userInfo = new UserInfo(); userInfo.setName(name); userInfo.setHobby(hobby); arUserInfo.add(userInfo); } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { // データベース切断 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return arUserInfo; }
【C】サーブレット(ShowDataServlet.java)
新規にサーブレットクラスを作成します。
package com.test.session; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ShowDataServlet") public class ShowDataServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ShowDataServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 文字コードをセット(日本語の文字化けを避ける) request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); // UserInfoクラス(JavaBeans) DbManager dbManager = new DbManager(); // DBの全データを取得 ArrayList<UserInfo> arUserInfo = dbManager.getUserInfo(); PrintWriter out = response.getWriter(); for (int i = 0; i < arUserInfo.size(); i++) { UserInfo userInfo = arUserInfo.get(i); out.println(userInfo.getName() + " " + userInfo.getHobby() + "<br>"); } } }
実行
「ShowDataServlet.java」を実行します。