Web develop/JDBC_XML

[JDBC] JDBC 관련클래스, 프로그래밍 순서 (Connection, Statement, ResultSet)

ForA 2019. 6. 18. 23:42
728x90

JDBC 관련클래스

: java.sql 패키지

DriverManager
: JVM에서 JDBC전체를 관리하는 클래스. Driver등록, Connection 연결작업 등

Driver
: DB를 만드는 Vendor(Oracle, MS-SQL, MYSQL등)을 implements하여 자신들의 DB를 연결할 수 있는 class를 만드는 인터페이스

Connection
: DB와 연결성을 갖는 인터페이스

Statement
: SQL문을 실행하는 인터페이스

ResultSet
: 조회된 결과 데이터를 갖는 인터페이스

JDBC 프로그래밍

  1. 제품군 선택 (Oracle, Mysql, MS-SQL 등)
  2. 연결객체 생성 (Connection)
    [필요요소]
  • DB서버의 주소
  • 포트번호(0~63353개.한피시 안에서 서비스 종류를 판별하기 위해 사용)
  • 연결계정
  1. 실행객체 생성 (Statement)
    [관련요소]
  • SQL문 작성
  • SQL문 실행요청
  1. 결과객체 생성 (ResultSet)
  • 행단위 데이터얻기
  • 열 데이터 뽑기

 

1. 드라이브 로딩 Driver loading (DB제품군 선택)

Class.forName("oracle.jdbc.driver.OracleDriver");
// Class.forName("클래스명");
// Class.forName("패키지명.드라이버클래스명");
  • ClassNotFoundException 오류발생. try-catch문 혹은 예외처리

2. 연결객체 생성 Connection (특정 DB서버연결)

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

    String url = "jdbc:oracle:thin:@localhost:1521:xe"; // "localhost" == "127.0.0.1 == 내 pc
    String user = "scott";
    String password = "tiger";
    //conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","tiger");

    System.out.println("DB연결 성공");
  • url :접속DB ip, port번호, sid
  • user : 접속계정
  • pwd : 접속계정에 대한 비밀번호

3. 실행객체 생성 Statement

  • SQL문 (DML, DQL 실행가능)
    Statement stmt = conn.createStatement();

    //실행요청
    int t = stmt.executeUpdate(sql); //DML 실행
    int t = stmt.executeQuery(sql);  //DQL 실행
  • DML 작업
    // 테이블 dept_copy에서 10번부서를 삭제
        String sql = "DELETE FROM dept_copy WHERE deptno=10";

    // --SQL문 실행요청
        int t = stmt.executeUpdate(sql); // 삭제시점
        System.out.println("T=" + t); //t: 수정 또는 삭제된 행의 갯수
        if (t > 0) {
            System.out.println("삭제성공");// t==> 삭제(또는 수정)된 행의 갯수
        }

        --테이블 dept_copy에서 20번, 30번 부서를 삭제하시오(삭제성공메세지 출력)
        sql = "DELETE FROM dept_copy WHERE deptno IN(20,30)";
        t = stmt.executeUpdate(sql);
        System.out.println("T=" + t);

        if (t > 0) {
            System.out.println("삭제성공");
        } else {
            System.out.println("삭제실패");
        }

4. 결과객체 생성

  • ResultSet : 조회된 결과(행열데이터)를 저장

  • DQL 작업

    조회요청, 조회된 결과값(행열데이터) 리턴

      ResultSet 변수명 = Statement명.executeQuery(sql); //리턴값 ResultSet
      //1. 행단위 데이터 얻기
      rs.next(); //boolean값 리턴. 행 반환시 true 
      if(rs.next()){} // 0번 또는 1번 출력시. WHERE절에 primary key 비교
      while(rs.next()){} //조회된 행의 갯수가 2행이상이 예상되어질 때

    얻어온 행 안에서 개별 열데이터 얻기

      rs.get자료형(columnIndex); // 칼럼번호
      rs.get자료형(columnLabel); // 이름, 별명
    
      // 20번 부서의 부서번호, 부서명, 부서위치를 출력하시오
      sql = "SELECT deptno, dname, loc FROM dept WHERE deptno=20";
    
      ResultSet rs = stmt.executeQuery(sql);
      rs.next();
      int deptno = rs.getInt(1); // 첫번째 칼럼데이터
      String dname = rs.getString(2);// 두번째 칼럼데이터
      String loc = rs.getString(3);// 세번째 칼럼데이터
      System.out.println(deptno + dname + loc);
      System.out.println("=======");
    
      sql = "SELECT deptno, dname name, loc FROM dept";
      rs = stmt.executeQuery(sql);
      while(rs.next()) { //rs.next가 while 소괄호 안에서 실행됨
      //rs.getInt(1)    rs.getString(2) 숫자 표기가능
          deptno = rs.getInt("deptno"); 
          dname = rs.getString("name");
          loc = rs.getString(3);
          System.out.println(deptno +"\t"+ dname +"\t"+ loc);
      } 

AutoCommit 설정

    conn.setAutoCommit(false); //기본값 true
    conn.commit();
    conn.rollback();

conn.close()

:연결끊는 객체

  • DB는 데이터 공유를 위해 사용
  • Connection은 유한개⇒ 다른사람을 위해 사용한 연결객체는 반환
  • DB자원: Connection 생성→ Statement 생성 → ResultSet생성
  • DB자원 반환은 역순으로 해주면 된다.
    if(rs != null) rs.close();   
    if(stmt != null) stmt.close();   
    if(conn != null) conn.close();

    // if문 사용안할시 NullPoineException 오류발생
  • Connection만 끊어주면 Statement와 ResultSet도 자동적으로 끊김