개발일기/Oracle

JDBC : 오라클과 자바 연결 테스트하기

민장미 2023. 5. 5. 23:32

시행착오가 너무 많았다 ㅠㅠ 힘들어...

일단 오라클 공식사이트에 드라이버 6이 없어서 당황... 어찌 찾음; 

11g 버전은 6이 맞는 걸로 알고 있어서 ...(아래 드라이버 첨부해놨습니다~)

 

 

오라클DB에서 시퀀스란 놈이 상당히 까다롭다는 걸 느끼는 하루였다.

1부터 1씩 증가하는 시퀀스를 만들었다고 가정할 때, 

 

 ------1. 데이터를 삭제해도 그 데이터의 시퀀스는 사라지지 않아서, 

1,2,3,4 중 4번째를 삭제했다면,  그 다음에 새로 데이터를 입력하면 4가 아닌 5가 된다.

 

 ------2. cmd에서 데이터를 삽입하고, 자바와 연결한 후,  자바에서 데이터를 작성하면,

시퀀스는 연동이 안 되는 듯..?  왔다 갔다 입력하면 시퀀스 순서가 개판이 되는 걸 볼 수가 있음.

 

 ------3. 딱히 초기화 방법이 없고, 삭제 후 같은 걸 다시 생성해야하는 것 같다. + 그 테이블 데이터 다 삭제해야함...

gpt에게 물어봤으나 틀린 답을 알려줬어....^^  

 

 ------4. 테이블을 복사 한 후 , 그 원본 테이블(데이터는 전부 삭제함)에서 쓰던 시퀀스 그대로 썼더니 

또 1부터 시작이 안됌 

 

 

 

아래 코드 첨부. 

열 하나 추가하고 "?(3번째) 를 그냥 원하는 순서에 넣었더니 오류가 자꾸 뜨더라... 마지막에 생성된 것은 마지막에 넣어야하는 듯. 

 "INSERT INTO BOOK VALUES(NEW_SEQ.NEXTVAL, ?, ?,SYSDATE, ?)";

 

package oracleTest2;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

//Connection 객체를 사용해서 오라클에 접속 테스트
public class OracleConnectionTest {
	public static void main(String[] args) {
		
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("작성자:");
		String writer = sc.nextLine();
		System.out.print("제목:");
		String subject = sc.nextLine();
		System.out.print("컨텐츠:");
		String content = sc.nextLine();
		
		// if esle => 1번이면 파일로 저장, 2번이면 디비로 저장  구현해보기 
		
		//1. 드라이버를 로딩
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로딩 성공!");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//oracle.jdbc.driver 
		}
		//2. 데이터베이스 연결 테스트
		Connection con = null;
		// protocol(통신규약) : jdbc: oracle:thin:      //sftp,  pop3, 등 규약
		// =>@host:port:sid
		//port는 바뀔 수 있다. LSNRCTL로 cmd에서 알수있다.  
		String url = "jdbc:oracle:thin:@localhost:1521:orcl"; //무조건 외우기
		String user = "kosmo132";
		String pass = "kosmo132";
		
		
		
		try {
			con = DriverManager.getConnection(url, user, pass);
			System.out.println("ConnetionTest:"+con);
			//  insert into memo values(memo_seq.nextVal,'김길동','하이',sysdate);
			//2. 사용자로부터 입력값을 받아서 memo란 테이블에 데이터르르 저장하는 명령문을 
			// 디비에 전송 
			String sql = "INSERT INTO BOOK VALUES(NEW_SEQ.NEXTVAL, ?, ?,SYSDATE,?)";
			//? 1번 ? 2번  ? 끼리의 순서가 중요
			// 컬럼을 추가한 후 ?는 맨 뒤로 보내야함 무조건 순서대로...
			// 접속에 성공해도 SEQ는 계속 증가? 아니면 딴거 쓰다와서?? 
			PreparedStatement pstmt = con.prepareStatement(sql); //커넥션에 연결된 ? 
			// 입력받은 변수 2개 writer, subject 를 ?에 순서대로 연결한다. (binding 한다)
			pstmt.setString(1, writer); //1번째 물음표 
			pstmt.setString(2, subject);   //2번째 물음표
			pstmt.setString(3, content);   //3번째 물음표
			//이제 전송을 실행한다.
			pstmt.executeUpdate(); //DML용 
			// 실행 후에 cmd에서 체크 (적용된거)
		} catch (SQLException e) {
			// SQLException ** 고객에게는 안보여줘도 되지만 개발단계에선 절대 없애선 안된다. *****
			e.printStackTrace();
		}finally {
			try {
				if(con != null) {
				con.close();}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} //테스트 후에는 반드시 연결을 끊어줘야한다. ***
			//연결해서 작성한 데이터들은 저절로 COMMIT이 되는듯 
		}
	}

}

 

데이터를 자바에서 입력 후에, cmd에서 테이블 확인해보기 

정신이 좀 나가서 아무말 썼다.

 

오라클 11g 버전 쓰시는 분 아래 드라이버 받아가세요~

ojdbc6.jar
3.52MB