티스토리 뷰
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>
-출력 결과

(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
- A%B
- text formatting
- 외부구성요소
- selcetor
- CascadingStyleSheet
- JavaScript
- css
- typeof
- html a tag
- html base tag
- scanner
- html input type
- 스크립태그
- empty-cell
- improt
- initialized
- 입력양식
- 변수
- html atrribute
- caption-side
- BAEKJOON
- html layout
- html
- border-spacing
- 미디어 태그
- input type 종류
- ScriptTag
- html pre
- Java
- 기본선택자
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |