graph
A(자바 응용 프로그램) --> |하나의 인터페이스로 모든 DB 연동|B(JDBC)
B --> C(Oracle 드라이버)
B --> |각 회사에서 Driver 제공|D(MySQL 드라이버)
B --> E(MS SQL 드라이버)
C--> F(Oracle)
D --> G(MySQL)
E --> H(MS SQL)
Type 1 | ODBC 브릿지 Driver | C언어 기반 | |
Type 2 | Native API Driver | C, C++ / Native Library 호 | |
Type 3 | Network Protocol Driver | 순수 Java / Web Application 서버 미들웨어에 전달 | |
Type 4 | DBMS Protocol Driver Thin Driver |
순수 자바 / DBMS를 직접 호출, 드라이버 DB간 1:1 관계 |
Stirng url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "SCOTT";
String password = "tiger";
//1. JDBC Driver 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. Connection 객체 생성 (Drivermanager 클래스)
cnn = getConnection(url, user, password);
//3. 작업 (CRUD / 질의 응답)
//...
//4. 연결 종료
cnn.close();
Stirng url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "SCOTT";
String password = "tiger";
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
cnn = getConnection(url, user, password);
while(rs.next()){
int deptno = rs.getInt(1);
String dname = rs.getString("dname");
String loc = rs.getString("loc");
System.out.printf("%d\t%s\t%s\n",deptno,dname, loc);
}
cnn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
//4. close
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Connection
Connection connection = DriverManger.getConnection(url, user, password);
Statement
Statement statement = connection.createStatement()
String sql = "SELECT * FROM emp";
ResultSet rs = statement.executeQuery(sql);
String sql = "INSERT INTO dept VALUES (50, 'QC', 'SEOUL'";
int rowCount = statement.executeUpdate(sql);
ResultSet
ResultSetMetaData
ResultSet rs = pstmt.excuteQuery();
ResultSetMetaData rsmd = rs.getMetaData();
getColumnCount()
getColumnType()
그 외
DTO (Data Transfer Object)
graph LR;
A(Client) --> |DTO|B(Controller);
B --> |DTO|C(Service);
C --> |DTO|D(Repository);
D --> |DTO|E(DB);
B --> |DTO|A;
C --> |DTO|B;
D --> |DTO|C;
E --> |DTO|D;
public class DTO {
private Stirng name;
private int age;
private boolean gender;
public DTO() {
super();
}
public DTO()
}
PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql);
Scanner sc = new Scanner(System.in);
int pdeptno = sc.nextInt();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,pdeptno);
ResrultSet rs = pstmt.executeQuery();
CallableStatement
CallableStatement cstmt = conn.prepareCall(sql);
Scanner sc = new Scanner(Sytem.in);
int deptno = sc.nextInt();
String dname = sc.next();
String sql = "{call 프로시저명(pdeptno => ?, pdname => ?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setInt(1, deptno);
cstmt.setString(2, dname);
int rowCount = cstmt.executeUpdate();
cstmt.close();
CREATE OR REPLACE PROCEDURE up_test
(
pdeptno emp.deptno%TYPE, -- 입력 매개변수
pcursor OUT SYS_REFCURSOR -- 출력 매개변수(커서)
)
IS
vsql VARCHAR2(2000);
BEGIN
vsql := 'SELECT * ';
vsql := vsql || 'FROM emp ';
vsql := vsql || 'WHERE dpetno = :pdeptno ';
OPEN pcursor FOR vsql;
END;
String sql = "{call up_test(pdeptno => ?, pcursor => ?)}";
CallableStatement cstmt = connection.prepareCall(sql);
cstmt.setInt(1, 10); //입력 파라미터 (10번 부서원)
cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CUSOR);
// 2번째 바인딩 변수에 참조커서 타입으로 출력 파라미터를 받아오겠다는 코딩
cstmt.executeQuery();
ResultSet rs = (ResultSet) cstmt.getObject(2);
트랜잭션 처리
commit() | 커밋 처리 하나의 논리적인 작업 단위 모두 성공(완료) 시 |
rollback() | 롤백 처리 하나의 논리적인 작업 단위 중 하나라도 실패(예외) 시 |
setAutoCommit(boolean t) | 기본은 자동 커밋 자동 커밋 시 중간에 작업에서 예외 발생해도 그 전 작업은 커밋 됨 매개변수로 false → 자동커밋 해제 |
// 자동 커밋 해제
try{
conn.setAutoCommit(false);
// 1번 작업
PreparedStatement pstmt = conn.prepareStatement(sql1);
pstmt.executeUpdate();
// 2번 작업
pstmt = conn.prepareStatement(sql2);
pstmt.executeUpdate();
// 1 + 2 번 성공 시 커밋
conn.commit();
} catch (SQLException e) {
// 1, 2 번 중 한 군데서라도 예외 발생 시 롤백
conn.rollback();
} finally {
pstmt.close();
}