JDBC : 오라클과 자바 연결 테스트하기
시행착오가 너무 많았다 ㅠㅠ 힘들어...
일단 오라클 공식사이트에 드라이버 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 버전 쓰시는 분 아래 드라이버 받아가세요~