データベースに登録したデータを一覧表示させる方法について、
気づいた事も含め、下記にまとめました。
##環境
Java version 1.8.0_231
MySQL 8.0
Tomcat 9.0
Eclipse
##実装
下記に簡単なプログラムを作成し、実装してみました。
###テーブル構成
mysql> select * from nakamura;
+----------+
| name |
+----------+
| 中村倫也 |
| 中村アン |
| 中村俊輔 |
| 中村獅童 |
+----------+
###DAO
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
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
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
<%@ 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アプリーケーションの実行。
ブラウザを見てみると、、、
???
一件のみしか取得できていなかった、、、。
何故なのか?
色々と調べてみた結果、
if(rs.next()){
DAOクラスのこの行が原因でした。
データを1行のみしか取得していないため、データが複数あったとしても最初の一行のみしか取得しない。
###if文とwhile文の使い分け
####if文
if( 条件式 ){
処理内容
}
条件式がtrueの場合、処理内容を実施。
主キーで取得するようなSQLであれば、1件しかデータを取得しないため、if文を使用。
####while文
while (条件式) {
処理内容
}
条件式がtrueである間、処理内容を繰り返し実施する。
複数のデータを取得する場合は、while文を使用。
以上を踏まえ、
while文に修正、Webアプリケーションの実行。
ブラウザを見てみると、、、
データベースの全件取得、一覧表示することができました。
##参考記事