EE가 가지고 있는 기술중 하나임
자바 프로그램과 관계형 데이터베이스에 대한 연결하는 인터페이스
총 5단계로 이루어짐
1. jdbc 드라이버 로드 (우리가 사용할 것은 오라클인데 오라클 드라이버를 깔아야함)
Class.forName("oracle.jdbc.driver.OracleDriver"); << 이부분에 오라클을 로드시킬것임ojdbc14.jar << 오라클에서 제공하는 오라클 jdbc jar파일
이것을 jsp/WebContent/WEB-INF/lib 에 복사
2. Connection 객체 생성
String url = "jdbc:oracle:thin:@ip주소:포트번호:서비스이름";
Connection conn = DriverManager.getConnection(url, "ID", "PW");
id, pw, url등을 넣는 것임
3. 쿼리 생성
statement와 prepardStatement 와 차이점
prepardStatement는 같은 요청인 경우는 재사용함 << 다수의 데이터를 처리할때 용이함
PreparedStatement pstmt = conn.prepareStatement("insert into test values(?,?,?,sysdate)");
4. 쿼리 실행
select / update, delete, insert(이 3개는 5단계없음) 를 자주 사용함.
ResultSet rs = pstmt.executeQuery(); //<<결과가 있음select시 사용
executeUpdate(); 결과가 없다 이건 update, delete, insert일때 사용
5. 추출
rs는 레코드 단위로 볼수 있음
insert.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Timestamp" %>
<%
String id = request.getParameter("id");
String pw = request.getParameter("password");
int age = Integer.parseInt(request.getParameter("age"));
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@ip주소:포트번호:서비스이름";
Connection conn = DriverManager.getConnection(url, "ID", "PW");
PreparedStatement pstmt = conn.prepareStatement("insert into test values(?,?,?,sysdate)");
//?는 위치 홀더 : 미완성된 쿼리, pstmt.setString(1, id); 숫자는 ?의 순서에 맞는 컬럼임!!
pstmt.setString(1, id);
pstmt.setString(2, pw);
pstmt.setInt(3, age);
pstmt.executeUpdate();
out.println("가입 완료!!");
pstmt.close();
conn.close();
%>
update.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Timestamp" %>
<%
String id = request.getParameter("id");
String pw = request.getParameter("password");
int age = Integer.parseInt(request.getParameter("age"));
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@ip주소:포트번호:서비스이름";
Connection conn = DriverManager.getConnection(url, "ID", "PW");
//id pw가 입력 값과 같은지 보기위해 DB에서 불러온다.
PreparedStatement pstmt = conn.prepareStatement("select * from test where id=? and password=?");
pstmt.setString(1, id);
pstmt.setString(2, pw);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
pstmt = conn.prepareStatement("update test set age=? where id=?");
pstmt.setInt(1, age);
pstmt.setString(2, id);
pstmt.executeUpdate();
out.println("수정되었습니다.");
}
else{
out.println("ID & PASSWORD 를 확인하세요");
}
pstmt.close();
conn.close();
%>
jsp의 단점중의 하나는
그런데 1 2 단계를 같이 쓰는데 반복해서 쓰게 된다...
그러나 여기서 자바를 뺴낸다면? 효율적이다
데이터베이스와 관련된 클래스를 DAO라고 한다.
DAO class를 만들어 1,2, 3, 4단계를 클래스처럼 사용한다.
뿐만아니라 DAO.select()처럼 자주사용되는 부분들도 class로 만들어 놓아서
사용할수 있게 하는 방법론임.
<%
//Connection conn = DAO.getOracle();//1, 2단계
ResultSet rs = DAO.select();//1,2,3,4단계
//5단계 추출 - rs는 레코드 단위로 볼수 있음
while(rs.next()){
String id = rs.getString("id"); //매개변수는 컬럼명
String pw = rs.getString("password");
int age = rs.getInt("age");
Timestamp reg = rs.getTimestamp("reg");
out.println(id +" / "+ pw +" / "+ age +" / "+ reg + "<br />");
}
rs.close();
pstmt.close();
conn.close();
%>
package test.bean;
import java.sql.*;
public class DAO {
private static Connection conn = null;
public static Connection getOracle() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@ip주소:포트번호:서비스이름";
Connection conn = DriverManager.getConnection(url, "ID", "PW");
return conn;
}
}
//1, 2단계를 수행하는 자바파일을 만드는것임
package test.bean;
import java.sql.*;
public class DAO {
private static Connection conn = null;
private static PreparedStatement pstmt = null;
private static ResultSet rs = null;
public static Connection getOracle() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@ip주소:포트번호:서비스이름";
Connection conn = DriverManager.getConnection(url, "ID", "PW");
return conn;
}
public static ResultSet select(){
try{
conn = getOracle();//1, 2단계
pstmt = conn.prepareStatement("select * from test");//3, 4단계
rs = pstmt.executeQuery();
}
catch(Exception e){
e.printStackTrace();
}
return rs;
}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Timestamp" %>
<%@ page import="test.bean.DAO" %>
<title>SELECT 조회</title>
DAO 1234 단계 사용<p>
<%
//Connection conn = DAO.getOracle();//12단계
ResultSet rs = DAO.select();//1,2,3,4단계
//5단계 추출 - rs는 레코드 단위로 볼수 있음
while(rs.next()){
String id = rs.getString("id"); //매개변수는 컬럼명
String pw = rs.getString("password");
int age = rs.getInt("age");
Timestamp reg = rs.getTimestamp("reg");
out.println(id +" / "+ pw +" / "+ age +" / "+ reg + "<br />");
}
rs.close(); //pstmt.close();conn.close(); 을하지 않고 닫아버림 ㅠㅠ
//pstmt.close(); << DAO에 이부분이 없어서 서버 멈추게함 DAO에서 짤라줘야하는데 그렇지 않음
//conn.close();
%>
DAO는 하지 말것!! 서버 멈춤 ㅠㅠ