<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// student 테이블의 모든 레코드 조회
// 0. DB 연결에 필요한 문자열 변수 선언
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/study_jsp2";
String user = "root";
String password = "1234";
// 1. 드라이버 클래스 로드
Class.forName(driver);
// 2. DB 연결
Connection con = DriverManager.getConnection(url, user, password);
// 3. SQL 구문 작성 및 전달
String sql = "SELECT * FROM student";
PreparedStatement pstmt = con.prepareStatement(sql);
// 만능문자(?)가 포함되지 않으므로 pstmt.setXXX() 호출 불필요
// ---------------- 3단계까지 모든 구문 사용법 동일함 -------------------
// 4. SQL 구문 실행 및 결과 처리
// int executeUpdate() : INSERT, UPDATE, DELETE 등 DB 조작에 필요한 메서드
// => 실행 후 영향을 받은 레코드 수가 정수 타입으로 리턴됨
// ResultSet executeQuery() : SELECT 문 전용 메서드(조회에 필요한 메서드)
// => 실행 후 조회된 테이블을 관리하는 ResultSet 타입 객체가 리턴됨
ResultSet rs = pstmt.executeQuery();
/*
executeQuery() 메서드 호출하여 데이터 조회 시 다음 형태의 테이블이 ResultSet 타입 객체로 리턴됨
+-----+------------+--------+-------------------+---------------+
| idx | student_no | name | email | phone | <- 현재 커서(Cursor) 위치
+-----+------------+--------+-------------------+---------------+ (첫번째 레코드 위에 위치)
| 1 | 20211111 | 홍길동 | hong@honghong.com | 010-1111-2222 |
| 3 | 20212222 | 이순신 | leess@lee.com | 010-2222-3333 |
| 5 | 20213333 | 강감찬 | kang@kang.com | 010-3333-4444 |
+-----+------------+--------+-------------------+---------------+
- 조회 결과 테이블의 특정 레코드를 가리키는 포인터 역할을 커서(Cursor) 라고 함
(커서가 위치한 레코드의 데이터에 접근이 가능함)
- 조회 성공 시 커서는 테이블 첫번째 레코드 윗쪽에 위치함
- 커서를 한 줄씩 이동하면서 각 레코드에 접근해야함
=> ResultSet 객체의 next() 메서드 사용(리턴타입 : boolean)
(다음 레코드가 존재하면 커서 이동 후 true 리턴, 다음 레코드가 존재하지 않으면 false 리턴)
=> 즉, 커서는 다음 레코드가 존재할 동안 이동하도록 반복 작업 수행하면 됨
- 다음 레코드가 존재할 경우 ResultSet 객체의 getXXX() 메서드를 호출하여 각 컬럼 데이터 가져오기
=> 이 때, getXXX() 메서드의 XXX 은 가져올 컬럼의 자바 데이터타입명을 지정
(ex. 문자데이터(VARCHAR)가 저장된 컬럼 : getString(), 정수 데이터 컬럼 : getInt())
=> 파라미터는 컬럼의 인덱스번호(int 타입, 1부터 시작) 또는 컬럼명(String 타입)을 지정
(ex. 문자데이터가 저장된 두번째 컬럼(컬럼명 : name) : getString(2) 또는 getString("name"))
*/
// ResultSet 객체의 next() 메서드를 호출하여 커서를 다음 레코드로 이동시키기
// if(rs.next()) { // 다음 레코드가 존재할 경우 true 리턴됨
// out.println("레코드 존재함");
// } else { // 다음 레코드가 존재하지 않을 경우 false 리턴됨
// out.println("레코드 존재하지 않음");
// }
// 조회할 레코드가 복수개일 경우 if 문 대신 while 문을 사용하여 다음 레코드가 존재할 동안 반복
// while(rs.next()) { // 다음 레코드가 존재할 동안 반복
// // out.println("레코드 존재함<br>"); // 레코드가 3개일 경우 3번 반복 출력됨
// // idx(1번인덱스), student_no(2번인덱스), name(3번), email(4번), phone(5번) 데이터 가져오기
// int idx = rs.getInt(1); // 컬럼 인덱스 번호 지정 시(순서에 맞는 데이터타입 변수 선언 주의!)
// int idx = rs.getInt("idx"); // 컬럼명 지정 시(오타 주의!)
// out.print(idx + "<br>");
// }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>학생 목록 조회</h1>
<!-- 학생 목록을 표시하기 위한 테이블 생성(제목열까지만 표시) -->
<table border="1">
<tr>
<th width="50">번호</th>
<th width="150">학번</th>
<th width="150">이름</th>
<th width="250">E-Mail</th>
<th width="200">전화번호</th>
</tr>
<%
// ResultSet 객체의 next() 메서드를 반복하면서
// 각 레코드의 idx(1번), student_no(2번), name(3번), email(4번), phone(5번) 데이터 가져오기
// => 각 변수에 저장 후 출력
while(rs.next()) {
// 컬럼인덱스 지정 시
// int idx = rs.getInt(1);
// int student_no = rs.getInt(2);
// String name = rs.getString(3);
// String email = rs.getString(4);
// String phone = rs.getString(5);
// 컬럼명 지정 시
int idx = rs.getInt("idx");
int student_no = rs.getInt("student_no");
String name = rs.getString("name");
String email = rs.getString("email");
String phone = rs.getString("phone");
// out.print(idx + ", " + student_no + ", " + name + ", " + email + ", " + phone + "<br>");
// <tr><td></td></tr> 태그를 통해 1개 레코드(= 학생 1명)출력 작업 반복
// 1) 태그를 문자열로 생성하여 출력하는 방법(자바코드에서 HTML 태그 생성)
// out.println("<tr>");
// out.println("<td>" + idx + "</td>");
// out.println("<td>" + student_no + "</td>");
// out.println("<td>" + name + "</td>");
// out.println("<td>" + email + "</td>");
// out.println("<td>" + phone + "</td>");
// out.println("</tr>");
%>
<!-- 2) 데이터를 표현식으로 출력하는 방법(HTML 태그에서 자바코드 사용) -->
<tr>
<td><%=idx %></td>
<td><%=student_no %></td>
<td><%=name %></td>
<td><%=email %></td>
<td><%=phone %></td>
</tr>
<%
}
rs.close();
pstmt.close();
con.close();
%>
<!-- 복수개의 레코드를 <tr><td></td></tr> 태그를 통해 출력작업 반복 후 </table> 끝 태그 명시 -->
</table>
</body>
</html>