JDBC에서 오라클 DB 활용하기 전, 준비 파일
- ojdbc.jar 파일
- dbinfo.properties 파일
- Oracle Express Edition일 경우
- DBDRIVER=jdbc:oracle:thin:@호스트이름:포트번호:XE
- Oracle Enterprise Edition일 경우
- DBDRIVER=jdbc:oracle:thin:@호스트이름:포트번호:ORCL
3.전문적으로 2, 3step (DBConnection.java), 7step (DBClose)하는 파일 준비
- 편의성을 위해 미리 만들어놓으면 좋음
- 에버노트 JAVA JDBC참조
1. import 한다.
2. Oracle Driver Loading
방법 1
방법 2
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
- 로 적어도 됨
3. DB에 Connection.
방법 1 (2, 3 step을 한번에 해결)
방법 2 (2setp의 방법 2와 연동)
4. 문장객체 (Statement or PreparedStatement) 생성
- 사용할 인터페이스 종류
- Statement 인터페이스
- Statement 돌릴때 마다 진행되는 일
- Syntax Check
- 문법 검사
- Object Check
- ex) emp 테이블이 있는지 확인
- Syntax Check
- Statement 돌릴때 마다 진행되는 일
- PreparedStatement 인터페이스
- Statement인터페이스보다 빠름.
- 첫번째만 Syntax, Object Check.
- 두번째부터는 검사 안 함
- 사용 코드
- Statement 인터페이스
- 인터페이스 간 관계
- CallableStatement(손자) -> PreparedStatement(부모) -> Statement(할아버지)
5. 주어진 SQL문장 실행
- SQL문장이 SELECT일 경우
- executeQuery()메소드 이용해서 SQL문장 실행
- SQL문장이 SELECT를 제외한 나머지 Query문일 경우
- executeUpdate()메소드 이용해서 SQL문장 실행
6. ResultSet이라는 가상테이블 (바구니)를 처리.
7. close
- 닫아야할 대상
- ResultSet
- Statement or PreparedStatement
- Connection
참조 소스
4step에서 Statement 인터페이스 사용한 경우
//1step : import
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.example.libs.DBClose;
import com.example.libs.DBConnection;
public class JDBCDemo {
public static void main(String[] args) throws SQLException {
DBConnection dbconn = new DBConnection();
Connection conn = dbconn.getConnection(); //2, 3step : Driver Loading, Connection
// System.out.println(conn); //확인 차 출력.
//4step : Statement 생성.
Statement stmt = conn.createStatement(); //Statement : Interface여서 이런 방법으로 생성.
String sql = " SELECT deptno, job, TO_CHAR(TRUNC(AVG(sal)), '$999,999'), " + //TO_CHAR -> 최종적으로 자바의 String형. //따라서 32행에서 String으로 받음.
" TO_CHAR(MAX(sal), '$999,999'), " +
" TO_CHAR(MIN(sal), '$999,999'), COUNT(*) " +
" FROM emp " +
" GROUP BY deptno, job " +
" ORDER BY deptno, job ";
// System.out.println(sql); //확인 차 출력.
//5step : excuteQuery()를 통해서 주어진 Query실행.
ResultSet rs = stmt.executeQuery(sql); //바구니 ResultSet에 쿼리문에 해당하는 테이블을 담아서 Eclipse로 옴. //커서가 테이블의 처음 내용인 deptno을 가리키고 있음.
//6step : ResultSet 오픈.
while(rs.next()) { //가져온 테이블의 레코드(행) 만큼만 while문 돌음.
//가져온 테이블의 내용을 Eclipse의 변수가 읽어들임.
int deptno = rs.getInt(1);
String job = rs.getString(2);
String avg_sal = rs.getString(3);
String avg_max = rs.getString(4);
String avg_min = rs.getString(5);
int count = rs.getInt(6);
//테이블 내용을 읽어들인 뒤, 출력
System.out.printf("%d, %s, %s, %s, %s, %d%n",
deptno, job, avg_sal, avg_max, avg_min, count);
}
DBClose.close(conn, stmt, rs); //7step : close
}
}
4step에서 PreparedStatement 인터페이스 사용한 경우
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.example.libs.DBClose;
import com.example.libs.DBConnection;
//전체 경로 : DriverManager --> Connection --> Statement --> ResultSet
// DriverManager --> Connection --> PreparedStatement -> ResultSet
public class PreparedStatementDemo {
public static void main(String[] args) throws SQLException {
Scanner scan = new Scanner(System.in);
System.out.print("부서번호 : ");
int department_num = scan.nextInt();
System.out.print("월급 : ");
//PreparedStatement : ? 사용. //입력받는 값 2개 = ? 2개 사용한다는 뜻. //24행 참조.
double salary = scan.nextDouble();
DBConnection dbconn = new DBConnection();
Connection conn = dbconn.getConnection(); //2, 3step
String sql = " SELECT ename, deptno, sal, dname " + //JOIN ~ USIN절 쓸 때, 식별자 사용 금지 (emp.deptno X)
" FROM emp INNER JOIN dept USING(deptno) " +
" WHERE deptno = ? AND sal >= ?"; //불완전한 SQL 문장.
//4step : PreparedStatement (문장객체) 생성.
PreparedStatement pstmt = conn.prepareStatement(sql); //아직까지 불완전한 SQL 문장 // 여기서 처음이자 마지막 문법검사, 객체검사 진행.
pstmt.setInt(1, department_num); //int : 부서번호가 정수이므로 //1 : 첫번째 ?를 department_num로 채워라.
pstmt.setDouble(2, salary); //Double : salary가 double형이므로. //2 : 두번째 ? 를 salary로 채워라.
//5step : executeQuery()를 통해 주어진 SQL문장 처리 //단, PreparedStatement사용시, 파라미터 X.
ResultSet rs = pstmt.executeQuery(); //주의사항!! 파라미터로 sql전달 X. (sql : 불완전한 SQL문장이므로)
//6step : ResultSet 가상테이블 (바구니) 오픈해서 처리.
while(rs.next()) {
String ename = rs.getString("ename");
int deptno = rs.getInt("deptno");
double sal = rs.getDouble("sal");
String dname = rs.getString("dname");
System.out.println(ename + "\t" + deptno + "\t" + sal + "\t" + dname);
}
DBClose.close(conn); //7step
}
}