RDB/Oracle

[오라클] JAVA와 ORACLE의 연동

창문닦이 2019. 1. 30. 16:53

[SQLPLUS 진행]

1. 관리자 계정 로그인

sqlplus / as sysdba 


2.사용자 생성

CREATE USER SUZI 
IDENTIFIED BY A123 
DEFAULT TABLESPACE USERS 
TEMPORARY TABLESPACE TEMP 
QUOTA UNLIMITED ON USERS; 


3. 권한 부여

GRANT CONNECT, RESOURCE TO SUZI; 


4. SUZI로 로그인

CONN SUZI/A123; 


5. 테이블 생성

 CREATE TABLE SCORE 
 (HAK VARCHAR2(10) PRIMARY KEY, 
 NAME VARCHAR2(20) NOT NULL, 
 KOR NUMBER(3), 
 ENG NUMBER(3), 
 MAT NUMBER(3));

[오라클과 자바를 연결할때 참고하는 사용설명서 개념 : OJDBC6.JAR ]


- OJDBC(ORACLE JAVA DATABASE CONNECTIVITY)
뒤에 나오는 숫자가 의미하는 것은? JDK버전의 범위를 의미
JDBC(JAVA DATABASE CONNECTIVITY) : JAVA언어에서 DB를 액세스하는 방법 

 

경로 : C:\app\itwill\product\11.2.0\dbhome_1\jdbc\lib

 

 

- OJDBC6 파일을 알집으로 열면 하기와 같이 보인다. 오픈API가 아니기 때문에 소스가 보이지 않고 CLASS가 존재하는 것만 알수있다.
- OracleDriver.class의 위치 : oracle.jdbc.driver.OracleDirver클래스

- 하기의 경로로 붙여넣어야 라이브러리에 추가된다. ( 자신의 PC에 설치된 자바의 JRE와 JDK에 모두 추가해야 한다.)

 

C:\Program Files\Java\jdk1.8.0_191\jre\lib\ext
C:\Program Files\Java\jre1.8.0_191\lib\ext

 

 

- 자바에 반영한 뒤 이클립스로 조회하면 라이브러리에 반영됨

 

 


[ORACLE 과 JAVA 연동하기 ] 

- 자바에서 오라클을 찾아가는 코딩은 변함이 없다.
- 이렇게 매번 동일한 기능을 수행해야할 때 메소드를 생성한 후, 필요할때마다 메소드를 호출했었다.
- 그런데 메소드로 생성하게 된다면 다른 클래스에서 사용하기 위해서는 객체 생성이 필요하게 되었다.
- 클래스로 이 기능을 생성해서 필요할 때마다 가져다 사용할 것이다.. 매번 메모리를 할당해야 하므로 static으로 만들것이다.
- 디비를 연결하게되면 항상 끊어주는 작업 넣어줘야 한다(.close()). 그렇지않으면 resource를 너무 많이 차지한다. 

1. DATABASE를 연결하는 소스코드

import java.sql.Connection;
import java.sql.DriverManager;
 
//db여러개 연결 가능
 
public class DBConn {
 
private static Connection dbConn; //db연결자를 담을 수 있는 변수
 
public static Connection getConnection(){
//static변수가 이미 메모리에 올라가있으므로 가져다 사용하면 됨
 
if(dbConn==null){//null일 경우 연결이 되지 않은 상태
 
try {
 
String url = "jdbc:oracle:thin:@192.168.16.16:1521:TestDB";
//jdbc방식으로 type4형식, 해당 ip주소를 가진 1521포트의 TestDB로 연결하겠다.
//노트북으로 진행할땐 서버가 아니므로 IP주소가 아니라 LOCALHOST
//동적으로 클래스를 로딩한다. 좀 더 빠른 접근이 가능.
String user = "SUZI";
String password = "A123";
 
Class.forName("oracle.jdbc.driver.OracleDriver");//다른클래스의 정보를 읽어올 때 사용
//oracle.jdbc.driver위치의 OracleDriver클래스를 읽어온다.
 
dbConn = DriverManager.getConnection(url, user, password);
//DriverManager를 통해서 내가 지정한 url, user, password로 스트림을 생성해서 dbConn에 담는 것
 
} catch (Exception e) {
System.out.println(e.toString());
}
}
return dbConn;
}
 
 
public static void close(){
 
if(dbConn!=null){//null이 아니면 연결되어 있는 상태
 
try {
 
if(!dbConn.isClosed()){
dbConn.close();
}
 
} catch (Exception e) {
System.out.println(e.toString());
}
}
dbConn = null;
//파이프라인이 연결되어 있는 상태에서 연결을 끊게 되면 스트림안에 쓰레기값이 남게됨
//두번째 연결시 쓰레기값으로 인하여 adapter 오류 발생
//따라서 연결 종료시 항상 초기화를 진행해야한다.
}
}

 

DBMS 접속시 사용되는 방식 : THIN, OCI

① THIN : 바로 DB와 연결 진행, 범용성이 높다, 상대적으로 OCI보다 속도가 느림

② OCI (Oracle Call Interface)

- 특정 운영체제 내에서만 돌아가는 Native Module을 통해 DB에 연결

(각 하드웨어/소프트웨어(O/S) 별로 전용의 DB연결 프로그램을 OCI라고 부른다는 소리.)

- 하드웨어 또는 소프트웨어 전용의 Module이다 보니, Thin보다 속도가 빠르다.

 

2. 데이터베이스 연결 소스 코드 

import java.sql.Connection;

import com.db.DBConn;

public class Test1 {

public static void main(String[] args) {

 

Connection conn = DBConn.getConnection();

//디비를 찾아가서 연결해놓은 파이프라인을 conn에 할당

 

if(conn==null){

System.out.println("데이터베이스 연결 실패!!");

System.exit(0);

}

System.out.println("데이터베이스 연결 성공!!");

DBConn.close();

}

 

}

 

콘솔 실행 결과

 

3. 데이터베이스 연결 후 DML문 실행 

import java.sql.Connection;

import java.sql.Statement;

import com.db.DBConn;

public class Test2 {

public static void main(String[] args) {

 

//1.

Connection conn = DBConn.getConnection();

if(conn==null){

System.out.println("연결 실패!!");

System.exit(0);

}

 

//DB연결 방법

//1.DriverManager가 Connection을 설정

//2.Connection이 Statement를 생성(SQL구문을 실행하는 인터페이스)

//3.Statement가 query를 실행(execute)

try {

//2.

Statement stmt = conn.createStatement();

String sql;

 

//insert문

// sql = "insert into score (hak,name,kor,eng,mat) ";

// sql += "values ('222','이수지',50,20,80)";

 

//update문

// sql = "update score set name = '김태리', kor=10, eng=10, mat=10 ";

// sql += "where hak = '222'";

//delete문

sql = "delete score where hak='222'";

 

//3.

int result = stmt.executeUpdate(sql);

//executeUpdate: 잘 실행되면 1, 오류 발생시 0 을 반환한다

 

if(result==1){

System.out.println("삭제 성공!!");//이 방식으로 입력되는 데이터는 자동커밋

}

 

} catch (Exception e) {

System.out.println(e.toString());

}

DBConn.close();

}

}

 

 

콘솔 실행 결과

 

오라클 실행 결과