전에 공부는 했지만 기억이 안나요............ 1도 모르겠어요 여서
다시다시 처음부터 공부를 해봅니다..... 화이팅🫠🫠🫠
Connection을 통해 SQL문을 DB에 전달하여 실행하고,
생성된 결과(ResultSet, 성공한 행의 개수)를 반환(Java)하는데 사용되는 객체
SELECT 질의 성공시 반환되는데, 조회 결과 집합을 나타내는 객체
Statement의 자식으로 향상된 기능을 제공
?
기호 (placeholder / 위치홀더)를 이용해서 SQL에 작성되어지는 리터럴을 동적으로 제어함
SQL ?
기호에 추가되는 값은
숫자인 경우 '' 없이 대입.
문자열인 경우 ''가 자동으로 추가되어 대입
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
💻 placeholder ?
쓰는 이유
기존방법으로 써도 되는데, 나중에 서브쿼리랑 문장 길어지면 복잡해서 간결하게 쓰려고 ?를 쓰는거임
2-1 : DB 연결에 필요한 Oracle JDBC Driver 메모리에 로드하기.
객체로 만들어 두기
class.forName("oracle.jdbc.driver.OracleDriver");
2-2 : 연결 정보를 담은 Connection을 생성
DriverManager객체를 이용해서 Connection 객체를 만들어 얻어옴!
String type = "jdbc:oracle:thin:@";
String ip = "localhost";
String port = ":1521";conn = DriverManager.getConnection(type + ip + port);
2-3. SQL 작성
String sql = "SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE";
2-4. Statement 객체 생성
Connection 객체를 통해서 생성
stmt = conn.createStatement();
2-5. 생성된 Statement 객체에 sql을 적재하여 실행한 후
결과를 반환 받아와서 rs 변수에 저장
rs = stmt.executeQuery(sql);
✔️ Statement 객체 사용 시 순서 (위에 순서대로)
SQL 작성(2-3) → Statement 생성(2-4) → SQL 수행 후 결과 반환(2-5)
✔️ PreparedStatement 객체 사용 시 순서 (아래 코드 순서대로)
SQL 작성 → PreparedStatement 객체 생성(?가 포함된 SQL을 매개변수로 사용) →
→ ?(위치홀더)에 알맞은 값 대입 → SQL 수행 후 결과 반환
// ?(위치홀더) 사용하여 SQL 작성 (2-3)
String sql = "SELECT EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE,\r\n"
+ "NVL(DEPT_TITLE, '부서없음') DEPT_TITLE,\r\n"
+ "JOB_NAME, SALARY\r\n"
+ "FROM EMPLOYEE\r\n"
+ "LEFT JOIN DEPARTMENT ON (DEPT_ID = DEPT_CODE)\r\n"
+ "JOIN JOB USING (JOB_CODE)\r\n"
+ "WHERE EMP_NO = ?";
// PreparedStatement 객체 생성 (2-4)
pstmt = conn.prepareStatement(sql);
// ?(위치홀더)에 알맞은 값 대입
pstmt.setString(1, empNo);
// SQL 수행 후 결과 반환 (2-5)
rs = pstmt.executeQuery();
rs가 참조하는 ResultSet 객체의 첫번째 컬럼부터 순서대로 한 행씩 이동하며
다음 행이 있을경우 true 반환 / 없으면 false 반환
조회결과가 1개면 if, 두개이상이면 while문
while(rs.next()) {
// 참일경우
String empId = rs.getString("EMP_ID");
String empName = rs.getString("EMP_NAME");
int salary = rs.getInt("SALARY");
Date hireDate = rs.getDate("HIRE_DATE");
} catch(ClassNotFoundException e) {
// false 반환창
System.out.println("JDBC 드라이버 경로가 잘못 작성되었습니다. ");} catch(Exception e) {
e.printStackTrace();
ResultSet, Statement, Connection 닫기
(생성 역순으로 닫는 것을 권장)
} finally {
try {
if( rs != null ) rs.close();
if( stmt != null ) stmt.close();
if( conn != null ) conn.close();
} catch (Exception e) {
e.printStackTrace();
public class JDBCExample {
public static void main(String[] agrs ) {
// 1단계 : JDBC 객체 참조 변수 선언
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 2단계 : 참조 변수에 알맞은 객체 대입
//2-1. DB 연결에 필요한 Oracle JDBC Driver 메모리에 로드하기
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2-2. 연결 정보를 담은 Connection을 생성
// -> DriverManager객체를 이용해서 Connection 객체를 만들어 얻어옴!
String type = "jdbc:oracle:thin:@";
String ip = "localhost";
String port = ":1521";
String sid = ":XE";
String user = "je";
String pw = "je1234";
// DriverManager :
// 메모리에 로드된 JDBC 드라이버를 이용해서 Connection 객체를 만드는 역할
conn = DriverManager.getConnection(type + ip + port + sid, user, pw);
// 2-3. SQL 작성
// ** JAVA에서 작성되는 SQL은 마지막에 ;(세미콜론) 찍지 않기! **
String sql = "SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE";
// 2-4. Statement 객체 생성
// -> Connection 객체를 통해서 생성
stmt = conn.createStatement();
// 2-5. 생성된 Statement 객체에 sql을 적재하여 실행한 후
//결과를 반환 받아와서 rs 변수에 저장
rs = stmt.executeQuery(sql);
//executeQuery() : SELECT문 수행 메서드, ResultSet반환
// 3단계 : SQL을 수행해서 반환 받은 결과(ResultSet)를
// 한행씩 접근해서 컬럼 값 얻어오기
while(rs.next()) {
//rs.next() : rs가 참조하는 ResultSet 객체의
// 첫번째 컬럼부터 순서대로 한 행씩 이동하며
// 다음 행이 있을경우 true 반환 / 없으면 false 반환
//rs.get 자료형("컬럼명")
String empId = rs.getString("EMP_ID");
// 현재 행의 "EMP_ID" 문자열 컬럼의 값을 얻어옴
String empName = rs.getString("EMP_NAME");
int salary = rs.getInt("SALARY");
Date hireDate = rs.getDate("HIRE_DATE");
// 조회 결과 출력
System.out.printf("사번 : %s / 이름 : %s / 급여 : %d / 입사일 : %s\n",
empId, empName, salary, hireDate.toString() );
} catch(ClassNotFoundException e) {
// 클래스명 잘못작성하면 나는 오류 잡는 예외 구문
System.out.println("JDBC 드라이버 경로가 잘못 작성되었습니다. ");
} catch(SQLException e) {
// SQLException : DB 관련 최상위 예외 (== 데이터베이스에 관련된 모든 예외)
e.printStackTrace();
// 4단계 : 사용한 JDBC 객체 자원 반환 ( close() )
// ResultSet, Statement, Connection 닫기 (생성 역순으로 닫는 것을 권장)
} finally {
try {
if( rs != null ) rs.close();
if( stmt != null ) stmt.close();
if( conn != null ) conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}