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

データベースに登録したデータを一覧表示させる方法について、
気づいた事も含め、下記にまとめました。
##環境
Java version 1.8.0_231
MySQL 8.0
Tomcat 9.0
Eclipse

##実装

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

###テーブル構成
```mysql:
mysql> select * from nakamura;
+----------+
| name     |
+----------+
| 中村倫也 |
| 中村アン |
| 中村俊輔 |
| 中村獅童 |
+----------+
```
###DAO
```Java: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
```Java: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
```Java: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
```Java: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844098/73aca2d3-5b2c-7d4b-ab52-1ddab866a658.png)
???
一件のみしか取得できていなかった､､､。

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

```Java:NakamuraDAO.java
if(rs.next()){
```

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

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

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

以上を踏まえ、
while文に修正、Webアプリケーションの実行。
ブラウザを見てみると、、、
![Qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844098/99e4ff94-52f0-dce9-1017-57d38ef329b7.png)
データベースの全件取得、一覧表示することができました。

##参考記事

https://www.cc.kyoto-su.ac.jp/~yamada/programming/control.html

https://qiita.com/BumpeiShimada/items/329a077861fc19bb86b1![Qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844098/d6e66083-6ea6-16c4-a954-8ab649f9c492.png)