[데이터베이스] Ch5. SQL 고급1 - 동적, 정적 SQL과 JDBC

김규원·2024년 1월 11일
post-thumbnail

프로그래밍 언어에서의 SQL 접근

SQL의 한계

  1. SQL이 모든 질의를 다 표현 할 수 없음.
    SQL로는 표현할 수 없지만 C나 JAVA, PYTHON과 같은 프로그래밍 언어로 표현가능한 질의가 존재함.

  2. 비선언적 동작(e.g 보고서 인쇄, 사용자와의 의사소통, 질의결과를 GUI(그래픽 사용자 인터페이스)에 전달하는 경우 SQL 만으로는 이를 지원할 수 없음.
    범용 프로그래밍 언어와 SQL을 결합하기 위한 방법이 필요함.

범용 프로그래밍 언어에서 SQL에 접근하기 위한 두 가지 방법
이 방법들은 프로그램이 데이터베이스 서버와 접속하고 통신할 수 있는 수단을 제공.

1. 동적 SQL (Dynamic SQL = Interactive SQL)
SQL 데이터 베이스에 접속 후 질의 갱신을 수행한다.
프로그램이 실행시간에 SQL 질의를 구성하고 완료할 수 있도록 함.
e.g) JDBC, ODBC

2. 내장 SQL (Embedded SQL = Static SQL)
SQL 구문은 전처리기를 사용해 컴파일 시 식별되어 함수 호출로 변환된다.
실행할 때 함수 호출을 동적 SQL 기능을 제공하는 API를 통해서 데이터베이스에 연결된다.

JDBC

  • JDBC 표준은 Java 프로그램이 데이터베이스에 접속할 수 있는 API를 정의한다.

  • API = Application Program Interface

  • JDBC는 데이터에 대한 질의 및 갱신, 질의 결과 검색을 위한 다양한 기능을 지원한다.

  • JDBC는 데이터베이스에 있는 릴레이션과 릴레이션 내의 속성의 이름 및 타입에 대한 질의와 같은 메타데이터 검색을 지원한다.

  • 데이터 베이스와 통신하기 위한 모델:

  1. 데이터베이스로의 접속을 개방(Open)
  2. "statement" 객체 생성
  3. 질의를 보내고 결과를 가져오기 위해 statement 객체를 사용하여 질의를 실행
  4. 예외 처리 메커니즘
public static void JDBCexample (String userid, String passwd)
{  // DB 접속 개방
   try(Connection conn = DriverManager.getConnection("jdbcLoracle:thin:@db.yale.edu:1521:univdb", userid, passwd);
      Statment stmt = conn.createStatement(); // Stetment 객체 stat 생성
      )
   {
   ...Do Actual Work... // 실제 질의 작성
   }
   catch(SQLException sqle){ // 예외 처리 메커니즘
      System.out.println("SQLException: " + sqle);
   }
}

/**
try - with - resource 구문
: try 구문으로 열린 리소스는 try 블록 끝에서 자동으로 닫힌다.
: conn 과 stat가 가리키는 객체들은 해당 try 블록 끝에서 닫힘.
*/ 
  • 데이터 베이스 갱신
    : 위에서 만들어진 Statment 인터페이스의 객체 stmt와 excuteUpdate(업데이트 실행) 메서드를 활용하여 데이터 베이스 갱신
stmt.excuteUpdate(
   "insert into instructor values('77987', 'Kim', 'Physics', 98000)"
);
  • 질의 실행 및 결과 가져오기 및 출력
    : 위에서 만들어진 Statment의 객체 stmt와 excuteQuery(쿼리문 실행) 메서드 활용.
    : ResultSet 인터페이스의 rset 객체에 쿼리문을 담음
    : 그 후 while 반복문을 이용하여 rset.next() == True , 즉 다음 문장(다음 열)이 존재한다는 조건을 만족할 때까지 반복을 실행한다.
    : getString("dept_name") - dept_name 열의 String 문자열 출력 -
    : getFloat(2) - 2열의 Float 출력
    : select dept_name, avg(salary) 이므로 1열은 dept_name, 2열은 avg(salary)이다.
ResultSet rset = stmt.excuteQuery(
   "select dept_name, avg(salary) from instructor group by dept_name"
);
while (rset.next()){
   System.out.println(rset.getString("dept_name") + " " + rset.getFloat(2)
);
  • 결과 필드 가져오기
    : 밑의 코드 getString("dept_name") 과 rs.getStirng(1)은 dept_name이 ResultSet 의 객체 rs의 첫 번째 인수일 경우 동등하다.
rs.getString("dept_name")
rs.getString(1)
  • Null 값 다루기
int a = rs.getInt("a"); // a 열의 Int 값 가져오기
if ( rs.wasNull() ) // 해당 열의 값이 null 값이라면
   System.out.println("Got null value"); // 해당 메시지 출력
profile
행복한 하루 보내세요

0개의 댓글