select

Mia Lee·2021년 12월 27일
0

JSP

목록 보기
20/22
<%@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>












0개의 댓글