티스토리 뷰

수업/└JSP

[CH16]JDBC

onlyun 2022. 2. 18. 12:00

1. JDBC(Java DataBase Connectivity)

자바/JSP 프로그램 내에서 데이터베이스와 관련된 작업 처리. 자바 표준 인터페이스.

관계형 데이터베이스 시스템에 접근하여 SQL문 실행하기 위한 자바 API 또는 자바 라이브러리

 


2. JDBC 드라이버 로딩 및 접속

(0) 전제 조건 : 오라클 및 sqldeveloper 설치 완료된 상태

-오라클 및 sqldeveloper 설치

https://exploreryun.tistory.com/78?category=1001989

-jar 파일 복사 붙여 넣기

c:/ Oracle >> app >> product >> 11.20. >> server >> jdbc  >> ojdbc6.jar 복사 WEB-INF >> lib 붙여넣기

 

(1) 접속 및 연결, 연결 해제 : 드라이버 로딩 → 객체 생성 → 연결 닫기

-드라이버 로딩

Class.forName("oracle.jdbc.driver.OracleDriver");

-객체 생성 : JDBC 드라이버 검색하고 검색된 드라이버를 이용해 Connection 객체 생성 후 반환

conn = DriverManager.getConnection(url, user, password);

-연결 닫기 : close() 메소드로 객체 해제 해줘야 함. 사용 후 리소스 해제 권유.

                가장 마지막에 연결된 것부터 역순 닫기

 

 

#예제) 오라클(Oracle) 드라이버 로딩 및 객체 생성, 연결 닫기

(오라클 설치할 때, 설정했던 아이디와 비밀번호가 필요함)

<%@page import="javax.servlet.jsp.tagext.TryCatchFinally"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %> <!--★import★-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Connection conn = null;
		try{
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			String user = "scott";
			String password = "tiger";
			
			Class.forName("oracle.jdbc.driver.OracleDriver"); <!--드라이버 로딩 메소드-->
			conn = DriverManager.getConnection(url, user, password); <!--Connection 객체 생성-->
			out.println("데이터베이스 연결이 성공했습니다");
		}catch(SQLException e){
			out.println("연결이 실패했습니다.");
			out.println("SQLException : "+e.getMessage());
		}finally{
			if(conn != null){
				conn.close(); <!--데이터 베이스 연결 닫기-->
			}
		}
	%>
</body>
</html>

-결과 : 오라클에 정상적으로 연결됐을 경우 ↓

데이터베이스 연결이 성공했습니다

 


3. 데이터베이스 쿼리 실행

Connection 객체 생성 : 데이터베이스 연결 → 쿼리 실행 객체 : 쿼리 실행

Statement 객체 PreparedStatement 객체
정적 쿼리 사용 동적 쿼리 사용
하나의 쿼리 사용하고 나면 더는 사용 불가 하나의 객체로 여러 번의 쿼리 실행
간단한 쿼리문 사용할 때 유용 동일한 쿼리문을 특정값만 바꾸어 여러 번 실행해야 할 때,
매개변수가 많아서 쿼리문 정리해야 할 때 유용
사용 후 객체 즉시 해제 필요
(공간을 잡아먹기 때문)
 

 

(0) 공통 메소드

executeQuery() executeUpdate() close()
SELECT문 실행할 때 사용
(ResultSet 객체 반환)
삽입, 수정, 삭제 관련된 SQL문 실행 Statement 객체 반환
(객체 해제)

 

(0) 데이터베이스 로딩 페이지

따로 페이지를 작성해두고 필요할 때, include

//파일명 : dbconn.jsp
<%@ page import="java.sql.*" %>
<%
	Connection conn = null;

	String url = "jdbc:oracle:thin:@localhost:1521:XE";
	String user = "scott";
	String password = "tiger";
	
	Class.forName("oracle.jdbc.driver.OracleDriver");
	conn = DriverManager.getConnection(url, user, password);
%>

 

(1) 데이터 접근 - INSERT

(1-0) sqldeveloper : 테이블 생성(그래야 데이터 입력, 수정, 삭제, 조회 가능)

CREATE TABLE MEMBER(   /*생성*/
    id VARCHAR(20) NOT NULL,
    pw VARCHAR(20),
    name VARCHAR(30),
    PRIMARY KEY(id)
);

/*조회*/
SELECT *
FROM MEMBER;

 

(1-0) 입력 폼 페이지

아이디와 비밀번호, 이름을 입력받을 입력 폼 페이지 작성. action="연결할 JSP"만 변경해서 사용

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Database SQL</title>
</head>
<body>
	<form action="insert01_process.jsp" method="post">
	<p> I  D : <input type="text" name="id"></p>
	<p> P  W : <input type="text" name="pw"></p>
	<p> NAME : <input type="text" name="name"></p>
	<p><input type="submit" value="전송"></p>
	</form>
</body>
</html>

 

(1-1) Statement 방식

객체 생성 → 사용자 입력값 가져와 sql 삽입

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		
		Statement stmt = null;
		
		try{
			<!--member ㅌ이블의 각 필드에 폼 페이지에서 전송된 아이디, 비밀번호, 이름을 삽입하도록 하는 것-->
            <!--쌍따옴표 제거했을 때, sql에서 입력하는 형식 VALUES('id', 'pw', 'name')";-->
			String sql = "INSERT INTO MEMBER(id, pw, name) VALUES('"+id+"', '"+ pw+"', '"+name+"')";
			stmt = conn.createStatement();
			stmt.executeUpdate(sql); <!--INSERT문 실행하도록 하는 것.-->
			out.println("MEMBER 테이블 삽입 성공 <br>");
		}catch(SQLException e){
			out.println("MEMBER 테이블 삽입 실패+<br>");
			out.println("SQLException : "+ e.getMessage());
		}finally{
			<!--역순으로 닫아줌-->
			if(stmt != null){
				stmt.close();
			}if(conn != null){
				conn.close();
			}
		}
	%>
</body>
</html>

-출력 결과

입력 폼에서 입력한 ID, PW, NAME 값이 저장됨. sqldeveloper에서 확인 가능


(1-2) PreparedStatement 방식

객체 생성 → 사용자 입력값 가져와 sql 삽입

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
...
<body>
	<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		
		<!--PreparedStatement 사용-->
		PreparedStatement pstmt = null;
		
		try{
        	                               <!--대문자 입력(소문자 입력하니까 오류)-->
			String sql = "INSERT NTO MEMBER(ID, PW, NAME) VALUES(?,?,?)";
			pstmt = conn.prepareStatement(sql); <!--생성-->
			pstmt.setString(1, id); <!--첫번째 물음표 넣음-->
			pstmt.setString(2, pw); <!--두번째 물음표 넣음-->
			pstmt.setString(3, name); <!--세번째 물음표 넣음-->
			pstmt.executeUpdate(); <!--실행-->
			out.println("MEMBER 테이블 삽입 성공");
		}catch(SQLException e){
			out.println("MEMBER 테이블 삽입 실패");
			out.println("SQLException : " + e.getMessage());
		}finally{
			if(pstmt != null){
				pstmt.close();
			}
			if(conn != null){
				conn.close();
			}
		}
	%>
</body>
</html>

-출력 결과

1번은 State 방식 / 2번이 PreparedStatement 방식


(2) 쿼리문 실행 결과값 - SELECT

ResultSet 객체는 Statement 또는 PreparedStatement 객체로 SELECT문을 사용하여 얻어온 레코드 값을 테이블 형태로 가진 객체

(2-0) ResultSet() 메소드

getXxx()

└Xxx는 필드의 데이터형 : getString(), getInt() 등등

(*ResultSet 객체의 getXxx() 메소드 사용하여 필드 순번으로 값을 가져올 때, 첫번째는 1부터 시작. 인덱스 번호와 다름)

 

(2-1) Statement 방식 select01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<!-- 테이블 형식 출력 -->
	<table width="300" border="1">
		<tr>
			<th>ID</th>
			<th>PASSWORD</th>
			<th>NAME</th>
		</tr>
		<%
			ResultSet rs = null;
			Statement stmt = null;
			
			try{
				String sql = "SELECT * FROM MEMBER";
				stmt = conn.createStatement();
				rs = stmt.executeQuery(sql);
				
				while(rs.next()){
					String id = rs.getString("id"); <!--컬럼값으로 가져옴.-->
					String pw = rs.getString("pw");
					String name = rs.getString("name"); <!--마지막 사용한 것부터 닫아줌-->
		%>
		<tr>
			<td><%= id %></td>
			<td><%= pw %></td>
			<td><%= name %></td>
		</tr>
		<%
				}
			}catch(SQLException e){
				out.println("MEMBER 테이블 호출이 실패했습니다.<br>");
				out.println("SQLException : " + e.getMessage());
			}finally{
				<!--역순 닫기-->
				if(rs != null){
					rs.close();
				}
				if(stmt != null){
					stmt.close();
				}
				if(conn != null){
					conn.close();  <!--dbconn-->
				}
			}
		%>
	</table>
</body>
</html>

-출력 결과

(위에서 입력했던 데이터 조회(출력))


(2-2) PreparedStatement 방식  select02.jsp

Statement와 다른 부분 별(★) 표시

<table width="300" border="1">
	<tr>
		<th>ID</th>
		<th>PASSWORD</th>
		<th>NAME</th>
	</tr>
	<%
			ResultSet rs = null;
			PreparedStatement pstmt = null; <!--★-->
			
			try{
				String sql = "SELECT ID, PW, NAME FROM MEMBER"; <!--★-->
				pstmt = conn.prepareStatement(sql); <!--★-->
				rs = pstmt.executeQuery(sql);
				
				while(rs.next()){
					String id = rs.getString(1); <!--★ 열값을 숫자로 가져옴-->
					String pw = rs.getString(2); <!--★-->
					String name = rs.getString(3); <!--★--> <!--★ 마지막 사용부터 닫기-->
		%>
	<tr>
		<td><%= id %></td>
		<td><%= pw %></td>
		<td><%= name %></td>
	</tr>
	<%
				}
			}catch(SQLException e){
				out.println("MEMBER 테이블 호출이 실패했습니다.<br>");
				out.println("SQLException : " + e.getMessage());
			}finally{
				//역순 닫기
				if(rs != null){
					rs.close();
				}
				if(pstmt != null){ <!--★-->
					pstmt.close(); <!--★-->
				}
				if(conn != null){
					conn.close(); <!--dbconn-->
				}
			}
		%>
</table>

-출력 결과(위와 동일)


(3) 쿼리문 실행 결과값 - UPDATE

입력 폼에서 전송된 id와 비밀번호가 일치하는 레코드(sql 데이터)를 찾아 name 필드값 변경하는 것

-데이터베이스 로딩 : dbconn.jsp

-입력폼 페이지 : 연결될 프로세스 페이지만 다름

(Statement → update01_process.jsp // PreparedStatement → update02_process.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Database SQL</title>
</head>
<body>
	<form action="update01_process.jsp" method="post">
	<p> I  D : <input type="text" name="id"></p>
	<p> P  W : <input type="password" name="pw"></p>
	<p> NAME : <input type="text" name="name"></p>
	<p><input type="submit" value="전송"></p>
	</form>
</body>
</html>

 

(3-1) Statement 방식

-프로세스 페이지 : 데이터 수정

입력 폼에서 전송된 id와 비밀번호가 일치하는 레코드(sql 데이터)를 찾아 name 필드값 변경

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@ include file="dbconn.jsp"%>
	<%
		request.setCharacterEncoding("utf-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		
		ResultSet rs = null;
		Statement stmt = null;
		
		try{
			String sql = "SELECT ID, PW FROM MEMBER WHERE ID = '"+id+"'";
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			if(rs.next()){
				String rId = rs.getString("id");
				String rPw = rs.getString("pw");
				
				if(id.equals(rId) && pw.equals(rPw)){
					sql = "UPDATE MEMBER SET NAME = '" +name +"' WHERE ID = '" + id +"'";
					stmt = conn.createStatement();
					stmt.executeUpdate(sql);
					out.println("MEMBER 테이블을 수정했습니다.");
				}else{
					out.println("일치하는 비밀번호가 아닙니다.");
				}
			}
			else{
				out.println("MEMBER 테이블에 일치하는 아이디가 없습니다.");
			}
		}catch(SQLException e){
			out.println("SQLException : " + e.getMessage());
		}finally{
			//종료
			if(stmt != null){
				stmt.close();
			}
			if(rs != null){
				rs.close();
			}
			if(conn != null){
				conn.close();
			}
		}
	%>
</body>
</html>

-출력 결과

입력폼에서 이름을 변경할 아이디와 비밀번호를 입력하고 바꿀 이름을 입력.

(원래는 admin  admin1234 abc 였는데 이름(name)이 aaa로 변경되었음)


(3-2) PreparedStatement 방식

-프로세스 페이지 : 데이터 수정

입력 폼에서 전송된 id와 비밀번호가 일치하는 레코드(sql 데이터)를 찾아 name 필드값 변경

<body> </body> 태그 내부만 가져옴.

<%@ page import="java.sql.*" %>
...
<%@ include file="dbconn.jsp"%>
<%
	request.setCharacterEncoding("UTF-8");
	
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	String name = request.getParameter("name");
	
	ResultSet rs = null;
	PreparedStatement pstmt = null;
	
	try {
		String sql = "SELECT ID, PW FROM MEMBER WHERE ID = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, id); //?에 넣을 값 설정
		rs = pstmt.executeQuery(); //실행 결과 rs에 답기
	
		if (rs.next()) {
			String rId = rs.getString("id");
			String rPw = rs.getString("pw");
	
			if (id.equals(rId) && pw.equals(rPw)) {
		sql = "UPDATE MEMBER SET NAME = ? WHERE ID = ?";
		pstmt = conn.prepareStatement(sql); //생성
		pstmt.setString(1, name);//물음표의 값 세팅
		pstmt.setString(2, id);
		pstmt.executeUpdate(); //업데이트 실행
		out.println("MEMBER 테이블을 수정했습니다.");
			} else {
		out.println("일치하는 비밀번호가 없습니다.");
			}
		} else {
			out.println("MEMBER 테이블에 일치하는 아이디가 없습니다.");
		}
	} catch (SQLException e) {
		out.println("SQLException : " + e.getMessage());
	} finally {
		//역순 객체 닫기
		if (pstmt != null) {
			pstmt.close();
		}
		if (rs != null) {
			rs.close();
		}
		if (conn != null) {
			conn.close();
		}
	}
%>

-출력 결과

(원래는 admin admin1234 aaa이었는데 admind으로 바뀌었음.)


(4) 쿼리문 실행 결과값 - DELETE

입력 폼에서 전송된 id와 비밀번호가 일치하는 레코드(sql 데이터)를 찾아 name 필드값 변경하는 것

-데이터베이스 로딩 : dbconn.jsp

-입력폼 페이지 : 연결될 프로세스 페이지만 다름

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Database SQL</title>
</head>
<body>
	<form action="delete01_process.jsp" method="post">
	<p> I  D : <input type="text" name="id"></p>
	<p> P  W : <input type="password" name="pw"></p>
	<p><input type="submit" value="전송"></p>
	</form>
</body>
</html>

 

(4-1) Statement 방식

(안 됐는데 해결 : if(id.equals(rId) && pw.equals(rPw)){ 이부분 틀렸음. 이퀄 괄호 안을 쌍따옴표로 감싸고 있었음. 쌍따옴표 삭제하니까 정상적으로 삭제 됨.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="dbconn.jsp" %>
<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	String name = request.getParameter("name");
	
	ResultSet rs = null;
	Statement stmt = null;
	
	try{
		String sql = "SELECT ID, PW, NAME FROM MEMBER WHERE ID = '"+id+"'";
		stmt = conn.createStatement();
		rs = stmt.executeQuery(sql);
		
		if(rs.next()){
			String rId = rs.getString("id"); //db 열 x
			String rPw = rs.getString("pw");
			
			if(id.equals(rId) && pw.equals(rPw)){ <!--★이거 틀렸음!!! 쌍따옴표로 감싸지 않음.-->
				sql = "DELETE FROM MEMBER WHERE ID = '"+id+"' AND PW = '"+pw+"'"; //입력값인 거
				stmt = conn.createStatement(); //사용할 때마다 객체 생성
				stmt.executeUpdate(sql);
				out.println("MEMBER 테이블 삭제");
			}else{
				out.println("일치하는 비번이 아닙니다.");
			}
		}else{
			out.println("MEMBER 테이블에 일치하는 아이디가 없습니다.");
		}
	}catch(SQLException e){
		out.println("SQLException : " + e.getMessage());
	}finally{
		if(stmt != null){
			stmt.close();
		}
		if(rs != null){
			rs.close();
		}
		if(conn != null){
			conn.close();
		}
	}
%>
</body>
</html>

-결과 출력

MEMBER 테이블 삭제


(4-2) PreparedStatement 방식

-프로세스 페이지 : delete02_process.jsp

(오타가 있었음)

<%@ page import="java.sql.*" %>
...
<%@ include file="dbconn.jsp" %>
<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	String name = request.getParameter("name");
	
	ResultSet rs = null;
	PreparedStatement pstmt = null;
	
	try{
		String sql = "SELECT ID, PW FROM MEMBER WHERE ID = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, id);
		 rs = pstmt.executeQuery();
		
		if(rs.next()){
			String rId = rs.getString("id");
			String rPw = rs.getString("pw");
			
			if(id.equals(rId) && pw.equals(rPw)){
				sql = "DELETE FROM MEMBER WHERE ID = ? AND PW = ?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, id);
				pstmt.setString(2, pw);
				pstmt.executeUpdate();
				out.println("MEMBER 테이블을 삭제했습니다.");
			}else{
				out.println("일치하는 비밀번호가 아닙니다.");
			}

		}else{
			out.println("MEMBER 테이블에 일치하는 아이디가 없습니다");
		}
	}catch(SQLException e){
		out.println("SQLException : " +e.getMessage());
	}finally{
		
		if(pstmt != null){
			pstmt.close();
		}
		if(rs != null){
			rs.close();
		}
		if(conn != null){
			conn.close();
		}
	}
%>

-결과 출력

MEMBER 테이블을 삭제했습니다.

 

★두 방식다 안 됐음.★ 해결.

'수업 > └JSP' 카테고리의 다른 글

[CH19]MVC(Model, View, Controller)  (0) 2022.02.22
[CH18]Ajax  (0) 2022.02.21
[CH14]쿠키  (0) 2022.02.17
[CH13]세션 연습문제  (0) 2022.02.17
[CH13]세션(Session)  (0) 2022.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함