무작정 개발.Vlog

[JDBC] 초기 설정, Eclipse랑 오라클DB 연동하기

by 무작정 개발
반응형
★2022.02.04(30일 차)

오늘 오전에는 PL/SQL을 마무리하고 오후에는 JDBC 수업을 시작했다!

 

 

 

 

오늘의 수업 내용

 

 

 

JAVA랑 ORACLE_DB 연동 전 초기 작업

 

연동하기 전 사전 작업

 

1. 관리자 계정으로 로그인 -> 사용자 생성 및 권한 부여 -> 생성된 계정으로 로그인 -> 테이블 생성

 

 

2. 오라클 파일에서 쭉 들어가면 ojdbc6이 있다. 이 파일을 java jdk, jre에 넣어줘야 함.

2. 오라클 파일에서 쭉 들어가면 ojdbc6이 있다. 이 파일을 java jdk, jre에 넣어줘야 함.
2. 오라클 파일에서 쭉 들어가면 ojdbc6이 있다. 이 파일을 java jdk, jre에 넣어줘야 함.

 

3. 경로에 ojdbc6 파일 넣기

경로 1 : C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext
경로 1 : C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext

경로 1 : C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext

 

경로 2 : C:\Program Files\Java\jre1.8.0_311\lib\ext

경로 2 : C:\Program Files\Java\jre1.8.0_311\lib\ext
경로 2 : C:\Program Files\Java\jre1.8.0_311\lib\ext

 

OJDBC6 파일을 열면 하단과 같이 보인다. 오픈 API가 아니기 때문에 소스가 보이지 않고 CLASS가 존재하는 것을 알 수 있다. 

 

OracleDriver.class의 위치 : oracle.jdbc.driver.OracleDriver 클래스

OracleDriver.class의 위치 : oracle.jdbc.driver.OracleDriver 클래스
OracleDriver.class의 위치  : oracle.jdbc.driver.OracleDriver 클래스

 

 

4. 파일을 넣고 이클립스에 조회해보면 라이브러리에 반영된다. 

4. 파일을 넣고 이클립스에 조회해보면 라이브러리에 반영된다.
4. 파일을 넣고 이클립스에 조회해보면 라이브러리에 반영된다. 4. 파일을 넣고 이클립스에 조회해보면 라이브러리에 반영된다.

 

이렇게 하면 초기 작업이 끝난다.

 


JAVA 랑 ORACLE 연동하기

 

  • Java에서 오라클을 찾아가는 코딩은 변함이 없다.
  • 매번 동일한 기능을 수행해야 할 땐 메서드를 생성 후, 필요할 때마다 메서드를 호출했지만        메서드로 생성하게 된다면 다른 클래스에서 사용하기 위해서는 객체 생성이 필요하다.
  • 위의 문제 때문에 DB랑 연결하려면 static으로 만들어서 쓴다. 메모리에 올려놓으면              필요할 때마다 가져다 쓴다.    (객체 생성 안 하고)
  • DB를 연결하게 되면 항상 닫아주는 작업을 넣어줘야 한다. -> close)() 

 

DB 연결하는 코드

 

package com.db;
//DB를 연결하기위한 클래스
import java.sql.Connection;
import java.sql.DriverManager;
//DB는 여러 개 연결 가능함.

public class DBConn {
	//이렇게하면 Connection형 dbConn을 반환해준다.
	//dbConn에 파이프라인을 넣을건데 그 파이프라인이 Connection이다.
	private static Connection dbConn; // DB연결자를 담을 수 있는 변수
	
	//메서드
    //static을 써서 이미 메모리상에 있어 받기만하면되니 get을 써줘야함
	public static Connection getConnection() { 
		
         //연결할때 try-catch는 반드시 써야함. / NULL일 경우 연결되지않은 상태
		if(dbConn == null) {
			
			try {	
				//type4를 thin으로 표시함 / @뒤에는 자신의ip주소 /오라클 기본포트:1521/내가쓰는오라클버전은 xe
				String url = "jdbc:oracle:thin:@localhost:1521:xe";
				//JDBC방식으로 TYPE4형식, 해당 주소를 가진 1521포트의 TestDB로 연결
				//노트북으로 진행할 때는 서버가 아니므로 IP주소가 아닌 LOCALHOST를 쓴다.
				//동적으로 클래스를 로딩한다. 좀 더 빠른 접근 가능
				String user = "suzi";
				String pwd = "a123"; // 여기까지가 접속 정보 
				
				//다른 클래스의 정보를 읽어올 때 사용
                // oracle.jdbc.driver위치의 OracleDriver클래스를 읽어옴
				Class.forName("oracle.jdbc.driver.OracleDriver"); 
				
				//DriverManager를 통해 내가 지정한 url,user,password로
                //스트림을 생성해서 dbConn에 담는 것
				dbConn = DriverManager.getConnection(url, user, pwd); //읽어와서 dbConn에 넣는다.
				
				
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}
		
		return dbConn; //처음부터 여기까지가 DB연결자
	}
	
	
	//DB를 사용하면 끝내는 애가 있어야한다.
	public static void close() {
		
		if(dbConn != null) { // null이 아니면 연결되어 있는 상태
			
			try {
				
				if(!dbConn.isClosed()) { //만약에 dbConn이 닫혀있지 않으면
					dbConn.close(); // 닫아줘라
				}
				
			} catch (Exception e) {

				System.out.println(e.toString());
			}
		} //닫으면 찌꺼기가 반드시 남기 때문에 dbConn=null;을 한다 안하면 아답터 오류가 뜬다.
		
		dbConn=null; //이걸 안하면 두번째 연결부터 오류가 뜬다.
		
		//파이프라인이 연결되어 있는 상태에서 연결을 끊게 되면 스트림 안에 쓰레기값이 남게된다.
		//두번 째 연결 시 쓰레기값으로 인해 adapter 오류 발생
		//그래서 연결 종료 시 항상 초기화를 진행해야 한다.
	}

}

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

1. THIN : 바로 DB와 연결 진행/범용성이 높다/상대적으로 OCI보다 속도가 느리다.

 

2. OCI(Oracle Call Interface) : 특정 운영체제 내에서만 돌아가는 Native Module을 통해

DB에 연결 하드웨어 또는 소프트웨어 전용의 Module이다 보니, THIN보다 속도가 빠르다.

 

 

DB 연결 코드

 

package com.conn;

import java.sql.Connection;

import com.db.DBConn;

public class Test1 {

	public static void main(String[] args) {
		
		//conn에는 DBConn.getConnection();의 해쉬코드가 들어가있음
		//DB를 찾아가서 연결해놓은 파이프라인을 conn에 할당
		Connection conn = DBConn.getConnection();
		
		if(conn==null) {
			System.out.println("데이터베이스 연결 실패!!");
			System.exit(0);
		}
		
		System.out.println("데이터베이스 연결 성공!!");
		DBConn.close(); //DB연결 확인했으니 close로 닫는다.

	}

}

DB 연결 성공
DB 연결 성공

위의 결과가 나오면 성공적으로 DB 연결이 된 것이다!

 

 

DB 연결 후 DML(INSERT, UPDATE, DELETE, SELECT) 실행

 

package com.conn;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.db.DBConn;
//Statement 종류
//Statement, PreparedStatement, CallableStatement (Prepared를 자주씀)

public class Test2 {

	public static void main(String[] args) {
		
		Connection conn = DBConn.getConnection();
		
		//DB연결방법
		//1. DriverManager가 Connection을 생성
		//2. Connection이 Statement를 생성 (sql구문을 실행하는 인터페이스) - statement는 종류가 3가지
		//3. Statement가 쿼리(query)를 실행(execute)
		
		if(conn==null) { //만약에 연결이 안된 경우
			System.out.println("데이터베이스 연결 실패!!");
			System.exit(0);
		}
		
		try {
			//java.sql
			Statement stmt = conn.createStatement(); //Connection이 Statement를 생성한다.
			String sql;
			
			/*
			//insert
			sql = "insert into score (hak,name,kor,eng,mat) "; //줄바꿈할땐 한칸 띄어야함
			//sql+= "values ('111','배수지',50,70,40)";
			sql+= "values ('222','유인나',40,80,70)";
			
			int result = stmt.executeUpdate(sql);
			
			if(result==1) { //1이면 잘 실행된 것 0이오면 실행이 안된것
				System.out.println("추가 성공!!");
			}
			*/
			
			/*
			//update
			sql = "update score set name='한지민', kor=100, eng=100, mat=100 ";
			sql+= "where hak='111'";
			
			int result = stmt.executeUpdate(sql);
			
			if(result==1) { //1이면 잘 실행된 것 0이오면 실행이 안된것
				System.out.println("수정 성공!!");
			}
			*/
			
			/*
			//delete
			sql = "delete score where hak=222"; //학번이 222인 데이터를 지운다
			
			int result = stmt.executeUpdate(sql);
			
			if(result==1) { //1이면 잘 실행된 것 0이오면 실행이 안된것
				System.out.println("삭제 성공!!");
			}
			*/
			
			//select
			ResultSet rs = null;
			
			sql = "select hak,name,kor,eng,mat from score";
			
			rs = stmt.executeQuery(sql); // rs를 보고 쿼리를 인식해줌
			
			String hak,name; // 담을 그릇
			int kor,eng,mat; // 담을 그릇
			
			//데이터는 3개지만 실제로는 데이터의 개수를 모르기때문에 while문을 써야한다.
			
			while(rs.next()) { // 데이터가 있을 때까지 반복해라
				
				hak = rs.getString("hak"); //rs에 있는 데이터 / 괄호 안에는 컬럼명/hak은 string이니 getString
				name = rs.getString(2); //컬럼명 대신 숫자를 씀/ 컬럼명:name
				kor = rs.getInt("kor");
				eng = rs.getInt(4); // 컬럼명 : eng
				mat = rs.getInt("mat");
				
				//가지고 왔으면 출력해
				System.out.printf("%5s %6s %4d %4d %4d\n", hak,name,kor,eng,mat);
				
				
			}
			
			rs.close();   //다 사용한 리소스는 꼭 닫아줘야함
			stmt.close(); //다 사용한 리소스는 꼭 닫아줘야함 / 닫는 순서는 상관 x
		
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		
		DBConn.close(); //db는 사용다하면 항상 닫아줘야한다.

	}

}

 

insert 결과

- insert 하기 전에 데이터 추가

insert 결과
insert 결과
insert 결과
insert 결과

update 결과

update 결과
update 결과

delete 결과

delete 결과
delete 결과

select 결과

select 결과
select 결과

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기