개발 무지렁이

[JDBC] JDBC 로드, 연결, 실행, 닫기 본문

Backend/JDBC

[JDBC] JDBC 로드, 연결, 실행, 닫기

Gaejirang-e 2023. 4. 18. 21:55

JDBC(Java DataBase Connectivity)


JavaDB를 연동

  🚀 단계
  1) 로드: 연동하려는 DB제품(벤더)를 선택하는 것, Driver가 필요하다(~.jar)
     (만약 Driver를 못찾으면 ClassNotFoundException 발생)
  2) 연결: 로드된 DB에 접속, URL(host name, port, SID), ID, Password를 이용해서 연결객체를 얻어오는 과정
  3) 실행: CRUD 작업
  4) 닫기: 사용된 객체를 반납

  ⚠️ 커넥션(Connection)은 절대로 공유하면 안된다.(1커넥션 == 1트랜잭션)
  ⚠️ 1)은 변하지 않으니, 딱 한 번만❗

1) 로드 - ~.jar 필요하다


Class.forName("Oracle: oracle.jdbc.driver.OracleDriver");

2) 연결 - URL, ID, Password 필요


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

(⚠️ ConnectionException 발생)

3) 실행 - CRUD작업을 위한 2가지 방법


  1. Statement방식 (SQL INJECTION 공격대상)
  2. 'PreparedStatement 방식' (SQL INJECTION 방어)
📌. PreparedStatement방식SQL INJECTION을 방어할 수 있는 이유?

Statement방식?바인딩을 해서 ?에 다른 연산자가 들어올 수 있지만,
ex. String sql = "insert into emp(empNo, eName, job, hiredate) values(?, ?, ?, sysdate)";

PreparedStatement방식ps.set(1, empNo);과 같이 메서드를 이용하므로,
다른 연산자가 들어올 수 없다.

[DDL or DML.java]

  String sql = "<CIUD문>";

  PreparedStatement ps = con.prepareStatement(sql); // 2.방식
  // Statement st = con.createStatement(); // 1.방식
  ps.setInt(1, empNo);
  ps.setString(2, eName);
  ps.setString(3, job);

  int result = st.executeUpdate(); // create, insert, update, delete (DML), (0: 실패, 1: 성공)
  // int result = st.executeUpdate(sql); // 1.방식

[DQL.java]

  String sql = "<Select문>";

  PreparedStatement ps = con.prepareStatement(sql); // 2.방식
  // Statement st = con.createStatement(); // 1.방식


  ResultSet rs = st.executeQuery(); // select (DQL)
  // ResultSet rs = st.executeQuery(sql); // 1.방식
  List<EmpDTO> list = new ArrayList<>();

  // 가져올 레코드가 여러개일 때
  while(rs.next()) { // 가져올 레코드가 하나일 땐, if(rs.next())
      //ex
      int empNo = rs.getInt("empno"); // rs.get타입("컬럼명");
      String eName = rs.getString(2); // rs.get타입(인자 순서);
      String job = rs.getString(3);

      EmpDTO emp = new EmpDTO(empNo, eName, job);
      list.add(emp);
  }
📌. rs.next();

: cursor를 밑으로 내리는 method (cursor가 처음에는 column명에 있다)
(있으면 true, 없으면 false)

4) 닫기 - 사용된 객체를 반납


~.close();
Comments