1) Java와 DBMS (오라클, MySQL, MaviaDB...) 연동 기술
2) Java => 접속(by JDBC
) => Oracle, ms-SQL...
일관된
방법(interface)으로 연동이 가능하다.3) 자바와 연동하기 위한 사전 환경
모든 DB 종류와의 연동 기술을 알아야 한다 ?
4) ✨(중요) Java 진영에서 인터페이스
를 구현
implements
*.jar
사용하도록 build path
해야 한다) => 컴파일러에게 알려줌 JDBC 드라이버(각 벤더에서 생성된 클래스 파일들)는 DB와 통신을 담당하는 인터페이스로, DB와 연결하는 Driver 클래스
를 만들 때 반드시 implements
해야 한다.
벤더에서는 해당 벤더에 맞는 JDBC 드라이버를 구현해서 제공하고, 개발자는 이JDBC 드라이버의 구현체를 이용해서 특정 벤더의 DB에 액세스할 수 있다.
JDBC 드라이버 예) 오라클 드라이버
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
- 위에 3개 다 쓰는게 아니라(충돌 발생) 하나만 사용
벤더 별 드라이버build path
방법 (ojdbc6_g.jar
)
오라클 드라이버가 있는 곳
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id ="SCOTT"
String password ="TIGER"
Class.ForName(" ");
package p01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SelectTest {
public static void main(String[] args) {
// 입력 순서 아래와 같이 고정
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String userid ="SCOTT";
String passwd ="TIGER";
// 비-런타임 계열 에러는 컴파일 에러 발생하므로 예외처리가 필수임 cf. 런타임 계열
// 파일 입출력, sql 연동시 예외처리 구현 필수
// 쓰려고하는 상대방의 메소드(forname())가 throws로 예외(ClassNotFoundException)던져줬으니까 (비런타임 계열은 모두 throws 하는데)
// 이걸 받는 쪽에서 예외처리 안해주면 컴파일 에러 발생
// Class.forName(driver);
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection con = DriverManager.getConnection(url, userid, passwd);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Connection con = DriverManager.getConnection(url, id, pw);
Connection : 인터페이스
String sql = "select deptno, dname, loc from dept" ;// 반드시 ; 제외
PreparedStatement
: 인터페이스에 해당 PreparedStatement pstmt = con.prepareStatement(sql );
pstmt.execute(); //create 문
// 아래는 ResultSet 값을 리턴
// ResultSet은 SELECT문의 결과를 저장하는 객체
✨ ResultSet rs= pstmt.executeQuery(); //select 문
// 아래는 int 값을 리턴 (실제 쿼리문이적용된 행의 갯수가 반환)
✨ int n = pstmt.executeUpdate(); //insert, delete, update 문
while(rs.next()){}
rs = pstmt.executeQuery();
while(rs.next()){
// 한 행씩 반복 처리
//"deptno" : 컬럼헤더값
int deptno = rs.getInt("deptno")
String name = rs.getString(2);
String loc = rs.getString("loc");
} //end while
package p01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelectTest {
public static void main(String[] args) {
// 입력 순서 아래와 같이 고정
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String userid ="SCOTT";
String passwd ="TIGER";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection con = DriverManager.getConnection(url, userid, passwd);
String sql = "select deptno, dname, loc from dept" ;// 반드시 ; 제외
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs= pstmt.executeQuery();
while(rs.next()){
// 한 행씩 반복 처리
//"deptno" : 컬럼헤더값
int deptno = rs.getInt("deptno"); //테이블 index 1부터 시작
String dname = rs.getString(2);
String loc = rs.getString("loc");
System.out.println(deptno+"\t"+dname+"\t"+loc);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
String sql = "insert into dept(deptno, dname, loc)
// 1, 2, 3
// 테이블 인덱스는 1부터 시작 (배열과 다름)
values(?,?,?)";
String sql = "select deptno, dname, loc from dept where deptno = ?" ;
PreparedStatement pstmt = con.prepareStatement(sql); 코드를 입력하세요
=> 있으면 값을 먼저 설정해야 한다
pstmt.setInt(위치, 값);
pstmt.setString(위치, 값);
int n = pstmt.execute Update();
INSERT, UPDATE, DELETE(DML)
가 데이터베이스에 영향을 미친(row affected) 행의 수를 int 자료형으로 반환하여 n 변수에 할당하는 코드+) INSERT, UPDATE, DELETE(DML)은 commit이 필수고, rollback 시 취소
java는 auto commit, sql developer는 명시적 commit
insert into dept(deptno, dname, loc)
values(1, '개발', '서울');
commit;
ojdbc6_g.jar
String sql = " update dept " // 반드시 ; 제외
+ " set dname=?, loc=? "
+ " where deptno=? ";
PreparedStatement pstmt = con.prepareStatement(sql); 코드를 입력하세요
INSERT, UPDATE, DELETE(DML)
가 데이터베이스에 영향을 미친(row affected) 행의 수를 int 자료형으로 반환하여 n 변수에 할당하는 코드+) INSERT, UPDATE, DELETE(DML)은 commit이 필수고, rollback 시 취소
+) DML 정상 작동 (유의 사항)
ojdbc6_g.jar
String sql = " delete from dept where deptno=? ";
PreparedStatement pstmt = con.prepareStatement(sql); 코드를 입력하세요
=> 있으면 값을 먼저 설정해야 한다
pstmt.setInt(위치, 값);
pstmt.setString(위치, 값);
int n = pstmt.execute Update();
INSERT, UPDATE, DELETE(DML)
가 데이터베이스에 영향을 미친(row affected) 행의 수를 int 자료형으로 반환하여 n 변수에 할당하는 코드+) INSERT, UPDATE, DELETE(DML)은 commit이 필수고, rollback 시 취소
7) close
+) DML 정상 작동 (유의 사항)
트랜잭션
여러 DML (여러 작업)을 하나의 작업으로 처리하도록 묶음
여러 DML(여러 작업)을 하나의 작업으로 처리하도록 묶음
[1], [2]번까지 잘 실행되다가 [3]번 작업 시 소프트웨어가 중단되거나 하드웨어가 고장이 발생하여 작업에 오류가 생긴다면?
[2]번까지의 모든 작업을 취소하고 트랜잭션 작업 전인 데이터베이스 초기 상태로 돌아가게 된다.
public void query(String sql) {
try (Connection connection){
connection.setAutoCommit(false); // 설정하지 않으면 true이다. (비활성화)
...// 비즈니스 로직
del member();
// 비즈니스 로직에 에러가 발생하지 않으면 Commit
connection.commit();
} catch (SQLException e){
connection.rollback(); // 에러가 발생하면 rollback
} finally {
connection.setAutoCommit(true);
}
}
JDBC 드라이버
로딩DriverManager 클래스
를 통해서 로딩된다.Class.forName("com.jdbc.cj.mysql.Driver");
Connection 객체
생성인터페이스
이다. // 연결 정보
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "";
// 정보 등록 -> 커넥션 얻기
Connection connect = DriverManager.getConnection(url, username, password);
PreparedStatement
CallableStatement
Statement state = connect.createStatement();
executeQuery()
executeUpdate()
ResultSet rs = state.excuteQuery("SELECT * FROM USER");
while(rs.next()) {
String name = rs.getString("column명");
int id = rs.getInt("column명");
}
rs.close();
state.close();
connection.close();