データベース一覧表示(Java,MySQL)


データベースに登録したデータを一覧表示させる方法について、
気づいた事も含め、下記にまとめました。

環境

Java version 1.8.0_231
MySQL 8.0
Tomcat 9.0
Eclipse

実装

下記に簡単なプログラムを作成し、実装してみました。

テーブル構成

mysql> select * from nakamura;
+----------+
| name     |
+----------+
| 中村倫也 |
| 中村アン |
| 中村俊輔 |
| 中村獅童 |
+----------+

DAO

NakamuraDAO.java
package nakamura;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class NakamuraDAO{
    private static final String url = "jdbc:mysql://localhost/qiita?serverTimezone=JST";    //URL
    private static final String user = "root";  //DBユーザー
    private static final String pass = "pw";    //DBパスワード/
    private List<Nakamura> nlist = new ArrayList<>();   //リストに格納

    //データベース一覧表示メソッド
    public List<Nakamura> showAllList() {

        //JDBC読み込み
        try (Connection con = DriverManager.getConnection(url,user,pass)){

            //データベースから氏名を取得するSQL文
            String sql ="select name from nakamura";
            PreparedStatement ps = con.prepareStatement(sql);

            //SQL文の実行
            ResultSet rs = ps.executeQuery();

            if(rs.next()){

                //データベースから取得した値をセット
                Nakamura nakamura = new Nakamura();

                //氏名の取得
                nakamura.setName(rs.getString("name"));

                nlist.add(nakamura);
            }

            rs.close();
            ps.close();

        }catch(SQLException e) {
            e.printStackTrace();
        }
        return nlist;
    }
}


DTO

Nakamura.java
package nakamura;

import java.io.Serializable;

public class Nakamura implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;    //氏名

    //コンストラクタ
    public Nakamura(){}

    //氏名
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
}

Servlet

servlet.java
package nakamura;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//登録データを一覧表示するクラス
@WebServlet("/NakamuraListDisplay")
public class NakamuraListDisplay extends HttpServlet{
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //データベース一覧表示
        NakamuraDAO nd = new NakamuraDAO();
        List<Nakamura> nlist = nd.showAllList();

        //セッションの開始
        HttpSession session = request.getSession();
        //セッションスコープにデータ登録
        session.setAttribute("nlist",nlist);

        RequestDispatcher rd = request.getRequestDispatcher("nakamura_list.jsp");
        rd.forward(request, response);
    }
}

JSP

jsp.java
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="nakamura.Nakamura" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List"%>
<%
//セッションスコープに保存されたデータを取得
 List<Nakamura> nlist = (List<Nakamura>)session.getAttribute("nlist");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DB登録一覧</title>
</head>
<body>
<table>
    <%for(int i = 0; i < nlist.size(); i++){%>
        <%Nakamura nakamura = (Nakamura)nlist.get(i);%>
        <tr>
            <td><%=nakamura.getName()%></td>
        </tr>
    <% } %>
</table>
</body>
</html>

webアプリーケーションの実行。
ブラウザを見てみると、、、

???
一件のみしか取得できていなかった、、、。

何故なのか?
色々と調べてみた結果、

NakamuraDAO.java
if(rs.next()){

DAOクラスのこの行が原因でした。
データを1行のみしか取得していないため、データが複数あったとしても最初の一行のみしか取得しない。

if文とwhile文の使い分け

if文

if( 条件式 ){
 処理内容
}

条件式がtrueの場合、処理内容を実施。
主キーで取得するようなSQLであれば、1件しかデータを取得しないため、if文を使用。

while文

while (条件式) {
   処理内容
}

条件式がtrueである間、処理内容を繰り返し実施する。
複数のデータを取得する場合は、while文を使用。

以上を踏まえ、
while文に修正、Webアプリケーションの実行。
ブラウザを見てみると、、、

データベースの全件取得、一覧表示することができました。

参考記事