Backend/JDBC
[JDBC] JDBC 로드, 연결, 실행, 닫기
Gaejirang-e
2023. 4. 18. 21:55
JDBC(Java DataBase Connectivity)
🚀 단계
1) 로드: 연동하려는 DB제품(벤더)를 선택하는 것, Driver가 필요하다(~.jar)
(만약 Driver를 못찾으면 ClassNotFoundException 발생)
2) 연결: 로드된 DB에 접속, URL(host name, port, SID), ID, Password를 이용해서 연결객체를 얻어오는 과정
3) 실행: CRUD 작업
4) 닫기: 사용된 객체를 반납
⚠️ 커넥션(Connection)은 절대로 공유하면 안된다.(1커넥션 == 1트랜잭션)
⚠️ 1)은 변하지 않으니, 딱 한 번만❗
1) 로드 - ~.jar 필요하다
2) 연결 - URL, ID, Password 필요
(⚠️ 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);과 같이 메서드를 이용하므로,
다른 연산자가 들어올 수 없다.
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)
: cursor를 밑으로 내리는 method (cursor가 처음에는 column명에 있다)
(있으면 true, 없으면 false)