728x90
반응형
캐쉬 기능을 사용하지 않는 옵션인 NOCACHE 옵션을 활용한 SEQUENCE 예제
SQL
MOVIE TABLE 생성
CREATE TABLE movie(
id NUMBER PRIMARY KEY,
title VARCHAR2(100) NOT NULL,
attendance NUMBER DEFAULT 0);
movie_seq SEQUENCE 생성
: cache기능을 사용하지 않겠다는 옵션을 할당
-- > 비정상 종료 시에도 번호가 이어지도록
CREATE SEQUENCE movie_seq NOCACHE;
INSERT
INSERT INTO movie(id, title) VALUES (movie_seq.nextval, '8월의 크리스마스');
SELECT
SELECT *
FROM movie;
[ MOVIE TABLE ]
JAVA JDBC
TestDAO class (main class)
새로운 DB 등록 - register method (sequence에서 nextval, currval활용)
/TestMovieDAO.java
package test;
import model.MovieDAO;
import model.MovieVO;
public class TestMovieDAO {
public static void main(String[] args) {
try {
MovieDAO dao = new MovieDAO();
MovieVO vo = new MovieVO();
// 새로운 movie 정보 생성
vo.setTitle("인터스텔라");
vo.setAttendance(100);
// movie 정보 db 등록
dao.register(vo);
System.out.println("영화정보 등록 OK --> "+vo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[ register method 1번째 실행 결과 ]
[ register method 2번째 실행 결과 ]
DAO ( Data Access Object ) class
: 데이베이스 연동 로직을 정의한 객체
하나의 Connection 내에서 여러 개의 기능을 넣을 수 있다 !
/MovieDAO.java
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MovieDAO {
private String driver = "oracle.jdbc.OracleDriver";
private String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
private String user = "scott";
private String password = "tiger";
//MovieDAO Constructor : 1. 드라이버 로딩
public MovieDAO() throws ClassNotFoundException {
Class.forName(driver);
}
//closeAll method 1 - ResultSet 있는 ver
public void closeAll(PreparedStatement pstmt, Connection con) throws SQLException {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
}
//closeAll method 2 - ResultSet 없는 ver // OverLoading
public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection con) throws SQLException {
if(rs != null)
rs.close();
closeAll(pstmt, con);
}
//register method
// :movie 정보를 db에 등록하는 메서드
public void register(MovieVO vo) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//Connection - 하나의 커넥션 안에서 두가지의 기능
// 1. INSERT
// 2. SELECT
con = DriverManager.getConnection(dbUrl, user, password);
/*
* 1.MovieVO vo로 들어온 정보 테이블에 INSERT(id= seq.nextval)
*/
//StringBuilder SQL 정의 (INSERT, sequence로 id값 주기)
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO movie(id, title, attendance) ");
sql.append("VALUES(movie_seq.nextval, ?, ?)");
//PreparedStatement 정의 : pstmt
pstmt = con.prepareStatement(sql.toString());
// setString / setInt
pstmt.setString(1, vo.getTitle());
pstmt.setInt(2, vo.getAttendance());
//SQL 실행 --> executeUpdate()
pstmt.executeUpdate();
//pstmt.close()
pstmt.close();
/*
* 2. 1 과정에서 movie TABLE에 등록된 정보 읽어오기(id = seq.currval)
* : 발급된 영화 id (시퀀스값)를 할당받기 위해, SQL을 한번 더 실행한다.
*/
//SQL 정의 (SELECT, sequence.currval로 현재값 가져오기)
sql = new StringBuilder();
sql.append("SELECT movie_seq.currval FROM dual");
//PreparedStatement 정의 : pstmt
pstmt = con.prepareStatement(sql.toString());
//SQL 실행 --> executeQuery()
rs = pstmt.executeQuery();
if(rs.next()) {
// movie_seq.currval을 currentId에 할당
int currentId = rs.getInt(1);
// vo row에 'id' column의 value를 current Value sequence로 할당
vo.setId(currentId);
}
} finally {
//closeAll
closeAll(rs, pstmt, con);
}
}//register
}//MovieDAO class
VO ( Value Object ) class
: 정보를 저장하고 (계층 간/ 원격으로)전송하기 위한 class
/MovieVO.java
package model;
public class MovieVO {
private int id;
private String title;
private int attendance;
//Constructor 1
public MovieVO() {
super();
}
//Constructor 2
public MovieVO(int id, String title, int attendance) {
super();
this.id = id;
this.title = title;
this.attendance = attendance;
}
@Override
public String toString() {
return "MovieVO [id=" + id + ", title=" + title + ", attendance=" + attendance + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getAttendance() {
return attendance;
}
public void setAttendance(int attendance) {
this.attendance = attendance;
}
}
728x90
반응형