Database/SQL

[SQL] Java를 사용한 데이터베이스 응용프로그램의 개발 - JDBC

gangintheremark 2021. 12. 6. 06:04
728x90

JDBC

  • JAVA 언어를 사용하여 응용프로그램을 개발하는 경우, 가장 널리 사용되는 표준적인 DBMS 인터페이스 방식
  • DBMS에 접근하여 데이터를 사용하기 위한 Java API 제공

💡 기능

  • DBMS 서버에 접속
  • SQL 문을 전송
  • 전달된 결과를 처리

💡 종류

🎀 Type 1: JDBC-ODBC 브리지와 ODBC 드라이버 사용
🎀 Type 2: Native-APi (클라이언트 라이브러리) + Java JDBC 드라이버
🎀 Type 3: 순수 Java JDBC 드라이버 + 서버 라이브러리
🎀 Type 4: 순수 Java JDBC 드라이버
  • Type1, Type2는 드라이버 외 부가적인 라이브러리 사용
  • Type3, Type4는 드라이버 외 부가적인 라이버러리 사용 X
  • Type3여러 DBMS에 접근 가능
  • Type4하나의 DBMS에만 접근 가능 (네트워크 프로토콜은 DBMS 별로 다름)

💡 구조

  • Connect : 드라이버 등록, 데이터베이스 연결
  • Query : Statement 생성, 데이터베이스에 Statement 전달
  • Process Results : 결과 집합을 전달받음, 결과를 읽음
  • Close : 결과집합 닫음, Statement 닫음, 연결 닫음

[Connect]

  • 드라이버 인스턴스 로드
  • Class.forName(DriverName);
  • 여러개의 드라이버 로드 가능
  • 로드된 드라이버들은 DriverManager가 관리
  • DriverManager가 JDBC URL에 해당하는 JDBC 드라이버를 연결
  • 데이터베이스 서버와 접속된 Connection 객체를 돌려줌
Connection connection = DriverManager.getConnection(CONNECTION\_URL, DB\_ID, DB\_PASSWORD);

[Query]

  • Connection 객체로부터 Statement 객체를 생성
Statement statement = connection.createStatement();
  • Statement 객체를 통해 SQL문 실행
    • executeQuery 메서드 : SELECT 문을 실행(검색), ResultSet 객체로 반환
    • executeUpdate 메서드 : INSERT, UPDATE, DELETE, 또는 DDL문 실행(갱신), 갱신된 레코드 개수 반환
    • execute() 메서드 : 검색 또는 갱신 모두 사용
ResultSet rs = statement.executeQuery(  
                 "select \* from STUDENT where DEPT = '컴퓨터' ");     
또는  

int rc = statement.executeUpdate(  
                 "delete from STUDENT where SNO = 100");

 

[Process Results]

  • executeQuery 메서드의 실행결과는 ResultSet객체로 전달
  • ResultSet 내의 레코드들은 next 메서드를 이용하여 커서 이동
  • 레코드 내의 컬럼 값을 읽는 함수 : getString(), getInt() ...
ResultSet rs = statement.executeQuery(  
     "select \* from STUDENT where DEPT = '컴퓨터' ");    

while(rs.next()) {  
          int no = rs.getInt("SNO");  
          String name = rs.getString("sname");  
          System.out.format("학번: %d 이름 : %s\\n" no, name);  
}

 

 

[Close]

  • 사용이 끝난 Statement, ResultSet, Connection 객체는 close를 호출하여 더이상 사용하지 않음을 알림.
rs.close();  
statement.close();  
connection.close();

 


PreparedStatement

  • SQL문을 한번만 컴파일해서 여러번 사용 가능
  • 인자를 사용하여 SQL 내의 값 변경 가능
  • Statment는 실행 효율 및 보안 측면에서 좋지 않음
 PreparedStatement pstmt = conn.prepareStatement(              
                               "update STUDENT set DEPT = ? where SNO = ?" )  

pstmt.setString(1, "IT");  // 첫 번째 물음표에는 IT  
pstmt.setInt(2, 300); // 두 번째 물음표에는 300  

psmt.executeUPdate();

 


트랜잭션의 저장

  • Connection 객체는 디폴트로 AutoCommit 모드 → 각각의 SQL문이 하나의 트랜잭션으로 동작
  • 여러 개의 SQL문을 묶어서 하나의 트랜잭션으로 구성하려면 AutoCommitFalse로 해야함
con.setAutocommit(false);
728x90