[JDBC] JDBC와 기본 구조

JOY·2023년 4월 3일
0

[Java]

목록 보기
13/15
post-thumbnail

JDBC(Java Database Connectivity)

Java와 DB를 연동하는 것 (Interface 기반)
각각 DB에 존재하는 vendor의 동작을 통해 실체 구현체를 실행
👉 어떤 DBMS를 사용하더라도 동일하게 동작한다

단계

1. JDBC 드라이버 로딩

: 연동하려는 DB제품(vendor)를 선택하는 것.
이때, 각각의 Driver가 필요하다. (ex. ~.jar)
만약 Driver를 찾지 못하면 ClassNotFoundException 에러 발생

Class.forName("연결하고자 하는 DBDriverClass명")

📍DBMS별 사용 방법
Oracle : oracle.jdbc.driver.OracleDriver
MsSql : sun.jdbc.odbc.JdbcOdbcDriver
MySql : org.git.mm.mysql.Driver

2. Database 연결

: 로드된 DB에 접속하는 것으로 URL, ID, PW를 이용해서 연결된 객체를 얻어오는 과정

Connection con = DriverManager.getConnection(String url,String id,String pw)

📍DBMS별 url
Oracle : jdbc:oracle:thin@localhost:1521:ORCL or xe
MsSql : jdbc.odbc.odbc설정을통해만든db원본명
MySql : jdbc:mysql://localhost:3306/db명
👉 MySQL의 기본 포트번호는 3306
👉 Oracle의 기본 포트번호는 1521

3. 실행

: CRUD 작업 실행 (Create, Read, Update, Delete)
1. Statement 방식

Statement st = con.createStatement();

//DDL or DML 인 경우
int result = st.executeUpdate(String sql);

//DCL 인 경우
ResultSet rs = st.executeQuery(String sql);

ex) EmpDTO에 데이터를 저장하는 경우

while(rs.next()){ //다음 행 확인. 있으면 true, 없으면 false
	//현재 행의 각 열을 조회한다. .~.getXxx
    //DataType 변수이름  = re.getType('컬럼명');
    int empNo = rs.getInt("empno");
    String ename = rs.getString(2);
    String job = rs.getString(3);
    
    //DTO에 저장
    EmpDTO emp = new EmpDto(empNo, ename, job);
    
    //list에 추가
    list.add(emp);
} 

DAO에서 필요한 형태를 만든 후 List로 리턴을 해줘야 한다.

1) DDL or DML 인 경우 - 결과는 성공여부가 출력됨

  • result가 0 이면 적용된 레코드가 없다. - 실패
  • result가 1 이상이면 적용된 레코드가 있다. - 성공
  • 처리 명령
    : executeUpdate(String sql) : sql - DDL, DML 쿼리문
    : 반환값 - int

2) DCL인 경우 - Select전용

  • 처리 명령
    : executeQuery(String sql) : sql - Select 문
    : 반환값 - ResultSet 클래스의 인스턴스

  • PreparedStatement 방식 : 권장(Statement를 상속받은 하위) 👉 SQLInjection 공격을 방어할 수 있다.

PreparedStatement ps = con.prepareStatement(String sql);

ex) emp 테이블에 레코드를 하나 추가하는 경우

String sql = "insert into emp(empno, ename, job, hiredate) values (?,?,?,sysdate)";
PreparedStatement ps = con.prepareStatement(String sql);

ps.setInt(1, empno);
ps.setString(2, ename);
ps.setString(3, job);

//실행
int result = ps.executeUpdate();
  1. 해당 파라미터 값들을 ?로 표시
  2. sql문장에 ?가 있다면 ?의 순서대로 개수만큼 값을 할당
    • setType(index, 값);
  3. 실행
    • executeUpdate() 메소드는 쿼리가 DDL, DML인 경우 사용
    • result가 0이면 실패, 1 이상이면 성공

ex) PreparedStatement를 사용하는 select 문장인 경우

String sql = "select empno, ename, job from emp where deptno=20";
PreparedStatement ps = con.preparedStatement(sql);

//실행
ResultSet rs = ps.executeQuery();//	select 인 경우
while(rs.next()){}

sql문장에 ?가 없다면 값 할당 해줄 필요가 없다.

4. 닫기

: 사용된 객체를 반납(close)

rs.close();
ps.close();
st.close();
con.close();

참고 코드 : JDBC

profile
Just Do IT ------- 🏃‍♀️

0개의 댓글