어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨
23.04.04 / [select 쿼리 실행 - 리스트 출력] jsp - mysql 연결하기(JDBC) 본문
728x90
SELECT 쿼리 실행 - DB로부터 데이터를 SELECT해서 실행 결과 적용(리스트 출력)
[ 사전 작업 ]
1. 클래스/인터페이스 IMPORT (user_list.jsp)
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.sql.SQLException" %>
// (insert/update/delete) 쿼리 실행에서는 데이터를 입력 받아 바로 pstmt를 통해 DB에 입력/수정/삭제 하기 때문에 굳이 ResultSet으로 데이터를 할당해줄 필요가 없었다.
// 하지만 select 쿼리 실행에서는 실행으로 끝나지 않고 결과를 사용해야하기 때문에 DB로부터 데이터를 가져와 ResultSet을 이용해 변수에 담아줄 필요가 있다.
인터페이스 - 구현을 명령 받은 클래스
Connection - ConnectionImpl
PreparedStatement - ClinetPreparedStatement
ResultSet - ResultSetImpl
2. DB에서 데이터를 가져와서 담아줄 테이블 생성
회원리스트 <br/>
<table width = "100%" border = "1">
<tr>
<td>아이디</td>
<td>암호</td>
<td>권한</td>
<td>이름</td>
<td>이메일</td>
<td>전화번호</td>
<td>주소</td>
<td>수정</td>
<td>저장</td>
</tr>
// 여기에 추가 코드 작성
</table>
// 아직 테이블이 완성되지 않았음 (DB에서 데이터 받아서 넣어줘야 함)
// </table> 닫는 태그 안에 DB SELECT 해서 불러오는 코드 작성해야 함
[ JDBC(Java data base connectivity) 프로그램 순서 7단계 ]
1. mysql 드라이버 로딩
드라이버 로딩 코드를 통해 한 번 로딩 하면 그 다음 부터는 다시 로딩하지 않고 사용 가능하다.
(프로그램을 실행해서 최초로 한 번 로딩되면 다음 프로그램 실행에서 로딩 코드를 다시 실행하지 않고도 계속 데이터 베이스와 연결된다. 단, 서버가 끊기면 다시 최초 한 번 로딩한다. 프로그램이 종료돼도 드라이버 로딩 상태/데이터 베이스 연결 상태로 유지되어 있다.)
<% //자바 태그 구분
Class.forName("com.mysql.jdbc.Driver"); // 드라이버 로딩
2. Connection객체로 DB연결 : ip / port번호 / db접속id / db접속비번 / db명(sid,service name)
Connection - DB 연결
// 데이터타입 객체참조변수 = 초기화 ;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// insert 쿼리 실행에서는 데이터를 입력 받아 바로 pstmt를 통해 DB에 넣어주면 되기 때문에 굳이 ResultSet으로 데이터를 할당해줄 필요가 없었다.
// 하지만 select 쿼리 실행에서는 실행으로 끝나지 않고 결과를 사용해야하기 때문에 DB로부터 데이터를 가져와 ResultSet을 이용해 변수에 담아줄 필요가 있다.
try{
String jdbcDriver = "jdbc:mysql://localhost:3306/dev47db?" +
"useUnicode=true&characterEncoding=euckr";
String dbUser = "dev47id";
String dbPass = "dev47pw";
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
3. Query실행을 위한 준비 ( statement 또는 PreparedStatement객체생성)
PreparedStatement - mysql 쿼리에 입력될 SQL 문 할당
(아직은 DB에 있는 데이터를 table 태그에 넣을 수 없는 상태)
pstmt = conn.prepareStatement("select * from tb_user");
// tb_user라는 테이블의 전체 데이터를 선택한다.
4. Query실행
executeQuery - mysql 쿼리에 입력될 SQL 문 실행
(executeQuery의 실행 결과가 rs 객체 참조 변수에 담겨있는 상태)
// executeUpdate() - db에서 데이터를 추가(Insert), 삭제(Delete), 수정(Update)하는 SQL 문을 실행
// executeQuery() - db에서 데이터를 선택(select)하는 SQL 문을 실행할 때
rs = pstmt.executeQuery();
System.out.println(rs + "<-- rs의 주소 값");
---------------------------------------------------------------------------------
pstmt에 할당된 주소를 찾아가 메소드 영역의 executeQuery 메소드를 호출한다.
pstmt에 할당된 주소는 PreparedStatement 인터페이스로 부터 구현을 명령 받은 ClientPreparedStatement 클래스를 통해 생성된 객체의 주소
executeQuery 메소드를 호출하면 처리 과정에서
SELECT 쿼리 문을 실행한다.
이 실행 결과를 사용하기 위해서는 ResultSet 인터페이스 데이터 타입으로 선언된 변수 rs에 결과를 담아줘야 한다.
INSERT 쿼리 문을 실행하고 나서는 결과를 사용할 필요가 없기 때문에 이 과정을 생략했다.
executeQuery 메소드의 구현부는 ResultSet rs = new ResultSetImpl();를 실행하고 rs를 리턴하기 때문에
rs의 참조 주소는 ResultSetImpl을 가리킨다.
5. Query실행결과 사용 (insert,update,delete의 경우 생략 가능단계)
(executeQuery의 실행 결과가 rs 객체 참조 변수에 담겨있는 상태 - 선택된 데이터를 사용할 수 있다.)
while(rs.next()){
%> // 자바 코드 끝 ( while 문에 자바 코드가 아닌 태그 코드를 넣어주기 위해서)
<tr>
// rs에 executeQuery()의 실행 결과 - 선택된 데이터가 담겨 있는 상태다.
// rs의 주소를 찾아가 getString("컬럼명")을 통해 데이터를 문자열로 가져온다.
// getString("컬럼명") - 변수 또는 name 이름을 넣는 것으로 헷갈리지 않도록 한다.
<td><%=rs.getString("u_id") %></td>
<td><%=rs.getString("u_pw") %></td>
<td><%=rs.getString("u_level") %></td>
<td><%=rs.getString("u_name") %></td>
<td><%=rs.getString("u_email") %></td>
<td><%=rs.getString("u_phone") %></td>
<td><%=rs.getString("u_addr") %></td>
<td><a href="<%=request.getContextPath()%>/userupdate/user_update_form.jsp?send_id=<%=rs.getString("u_id") %>">수정하기</a></td>
<td><a href="<%=request.getContextPath()%>/userdelete/user_delete_action.jsp?send_id=<%=rs.getString("u_id") %>">삭제하기</a></td>
</tr>
<% // 자바 코드 다시 시작
}
6. statement 또는 PreparedStatement객체 종료(close()) / 7. DB연결(Connection 객체) 종료(close())
}catch(SQLException ex) {
out.println(ex.getMessage());
ex.printStackTrace();
} finally {
if (rs != null) try { rs.close(); } catch(SQLException ex) {}
if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
if (conn != null) try { conn.close(); } catch(SQLException ex) {}
}
%>
728x90
'Database > MYSQL' 카테고리의 다른 글
23.05.09 / SELECT, WHERE AND/OR , BTEWEEN, LIKE, CASE (0) | 2023.05.09 |
---|---|
23.05.08 / DBMS (0) | 2023.05.09 |
23.03.29 / [insert 쿼리 실행] jsp - mysql 연결하기(JDBC) , mysql 드라이버이해하기 (0) | 2023.03.29 |
23.03.29 / DBMS 구축 & DB 테이블 생성과 활용(insert,delete,update,select) (0) | 2023.03.29 |
23.03.29 / MySQL 설치 & HeidiSQL 설치 (0) | 2023.03.29 |