03.17 학습! JDBC! 🟥🟧🟨🟩🟦🟪🟫⬜⬛🫢🔔😎😊🤔😭⭐

MyBatis Framework (SQL Mapping Framework)
MVC - Service(Tx 관리), Data
Java DataBase Connectivity -> 인터페이스의 집합!
만약 Oracle DBMS, MySql DBMS, DB2 DBMS 이렇게 있는데
같은 코드 DATABASE를 사용하는데 DBMS만 바뀔 때 하드코딩이 나타난다
자바 애플리케이션에서의 DB 접근 및 사용 방법에 대한 표준화 필요성 부각
자바 애플리케이션과 DB와의 독립성 필요!
JDBC는 표준을 제시한다! 하지만 구멍이 뚫려있음 거기에 각각의 DBMS에 맞는 코드 추가하여 작동!
😎개발자 관점 - DB와의 통신을 하기 위해 Java Application에서 사용하는 방법
각 DB 접속 방법 및 구현에 대한 상세한 정보를 알 필요 없음
DataBase 관점 - 표준화된 통신 기능을 제공하기 위해 구현해야 하는 약속, 명세
표준화된 인터페이스를 준수하는 DBMS만의 고유한 클래스 구현
JDBC 인터페이스에 대한 DB 벤더들이 구현한 클래스 라이브러리
구현체 -> JDBC Driver -> 클래스 라이브러리
드라이버 없이 동작할 수 없다! -> java Application 개발 후 실행 시에 반드시 필요하다!
⭐⭐⭐ JDBC를 이용한 DB 연동 6단계 ⭐⭐⭐
🔔1. JDBC Driver Class 로딩 (JDBC 4.0 이후 버전부터 생략 가능)
DBMS와 연결을 수립해주는 역할 JDBC Driver Class 메모리에 로딩 및 등록
명시적 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
🔔2. Connection 생성
DBMS와 연결 생성
String url = "jdbc:mysql://localhost:3306/ssafydb";// DB URL
String user = "ssafy";
String password = "ssafy";
Connection conn = DriverManager.getConnection(url,user,password);
Connection은 모든 Connection들의 부모
java.sql.Connection
🔔3. Statement 생성 (통로)
통로 생성 (쿼리 준비)
Statement stmt = conn.createStatement();
가장 기본이 되는 Statement
생성 시 실행할 SQL이 정해지지 않은 Statement
매 실행 마다 실행할 SQL 전송
SQL Injection 공격에 취약 (or 1==1 넣으면 다 뚤림)
java.sql.Statement
String sql = "SELECT * FROM emp WHERE empno = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, empNo);
java.sql.PreparedStatement
반복적인 SQL 작업을 최적화하여 통로 생성시 실행할 SQL을 미리 결정하는 Statement
인젝션 공격도 막음
CallableStatement cstmt = conn.prepareCall("{CALL processReturn(?, ?)}");
cstmt.setInt(1, 250303001);
cstmt.setString(2, "ssafy");
cstmt.execute();
java.sql.CallableStatement
속도는 가장 빠름 DBMS에 종속적
🔔4. SQL 실행
stmt는 sql를 전달해야하지만
⭐pstmt는 파라미터를 넣으면 안된다! 에러난다!⭐
이미 작성을 해놓음 Prepared!
SQL유형
SELECT - executeQuery -> ResultSet
INSERT, UPDATE, DELETE - executeUpdate -> int
모든 SQL - execute -> boolean
🔔5. 결과 집합 처리 (실행한 SQL이 SELECT문)
String sql = "SELECT empno, ename FROM emp";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
EmpDTO emp = new EmpDTO();
emp.setEmpNo(rs.getInt("empno"));
}
rs = 메타데이터 (이터레이터)
ResultSet은 커서라고 생각!
java.sql.ResultSet
ResultSet 처리
커서는 항상 record 이전에 있다가 next() 함수를 통해 내려간다 true or false
🔔6. 자원 반납
rs.close(), stmt.close(), conn.close();
AutoClosable -> try~ with
명시적 반납 -> finally
Data Access Object 디자인 패턴
데이터 처리 로직과 애플리케이션의 비즈니스 로직을 분리하는 디자인 패턴
CRUD 작업을 캡슐화
장점
비즈니스 로직과 데이터 액세스 분리, 코드 재사용성 증가, 유지 보수성 향상
service + DAO
DAO 없이는 못살아~ -> 둘의 협업!
⭐ 이것만 기억! 이 구조를 통해 트랜잭션을 만드는 것! ⭐
try
conn.setAutoCommit(false);
작업들~~
conn.commit();
catch
conn.rollback();
백엔드 학습하고 집에서는 알고리즘 1일 1문제 풉시다!