1. jdbc 드라이버 확인
새로운 프로젝트를 만들기
https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8/21.1.0.0
lib파일 생성 -> 다운로드한 파일 프로젝트에 넣기
2. jdbc 드라이버 jvm에 로드
forName ()메서드를 사용
JDBC를 찾지 못하였다는 예외가 발생
프로젝트 우클릭-> Build path-> configure Build path -> jar 파일 추가
3. DB 와 연결
Connection 를 사용해서 DB와 연결
orcle은 1521번 포트번호를 가지고 있다.
만약 접속할 포트번호와 서비스아이디를 모르면 관리자에게 물어봐야한다.
4. SQL 문을 송신
자바문법이 오라클에서 오류가 날 것을 체크할 수 없다. 문법에 문제가 있는지 없는지, 값의 범위를 넘어섰는지, 상속관계등을 컴파일시 체크할 수 있는데 오라클에 전달되고 오라클에서 처리가 될 구문이기 때문이다. 즉 자바는 오라클에 보내기만 하면 역할이 끝나기 때문에 컴파일 되었다고 안심하면 안된다. 테스트를 거쳐서 확인해야한다.
Statement stmt = null; statement 는 수신용 api이다.
stmt.executeQuery(selectSQL); 으로 송신을 하였다.
5. 결과 수신
송신된 것을 수신하기 받기위해서 ResultSet 을 사용한다.
수신에 관련된 라이브러리가 resultSet 이다.
next() : Moves the cursor forward one row from its current position.
Returns: true if the new current row is valid; false if there are no more rows
첫번째 행으로 커서를 이동시킴. 마지막행까지 이동하도록 해보자. 결과가 true이면 반환, false이면 이동된 행에 존재하지 않음
오라클에서 next() 커서가 움직이면 그것을 getInt, getString = 정수일 때 얻어오면 된다.
varchar2, char등 오라클에서 사용되는 것은 자바에서 String으로 처리하면된다.
//4. 결과 수신
rs = stmt.executeQuery(selectSQL); //송신
rs.next(); //첫번째 행으로 커서를 이동시킴. 마지막행까지 이동하도록 해보자. 결과가 true이면 반환, false이면 이동된 행에 존재하지 않음
while(rs.next()) {//while(rs.next()) == true)
//Moves the cursor forward one row from its current position. 커서를 이동시킴
//Returns: true if the new current row is valid; false if there are no more rows
int emp_id = rs.getInt("employee_id");
String f_name = rs.getString("first_name");
int sal = rs.getInt(3); // db인덱스는 1부터 시작한다. jdbc는 db인덱스를 그대로 사용해야한다. 3은 앞서 그림에서 보듯이 인덱스3을 의미
Date hireDt = rs.getDate("hire_date");
System.out.println(emp_id + ":" + f_name + ":" + sal + ":" + hireDt);
}
위의 콘솔창에서 보듯 DB에 정보를 얻어왔다.
6. DB연결닫기
연결을 하였으면 반드시 DB연결을 닫아야 한다. 닫기위해서 finally 메서드를 사용한다.
finally {
// 5.연결닫기
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (con != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void selectTest() {
// 앞서 만든 내용을 추가
}
public static void main(String[] args) {
selectTest();
}
}
이번에는 SELECT가 아닌 INSERT를 사용해보겠다.
SELECT - executeQuery() -> ResultSet
그 외 - executeUpdate() -> INT타입, 처리건수를 반환한다.
DML - 처리건수 반환 , DDL - 처리건수없기때문에 반환값 0
String insertSQL = "INSERT INTO customer(id, pwd) VALUES('idjava', 'pjava')";
stmt.executeUpdate(insertSQL); // executeUpdate 반환타입 int이다. - DML,DDL문을 반환하며 처리건수를 반환하도록 설계되있다.
이번에는 PreparedStatement 를 알아보자
이전에는 Statement를 사용하였다. 만약에 Scanner를 사용하여 입력한 값을 DB에 보낸다고 가정하겠다. 그러면 자바언어와 오라클언어를 둘다 사용해야 하며 아래의 코드 7번째 행을 보면 작은따움표와 큰따움표를 함께 사용하면서 구문을 완성시킨다. 집중하지않으면 오타가 발생할 수 있으며 이러한 불편함을 없애기 위해 바인드 변수를 통해 값을 대신하게 할 수 있다.
String insertSQL = "INSERT INTO customer(id, pwd) VALUES(?,?)"; // ?는 바인드변수: 값을대신
pstmt = con.prepareStatement(insertSQL); //SQL 구문을 미리 준비
pstmt.setString(1, id); //1번 바인드변수는 id값으로 설정
pstmt.setString(2, pwd); //2번 바인드변수는 pwd 값으로 설정
pstmt.executeUpdate();
// pstmt = con.createStatement();
// String insertSQL = "INSERT INTO customer(id, pwd) VALUES( '"+ id + "', '"+pwd+"')";
// pstmt.executeUpdate(insertSQL); // executeUpdate 반환타입 int이다. - DML,DDL문을 반환하며 처리건수를 반환하도록 설계되있다.
PreparedStatement
? 를 사용하는 것을 볼 수 있다. 바인드변수라고 하며 바인드 변수는 값위치에만 올 수 있다.
SQL구문을 미리준비하여 1번 바인드 변수는 ID값으로 설정, 2번 바인드변수는 pwd값으로 설정하여
실행을 하라는 코드이다.
개발자 입장에서는 SQL구문이 굉장히 단순해지기때문에 편리하다.
PreparedStatement 를 사용하는 것을 적극 권장한다.