JDBC
JDBC
- 자바에서 DB 프로그래밍을 하기 위해 사용되는 API
- DB 종류에 상관없음.(JDBC 드라이버를 사용하기 때문)
-
JDBC 흐름 : JDBC 드라이버 로드 > DB connection 객체 생성 > 쿼리문 생성 및 Statment 객체(PreparedStatement) 생성 > 쿼리전송(실행) - 결과값 > 트랜잭션 처리(commit, rollback) > 자원반납
- JDBC driver 설치
- [오라클 사이트 진입]
- 설치되어있는 oracle 버전에 맞는 driver(.jar) 설치
SELECT
- Class.forName(“oracle.jdbc.driver.OracleDriver”)
- 드라이버를 로드
- Connection con = DriverManger.getConnection(…);
- 연결객체
- Statement st = con.createStatement();
- 실행도구 생성(SQL 문을 데이터베이스에 보내기위한 객체)
- ResultSet res = st.executeQuery(sql);
- 결과도구 생성(SQL 문장 실행 후 결과를 ResulSet으로 리턴)
- ResultSet rs = st.excuteQuery(sql);
- SQL 질의에 의해 생성된 테이블을 저장하는 객체
- rs.next()를 이용해 커서 이동
- rs.getString, getInt(“컬럼”)등 을 이용해 컬럼값 가져옴
// 리턴값에 제네릭을 사용해 Notice 만 오도록 지정
public List<Notice> getList() throws ClassNotFoundException, SQLException{
String sql = "SELECT * FROM NOTICE";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,user_id,pw);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
// 새로운 ArrayList 를 생성해 담을 준비함.
List<Notice> list = new ArrayList<Notice>();
// rs.next 담겨있는 데이터만큼 반복해 데이터를 가져옴.
while(rs.next()) {
int id = rs.getInt("id");
String title = rs.getString("title");
String writer_id = rs.getString("writer_id");
String content = rs.getString("content");
Date regdate = rs.getDate("regdate");
int hit = rs.getInt("hit");
String files = rs.getString("files");
int pub = rs.getInt("pub");
// 가져온 데이터를 새로운 Notice 객체에 담음.
Notice notice = new Notice(id,title,writer_id, content, regdate, hit, files, pub);
// 담은 객체를 새로운 list에 담음
list.add(notice);
}
// 데이터를 담은 list객체를 리턴함.
return list;
}
INSERT
- String sql = “INSERT INTO NOTICE(title, writer_id, content, id) VALUES(?,?,?, SEQ_NOTICE_ID.NEXTVAL)”;
- 다수의 값을 INSERT 시 ? 매개변수 사용
- PreparedStatement st = con.prepareStatement(sql);
- SQL문을 데이터 베이스에 보내기위한 객체
- st.setString(index, value);
- 값을 대입할때 사용
- setString 은 데이터 타입에 따라 변동가능
- index 값은 ? 매개변수에 값을 지정함.
- int result = pre.executeUpdate();
- sql 실행 후 변경된 row 수를 int 타입으로 리턴
- SELECT 를 제외한 나머지 결과값 저장은 executeUpdate() 함수를 사용 후 result 값을 리턴
// executeUpdate() 함수가 false면 0 true 면 1을 리턴하기 때문에 리턴값 int 설정 ,Notice 객체를 인자로 받음.
public int insert(Notice notice) throws ClassNotFoundException, SQLException {
String sql = "INSERT INTO NOTICE(title, writer_id, content, id)"
+ "VALUES(?,?,?, SEQ_NOTICE_ID.NEXTVAL)";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,user_id,pw);
con.setAutoCommit(false); // 자동커밋 방지함.
PreparedStatement pre = con.prepareStatement(sql);
//Notice 에 담을 값을 연동
pre.setString(1, notice.getTitle());
pre.setString(2, notice.getWriter_id());
pre.setString(3, notice.getContent());
int result = pre.executeUpdate();
//트랜잭션 처리
if(result > 0) {
con.commit();
} else {
con.rollback();
}
pre.close();
con.close();
return result;
}
UPDATE
public int update(Notice notice) throws ClassNotFoundException, SQLException {
Class.forName(driver);
Connection con = DriverManager.getConnection(url,user_id,pw);
con.setAutoCommit(false); // 자동커밋 방지함.
String sql = "UPDATE NOTICE SET TITILE =?, WRITER_ID=?, CONTENT=?, WHERE ID =?";
PreparedStatement pre = con.prepareStatement(sql);
String title = notice.getTitle();
String writer = notice.getWriter_id();
String content = notice.getContent();
int id = notice.getId();
pre.setString(1, title);
pre.setString(2, writer);
pre.setString(3, content);
pre.setInt(4, id);
int result = pre.executeUpdate();
//트랜잭션 처리
if(result > 0) {
con.commit();
} else {
con.rollback();
}
return result;
}
DELETE
public int delete(int id) throws ClassNotFoundException, SQLException {
String sql = "DELETE NOTICE WHERE ID =?";
Class.forName(driver);
Connection con = DriverManager.getConnection(sql, user_id, pw);
con.setAutoCommit(false); // 자동커밋 방지함.
PreparedStatement pre = con.prepareStatement(sql);
pre.setInt(1, id);
int result = pre.executeUpdate();
pre.close();
con.close();
return result;
}