Java와 DB를 연동하는 것 (Interface 기반)
각각 DB에 존재하는 vendor의 동작을 통해 실체 구현체를 실행
👉 어떤 DBMS를 사용하더라도 동일하게 동작한다
: 연동하려는 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
: 로드된 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
: 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 인 경우 - 결과는 성공여부가 출력됨
executeUpdate(String sql)
: sql - DDL, DML 쿼리문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();
?
로 표시setType(index, 값);
executeUpdate()
메소드는 쿼리가 DDL, DML인 경우 사용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문장에 ?
가 없다면 값 할당 해줄 필요가 없다.
: 사용된 객체를 반납(close)
rs.close();
ps.close();
st.close();
con.close();