LoginSignup
2
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-17

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

環境

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アプリーケーションの実行。
ブラウザを見てみると、、、
Qiita1.png
???
一件のみしか取得できていなかった、、、。

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

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

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

if文とwhile文の使い分け

if文

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

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

while文

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

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

以上を踏まえ、
while文に修正、Webアプリケーションの実行。
ブラウザを見てみると、、、
Qiita2.png
データベースの全件取得、一覧表示することができました。

参考記事

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4