본문 바로가기
DB/Code

CODE [day_04] DB / 06. SEQUENCE 시퀀스 - NOCACHE(SQL 쿼리, java JDBC) + nextval-currval 활용

by 파프리카_ 2020. 8. 11.
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
반응형