1. JDBC 드라이버 (Java DataBase Connectivity 드라이버)
- 자바에서 데이터에비스를 사용할 때에는 JDBC API를 이용해서 프로그래밍 한다.
- JDBC 드라이버는 DBMS와 통신을 담당하는 자바 클래스
- 자바는 DBMS의 종류에 상관없이 하나의 JDBC API를 사용해서 데이터데이스 작업을 처리할 수 있기 때문에 익혀두면 모든 DBMS에서 이용이 가능하다.
JDBC의 구조
- 위에 언급했듯 자바 기반 어플리케이션에서 데이터베이스를 사용할 때에는 데이터베이스 종류에 상관없이 JDBC API를 이용해서 데이터베이스에 접근하게 된다.
- 각각의 DBMS는 자신에 알맞는 JDBC 드라이버를 제공하며, JDBC API는 JDBC 드라이버를 거쳐 데이터베이스와 통신한다.
ex. java 기반 어플리케이션 내용 - JDBC 드라이버 로딩 , 데이터베이스와 프로그래밍 연결
Class.forName("com.mysql.jdbc.Driver");
String jdbcDriver = "jdbc::mysql://localhost:3306/[사용할 데이터베이스]";
Connection conn = DriverManager.getConnection(jdbcDriver);
JDBC 프로그래밍의 코딩 스타일
1. JDBC 드라이버 로딩 - Class.forName("com.mysql.jdbc.Driver"); // MySQL은 com.mysql.jdbc.Driver 사용
2. 데이터 베이스 커넥션 구하기 - Connection conn = DriverManager.getConnection();
3. 퀴리 실행을 위한 Statement 객체 생성 - Statement stmt = conn.createStatement();
4. 퀴리 실행 - ResultSet rs = stmt.executeQuery("쿼리내용");
5. 퀴리 실행 결과 사용 - rs.next();
6. Statement 종료 - stmt.close();
7. 데이터베이스 커넥션 종료 - conn.close();
데이터베이스 커넥션
- DB와 연결을 위해서 커넥션을 해야 하는데, java.sql.Connection 클래스가 데이터 커넥션을 나타내며, 커넥션은 java.sql.DriverManager클래스가 제공하는 getConnection()메소드를 사용해서 구할 수 있다.
생성
DriverManager.getConnection(String jdbcURL);
DriverManager.getConnection(String jdbcURL, String userID, String userPass);
- jdbcURL : 자신의 PC의 MySQL 이용 시 jdbc:mysql://localhost:3306/[사용할 DB]
- userID, userPass : DB관리자가 설정한 아이디와 비밀번호
Statement를 사용한 퀴리 실행
- Connection 객체 생성 후 Connection의 createStatement()으로부터 Statement를 생성한 뒤에 퀴리를 실행 할 수 있다.
생성
Statement stmt = conn.createStatement();
- Statement 클래스 생성 이후 사용 가능한 두 메소드가 있다.
ResultSet executeQuery(String query) : SELECT 퀴리를 실행
int executeUpdate(String query) : INSERT, UPDATE, DELETE 퀴리를 실행
- executeQuery() 메소드는 SELECT퀴리의 결과값을 java.sql.ResultSet객체에 저장해서 리턴
- executeUpdate() 메소드는 INSERT, UPDATE, DELETE 퀴리를 실행하고 그 결과로 변경된 레코드의 개수를 리턴
ResultSet에서 값 읽어오기
- Statement의 executeQuery()메소드를 통해 가져온 실행 결과(레코드)를 ResultSet객체에 담아서 리턴한다.
- ResultSet 클래스가 제공하는 메소드를 사용해서 결과값을 읽어올 수 있다.
ResultSet의 next() : SELECT 결과값(레코드)의 존재 여부를 확인할 수 있다.
- 첫줄에 레코드가 있으면 true 리턴 없으면 false 리턴. 다음 next() 사용 시 그 다음 줄 레코드 있으면 true 리턴 없으면 false 리턴
- next()는 레코드의 커서를 넣는 것과 같은 역할은 한다. 처음 next() 통해서 첫줄 레코드에 커서를 두는 것이다.
ResultSet 클래스의 next()를 통한 위치에서 데이터 읽어 올 수 있는 메소드
※ getInt()가 가능하듯 Double, float, Long 위와 같은 형태 가능
- next()를 통해 레코드 위치에 대한 커서를 이동해서 위와 같은 메소드를 통해서 값을 가져온다.
ex.
String jdbcDriver = "jdbc::mysql//localhost:3306/[사용할 DB]";
String dbUser = "root";
String dbPass = "1234";
String id = "[검색할 아이디]";
String query = "select * from MEMBER Where id = '"+id+"'";
Connection conn = (Connection) DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(query);
if(rs.next){
String pass = rs.getString("PASSWORD");
}
PreparedStatement를 사용한 퀴리 실행
- java.sql.PreparedStatement는 java.sql.Statement와 동일한 기능을 제공한다.
※ 차이점 : PreparedStatement는 SQL 퀴리의 틀을 미리 생성해 놓고 값을 나중에 지정하는 것
PreparedStatement 사용 순서
1. Connection.prepareStatement()메소드를 사용하여 PreparedStatement 생성
2. PreparedStatement의 set메소드를 사용해서 필요한 값 지정
3. PreparedStatement의 executeQuery() 또는 executeUpdate() 메소드를 사용하여 쿼리를 실행
4. finally 블록에서 사용한 PreparedStatement 를 닫음 - close()메소드 실행
ex. 값을 채울 자리를 물음표(?)를 통해서 지정한다.
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement("Insert into MEMBER (MEMBERID,NAME) values (?, ?)");
- PreparedStatement가 제공하는 set 계열의 메소드를 사용하여 물음표를 대체할 값을 지정해 준다.
ex. set 계열 메소드로 값 지정해 주지
pstmt.setString(1, "gjworud"); // 첫 번째 물음표의 값 지정
pstmt.setString(2, "허재경"); // 두 번째 물음표의 값 지정
pstmt.executeQuery();
PreparedStatement 클래스가 제공하는 set계열 메소드
PreparedStatement 퀴리를 사용하는 이유
1. 반복해서 실행되는 동일 퀴리의 속도를 증가 시키기 위해
2. 값 변환을 자동으로 하기 위해
3. 간결한 코드를 위해
'👨💻Computer Science > 데이터베이스' 카테고리의 다른 글
[Database] 04 - 4 SELECT문 (0) | 2021.10.07 |
---|---|
[Database] 04 - 3 데이터 정의어와 무결성 제약조건 (0) | 2021.10.07 |
[Database] 04 - 2 SQL 개요 (0) | 2021.10.07 |
[Database] 04 - 1 관계 대수와 SQL (0) | 2021.09.16 |
[Database] 02 - 4 무결성 제약조건 (0) | 2021.09.14 |
댓글