Java DataBase Connectivity
Java Application Database 연동을 위한 기술로, 표준을 제안하는 측(Sun.. 이후 Oracle)에서 정의한 JDBC Interface를 각 데이터베이스 회사에서 구현 implement한 Driver jar를 개발환경에 추가해야한다.
자동차 구현부를 몰라도 '운전법' 하나를 익히면 다양한 회사의 자동차를 운전할 수 있다. Java 개발자들도 JDBC 소통방식으로 다양한 데이터베이스들을 각자의 방식으로 동작하게 할 수 있다.
그림을 보면 중간 과정에 드라이버가 개입한다.
중간에 JDBC를 통해 우리가 작성하는 SQL로 왔다갔다 하는것이다.
데이터베이스의 종류는 Oracle, Mysql, MariaDB 등으로 많다.
하지만 Java program application에서는 이러한 여러 데이터베이스를 커버해야하기때문에 다양한 데이터베이스를 사용하기 위해서는 JDBC interface인 표준제안자가 존재한다.
Java application 개발자(왼쪽)가 데이터베이스(오른쪽)를 제어하기위해서 필요한 SQL을 잘 실행할 수 있도록 도와주는게 드라이버이다.
택시(오른쪽, Oracle, MariaDB 등)와 같은 데이버베이스를 승객(왼쪽)인 Java 개발자 developer의 역할을 생각하면된다.
JDBC interface에게 미들웨어라는 표현을 쓴다.
Java application과 Database의 연동을 위한 기술
JDBC는 표준을 제안한다.
Driver의 역할은 승객과 택시를 이어준다.
즉 JDBC는 자바 개발자가 만드는 자바 응용 프로그램과 데이터베이스를 연결해 제어할 수 있도록 도와준다.
단일한, 하나의 JDBC 소통방식을 통해 JDBC 인터페이스로 다양한 데이터베이스를 제어할 수 있다.
Driver : DB와의 연결을 관리하는 클래스
URL : DBMS에 연결을 위한 URL로 DBMS마다 다르다.
String driver = "oracle.jdbc.OracleDriver"; //이 경로를 가져와서
String dbUrl = "jdbc:oracle:thin:@<server-ip>:1521:xe";//DB 위치를 정해줘야 서버랑 접속이 가능하다.
수많은 데이터베이스를 하나의 소통방식으로 제어하기위해 JDBC interface가 존재한다.
JDBC관련 중요 interface에는 connection, PreparedStatement, ResultSet을 implements한 구현체가 Oracle JDBC Driver 혹은 Mysql JDBC Driver인것이다.
1. Driver
모든 DBMS를 만드는 Vender측에서 DB와 연결하는 Driver class를
만들 때 반드시 implements 해야 하는 interface로 JDBC 드라이버
의 중심이 되는 Interface.
2. java.sql.Connection
– 특정 데이타베이스와 연결정보를 가지는 interface.
DriverManager로 부터 Connection객체를 가져 온다.
3. java.sql.Statement
– SQL query문을 DB에 젂송하는 방법을 정의한 Interface.
Connection을 통해 가져 온다.
4. java.sql.ResultSet
– SELECT 구문 실행 결과를 조회할 수 있는 방법을 정의한
Interface
5. java.sql.PreparedStatement
– Statement 의 하위 Interface. SQL문을 미리 컴파일 하
여 실행 속도를 높인다.
6. java.sql.CallableStatement
– PreparedStatement의 하위 Interface. DBMS의 Stored
procedure를 호출한다.
자바 응용프로그램과 데이터베이스 연결 정보를 가지고있는 객체의 인터페이스
Oracle Connection, DB2 Connection, MariaDB Connection과 같은 다양한 객체들의 상위 인터페이스
자바 개발 그룹에서는 Connection 인터페이스(사용법)을 이용하면 다양한 db의 컨넥션 객체들을 제어할 수 있다.
JDBC Interface 단일한 사용법만 익히면 db가 변경되어도 동일한 방법으로 개발할 수 있다.
하나의 Connection 사용법을 익히면 다양한 DB Connection을 제어할 수 있다
자바 어플리케이션에서 데이터베이스에 SQL 언어로 명령하기 위한 객체
기존 Statement 보다 생산성 및 보안성과 높은 성능을 가지므로 주로 PreparedsStatement를 이용한다.
(현존하는 데이터베이스 종류가 많지만 그럴때마다 클래스로 만들 수 없으니 자바 개발시 인터페이스로 설계함으로써 어플리케이션 측에서는 상호의존도가 인터페이스로만 가게하고, 실제 동작은 Oracle.PreparedStatement가 동작한다)
자바 어플리케이션 개발 측에서 각 DB의 JDBC PreparedStatement interface를 구현하게 한다. 실제 동작은 하위 구현체가 되게하고, 개발 시점에서는 여러 db와 관계없이 표준화된 방법으로 sql 명령하게 할 수 있다. 각 DB에결합도는 낮아진다.(종속성 낮아짐)) -> 다형성
Select SQL 실행 후 조회 결과에 대한 정보
(Select SQL 실행 후 조회 결과에 대한 정보를 저장하는 객체의 상위 인터페이스 타입) -> 다양한 데이터베이스들은 동작되는 방식이 다른데 돌려주는건 ResultSet Interface 타입으로 돌려주기 때문에 정보를 되돌려줘도 똑같은 방법으로 열길 원한다. 그래서 인터페이스타입으로 만든것이다.
->다형성
Oracle 결과든, MySQL 결과든 같은 방법으로 결과를 받기위해 인터페이스로 만든것이다.
public static void main(String[] args) {
String driver = "oracle.jdbc.OracleDriver";
String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
Class.forName(driver);
System.out.println("oracle jdbc driver loading");
Connection con = DriverManager.getConnection(dbUrl, "id", "password");
System.out.println("oracle db connection");
String sql = "select id,password,name,address from member";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) { //조회한 다음 결과행이 존재하면 true 아니면 false
String id = rs.getString(1);//조회 컬럼 순서 첫번째 id
String password = rs.getString(2);
String name = rs.getString(3);
String address = rs.getString(4);
System.out.println(id + " " + password + " " + name + " " + address);
}
rs.close();
pstmt.close();
con.close();
1. Driver loading : DB 연결을 관리한다.
Class.forName(driver);
클래스 로딩
2. Connection(연결)
Connection con = DriverManager.getConnection(dbUrl, "id", "password");
DB와 연결을 위해 URL과 계정정보가 필요하다.
연결메소드로는 DriverManager.getConnection을 사용한다.
3. Statement/PreparedStatement
String sql = "select id,password,name,address from member";
PreparedStatement pstmt = con.prepareStatement(sql);
PreparedStatement는 query의 내용이 compile-time에 결정되어진다.
sql구문을 미리 만들어 sql을 실행하는것이다.
4. ResultSet(Select의 경우)
ResultSet rs = pstmt.executeQuery();
SQL Query가 INSERT, DELETE, UPDATE인 경우에는 executeUpdate()
를 사용한다. Query 실행 후 반영된 결과 record의 개수가 반환된다.
SQL Query가 SELECT인 경우에는 executeQuery() 를 사용한다. Query
실행후 SELECT한 결과가 ResultSet type으로 반환된다.
sql이 실행된다.
while(rs.next()) { //조회한 다음 결과행이 존재하면 true 아니면 false
String id = rs.getString(1);//조회 컬럼 순서 첫번째 id
String password = rs.getString(2);
String name = rs.getString(3);
String address = rs.getString(4);
System.out.println(id + " " + password + " " + name + " " + address);
}
5. close(Connection, Statement, ResultSet)Z
rs.close();
pstmt.close();
con.close();