DataBase는 사용될 때에 주로 다른 프로그램과 같이 사용되는 경우가 많다.
간단한 예를 생각해 보더라도 대학교 학사시스템에 신입생의 정보를 넣는다고 할 때, 직접 이 Database가 있는 Server실로 가서 넣는 것이 아니라, 이 Database와 연결된 프로그램을 조작할 것이다.
따라서 우리는 이 Database와 다른 프로그램들을 연결해줄 API가 필요하다.
JDBC는 이 API중 하나로, Java에서 Database에 접근할 수 있도록 도와주는 libary이다. (Java실행파일, 즉 .jar
파일이다)
(참고)
C/C++ : 주로 ODBC사용
Python : 주로 psycopg2사용
JDBC를 사용하는 방법은 크게 다음과 같은 3가지의 과정을 거친다.
(본문의 사용환경)
Java IDE: eclipse
Database: Postgresql
우선 JDBC를 사용하기 위해서는 JDBC를 Download하고 다음과 같이 몇가지 설정을 해주어야 한다.
JDBC를 사용하고자 하는 Project에 우클릭일 통해 Properies설정 창에 들어간다.
.jar
파일을 Classpath에 추가한다.그 후 아래와 같은 과정을 통해 미리 설치한 jar파일의 위치를 찾아 Classpath에 입력해준다.
아래의 코드는 java가 main class에서 JDBC와 연결하는 코드이다.
즉, 위와 같은 과정을 문제없이 잘 마쳤다면 Error가 발생하지 않고,
PostgreSQL JDBC Driver Registered!
가 Console에 정상적으로 출력될 것이다.
DB와의 연결은 DriverManager
의 getConnection()
함수를 통해 진행하게 된다.
이 때 이 함수의 Return값은 Connection객체이다.
이제 다음과 같이 JDBC를 활용해 DB와 연결을 시도해보자
(참고)
DriverManager.getConnection("jdbc:postgresql://서버주소:포트번호/접속할DB이름" ,"User이름", "PassWord")`);
위의 모든 과정을 Error없이 잘 마쳤다면 이제 해당 Java파일로 DB를 다룰 수 있게 된다.
DB를 제어하는 Query는 실제 DB에서 사용하던 select, update, delete, ... 등 모든 것이 가능하다.
이때, 이 Query문을 DataBase에 전달하는 방법은 다음과 같은 두가지 방법이 존재한다.
Statement
객체
- Statement객체를 생성한다.
- Code
Statement stmt = connection.createStatement();
- 설명
: 이 Statement 객체를 통해서 execute함수들을 사용하게 되고, Database에 Query를 전달하게 된다.
- 명령을 DB에 전달한다.
- Code
// 1. Insertion, Deletion, Update stmt.executeUpdate("쿼리입력"); // 2. Selection ResultSet rs = stmt.executeQuery("쿼리입력");
executeUpdate()
- 인자
: Insertion, Deletion, Update, Creat, Drop을 수행하는 쿼리 문자열- 리턴값
: 반영된 Tuple의 수
: Creat와 Drop의 경우 -1을 반환executeQuery()
- 인자
: selection을 수행하는 쿼리 문자열- 리턴값
: ResultSet객체
- Query결과를 가공한다.
- executeUpdate()
: 이 함수는 결과값이 Boolian이므로 이를 활용하면된다.- executeQuery()
: 이 함수의 결과는 ResultSet객체로, 이는 하나의 Table 정보를 저장하고 있다. 이를 활용하면 된다.
(ResultSet의 객체 rs의 멤버함수)
rs.next();
: 얻어온 Table의 다음 행을 가리킨다.
rs.getString("이름");
: Attribute의 name을 통해 값을 불러온다.
rs.getString(인덱스);
: Attribute의 index를 통해 값을 불러온다.
-인덱스는 1부터 시작한다.(주의)
위의 함수 외에도getInt()
,getDouble()
등 다양한 형식의 함수가 존재하고, 이는 실제 DB에 저장된 Attribute의 자료형에 맞추어 사용해주어야 한다.
PreparedStatement
객체
- PreparedStatement객체를 생성한다.
- Code
PreparedStatement pStmt = conn.prepareStatement( "insert into instructor values(?, ?, ?, ?)");
- 설명
: Statemet객체와는 다르게 인자가 존재한다.
: 이 인자에 수행하고자 하는 쿼리를 입력하되, 그 값은?
로 표기한다.
- 객체에 값을 저장한다.
- Code
pStmt.setString(인덱스, "값"); pStmt.setInt(인덱스, 값);
- 설명
: 마찬가지로 여러종류의 set함수가 존재한다.
: 마찬가지로 실제 DB의 Attribute Type에 맞추어 사용해야 한다.
- 명령을 DB에 전달한다.
- Code
pSmt.executeUpdate(); rs = pSmt.executeQuery();
- Statement객체와 마찬가지로 준비된 pSmt객체를 위의 두 함수를 통해 DB와 데이터를 주고받을 수 있다.
- Query결과를 가공한다.
- Statement와 마찬가지의 방법으로 결과를 가공할 수 있다.
Statement는 문자열상수를 많이 사용해 컴퓨터의 공간을 매우매우 많이 차지한다. 따라서 PreparedStatement를 사용해 야 한다.
(나중에 실제 DB를 작업할 경우가 생길 때 Statement는 사용하지 않도록 하자.)
참고: PreparedStatement는 SQL문에서 Like키워드를 사용할경우 사용할수없다.
PreparedStatement가 제공하는 메소드는 Statement가 제공하는 메소드와 거의 같다.