반응형

1. JDBC

자바 어플리케이션에서 표준화된 방법으로 다양한 데이터베이스에 접속할 수 있도록 설계된 인터페이스
  • 애플리케이션에서는 드라이버 관리자를 통해 필요한 데이터베이스 드라이버를 로드한 다음 해당 데이터베이스에 접속
  • 응용 프로그램과 DBMS간의 통신을 중간에서 번역(DBMS의 종류에 상관 X)

 

JDBC Driver

  • 실제 DB관련 기능이 동작하려면 java.sql의 인터페이스들을 상속하여 메서드의 몸체를 구현한 클래스파일들이 필요
  • 이 파일들을 JDBC Driver라 부름

 

JDBC 프로그래밍 코딩 흐름

  1. JDBC 드라이버 로드
  2. DB연결
  3. Statement 생성
  4. SQL문 전송 & 결과받기
  5. 연결해제

 

1. JDBC 드라이버 로드

데이터베이스에 접속하려면 먼저 해당 데이터베이스의 JDBC 드라이버를 로드

JDBC 드라이버를 로드하는 방법

  • jdbc.drivers
    • System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
    • 환경변수를 이용하는 경우 나중에 DriverManager 클래스가 초기화될 때 자동으로 해당 드라이버를 로드
  • Class.forName() 메서드 사용(많이 사용)
    • Class.forName("com.mysql.jdbc.Drivers");
      • com.mysql.jdbc.Drivers -> Mysql의 JDBC 메인 클래스

2. DB연결

드라이버가 로드되면 해당 데이터베이스의 JDBC 드라이버를 이용해 프로그램을 작성할 수 있는 상태가 된 것을 의미

실제 데이터베이스와 연결하려면 Connection 클래스의 인스턴스가 필요

JDBC URL

jdbc:[DBMS]:[데이터베이스식별자]

jdbc:oracle:thin:@localhost:1521:xepdb1
  • DBMS와의 연결을 위한 식별값
  • JDBC 드라이버에 따라 형식이 다름
String url = "jdbc:oracle:thin:@localhost:1521:xepdb1"
Connection con = DriverManager.getConnection(url, "kim", "1234");
  • DriverManager.getConnection(url, user, password)
    • String url : 접속할 서버의 URL이며, 프로토콜, 서버주소, DB이름으로 구성
    • String user : DB서버에 로그인할 계정
    • String password : DB서버에 로그인할 비밀번호

 

DBMS별 JDBC driver명, URL 형식

1. Oracle

  • Driver
    • oracle.jdbc.driver.OracleDriver
  • URL
    • jdbc:oracle:thin:@HOST:PORT:SID 

2. MS-SQL

  • Driver
    • com.microsoft.sqlserver.jdbc.SQLServerDriver
  • URL
    • jdbc:sqlserver://HOST:[:PORT];DatabaseName=DB

3. MySQL

  • Driver
    • com.mysql.jdbc.Driver
  • URL
    • jdbc:mysql://HOST[:PORT]/DBNAME[?param=value&param1=value2&..]

 

3. Statement 생성

자바프로그램은 DB쪽으로 SQL문을 전송하고, DB는 처리된 결과를 다시 자바프로그램 쪽으로 전달

데이터베이스 연결로부터 SQL문을 수행할 수 있도록 해주는 클래스
Statement stmt = con.createStatement();

 

4. SQL문 전송, 결과 받기

 

Statement 객체를 이용해 DB서버로 SQL문을 전송하고 처리결과를 받아옴
  • ResultSet executeQuery(String sql)
    • select 문 수행 시 사용
    • 메서드가 반환하는 반환값인 ResultSet은 select문을 실행한 후의 결과값을 가지고 있음
  • int executeUpdate(String sql)
    • SQL문이 실행된(update, delete, insert) 후 영향받은(처리된) 레코드(데이터)의 개수를 반환
...
    Statement stmt = con.createStatement();
    String sql = "insert into test values(' "+request.getParameter("username")+" ',
    	'"request.getParmaeter("email")+" ')";
    ResultSet rs = stmt.executeUpdate(sql);

 

 

※ ResultSet

  • executeQuery()메서드에서 실행된 select 문의 결과값을 가지고 있는 객체
  • ResultSet 객체의 메서드를 활용해 추출해서 select 결과값을 사용
  • ResultSet 객체는 내부적으로 위치를 나타내느 커서(Cursor)가 존재
  • Boolean next() 메서드는 커서 다음 레코드가 있는지 판단하여 없으면 false, 있으면 true 반환 후 커서를 다음 레코드(데이터)로 이동
  • ResultSet 객체는 현재 커서의 컬럼의 값을 데이터 타입에 따라 추출하는 getter 메서드를 가지고 있음
  • getter 메서드의 인자값으로는 칼럼의 이름이나 인덱스(결과값으로 나타난 칼럼의 순서) 값을 지정

커서 동작 예시

 

...

	while(rs.next()){
    	int id = rs.getInt("ID");
        String title = rs.getString("TITLE");
        String writer = rs.getString("WRITER_ID");
        Date regDate = rs.getDate("REGDATE");
    }

 

  • PreparedStatement
    • SQL문을 미리 만들어 두고 변수를 따로 입력하는 방식
    • 효율성, 유지보수에 용이
    • Statement 클래스 상속
    • SQL문에서 변수가 와야할 위치에 ?만 적어두고 ?자리에는 setXxx()메서드로 값을 설정(Xxx = 자료형)
...
    PreparedStatement pstmt = con.prepareStatement("insert into test values(?,?)");
    pstmt.setString(1, request.getParameter("username");
    pstmt.setString(2, request.getParameter("email");
    pstmt.executeUpdate();

 

 

5. 연결(메모리) 해제

Statement, PreparedStatement 는 사용하지 않을 때 닫아줘야 함.
...

    rs.close();
    stmt.close(); //pstmt.close();
    con.close():
  • 해체 순서는 최근에 사용했던 객체부터 거꾸로 올라가며 해제

 

반응형

+ Recent posts