Web develop/JDBC_XML

[JDBC] JDBC 프로그래밍

ForA 2019. 7. 10. 18:53
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)
  • 행단위 데이터얻기
  • 열 데이터 뽑기

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

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

연결객체 생성 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: 접속계정에 대한 비밀번호

실행객체 생성 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("삭제실패");
        }

결과객체 생성

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

    //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);
    } 

JDBC 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도 자동적으로 끊김