초급의 끄적거림

[Oracle] JDBC 오라클 DB와 자바 연동 / 라이브러리 연결 본문

DB

[Oracle] JDBC 오라클 DB와 자바 연동 / 라이브러리 연결

codingD 2019. 8. 6. 17:13

자바를 이용해서 많이 하는 것 : 자바를 이용해서 데이터베이스 연동 (필수) 

[라이브러리 연결 방법]

 - 필요한 라이브러리(.jar 파일) 가 있는 위치를 확인해두고 시작할 것. 

 ① Package Explorer - 라이브러리를 연결하고자하는 패키지 우클릭 - Build Path - Configure Build Path

 

 

② 외부에 있는 jar를 가져오기 때문에 'Add External JARs...' 선택 → 미리 찾아둔 경로의 .jar 파일을 등록

 

 

 

  성적프로시저에 만든 것들을 JDBC로 만드는 것.  

  성적프로시저가 있는 링크 

  https://ninearies.tistory.com/34

 

 

[Test01_Insert]

 - Test01_Insert를 복사해서 Test02~03 만들기

package oop0805;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

public class Test01_Insert {

	public static void main(String[] args) {
		// sungjuk 테이블 행추가 연습
		
		//오라클DB서버 접근 기본 정보
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";    //포트번호 1521, 본인지칭 아이피 : 27.0.0.1 이나 localhost
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
		
		Connection con=null; 				//DB연결
		PreparedStatement pstmt=null;    //SQL변환
		ResultSet rs=null;						//select 문 조회
		
		try{
			//1) 드라이버 로딩
			Class.forName(driver);
            
			//2) DB연결
			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
            
			//3) SQL문 작성
			StringBuilder sql=new StringBuilder();
			String uname="박지성";
			int kor=50, eng=60, mat=65;
			int tot=kor+eng+mat;
			int aver=tot/3;
			String addr="Suwon";
			
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, tot, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, ?, sysdate)");

			//4) SQL문 변환
			pstmt=con.prepareStatement(sql.toString());
			pstmt.setString(1, uname);
			pstmt.setInt(2, kor);
			pstmt.setInt(3, eng);
			pstmt.setInt(4, mat);
			pstmt.setInt(5, tot);
			pstmt.setInt(6, aver);
			pstmt.setString(7, addr);
            
			//5) SQL문 실행
			int cnt=pstmt.executeUpdate();
			if(cnt==0){   //cnt가 0이 됐다는 것은 행추가를 하지 못했다는 의미
				System.out.println("행추가 실패TT");
			}else{
				 System.out.println("~행추가 성공~");
			}//if end
			
		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(pstmt!=null){pstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end

	}//main() end
}//class end

 

 

 

[Test02_SelectAll]

package oop0805;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

public class Test02_SelectAll {

	public static void main(String[] args) {
		// sungjuk 테이블 행보기 연습
		
		//오라클DB서버 접근 기본 정보
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe"; 
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
	
		
		Connection con=null; 	
		PreparedStatement pstmt=null;  
		ResultSet rs=null;				
		
		try{
        	Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");

			StringBuilder sql=new StringBuilder();
            
            sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate");
            sql.append(" FROM sungjuk ");
            sql.append(" ORDER BY sno DESC ");
            
            pstmt=con.preparStatement(sql.toString());
            rs=pstmt.executeQuery();   //SQL문을 실행해서 rs에 담기(실제 데이터 반환)
            
                       if(rs.next()){   //rs에 커서가 존재하는가
            	do{
            		System.out.print(rs.getInt("sno")+" ");
            		System.out.print(rs.getString("uname")+" ");
            		System.out.print(rs.getInt("kor")+" ");
            		System.out.print(rs.getInt("eng")+" ");
            		System.out.print(rs.getInt("mat")+" ");
            		System.out.print(rs.getInt("tot")+" ");
            		System.out.print(rs.getInt("aver")+" ");
            		System.out.print(rs.getString("addr")+" ");
            		System.out.print(rs.getString("wdate")+" ");
            		System.out.println();
            	}while(rs.next());
            }else{
            	System.out.println("!자료없음!");
            }//if end
            
		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(pstmt!=null){pstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end
		
	}//main() end
}//class end

 

 

 

[Test03_ProcedureInsert]

  - sql developer 에서 미리 작성한 sungjukInsert.sql 프로시저를 호출할 것

한 열이 추가 되었음을 알림
22 알라딘이 추가되었음을 확인

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

public class Test03_ProcedureInsert1 {

	public static void main(String[] args) {
		// sungjuk_ProcedureInsert
		
	
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
        Connection con=null;  			//DB연결
        //프로시저 호출관련 인터페이스
        CallableStatement cstmt=null;
        ResultSet rs=null;          	//select 문 조회 
            
        try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();  
            
            //프로시저 호출형식
            //con.prepareCall("{call 프로시저이름 (?, ?, ?)}")
            //→ sql 문에 가면 매개변수가 uname, kor, eng, mat, addr 총 다섯개가 있음을 알 수 있음 그 결과 물음표도 5개
            sql.append(" {call sungjukInsert(?, ?, ?, ?, ?)} " );
            
            cstmt=con.prepareCall(sql.toString());
            cstmt..setString(1, "알라딘");
			cstmt.setInt(2, 90);
			cstmt.setInt(3, 75);
			cstmt.setInt(4, 80);
			cstmt.setString(5, "Seoul");
            
            int cnt=cstmt.executeUpdate();   // executeUpdate : 작용한 열의 개수를 나타내는 정수 executeQuery()는 실제데이터를 반환하는 반면, executeUpdate()는 엡뎃한 건수를 반환
			System.out.println(cnt);
            
		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end
		

	}//main() end
}//class end            

 

 

 

 

[Test04_ProcedureUpdate]

 - 존재하고 있는 내용을 바꿔줘야하기 때문에 sno 의 번호가 존재하는 것을 SelectAll 에서 전체목록 확인 후 찾아오기

1열이 수정되었음을 알림
22가 자스민으로 수정되었음을 확인 가능

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

public class Test04_ProcedureUpdate {

	public static void main(String[] args) {
		// sungjuk_ProcedureUpdate
		
	
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
		Connection con=null; 				//DB연결
		//프로시저 호출관련 인터페이스
		CallableStatement cstmt=null;
		ResultSet rs=null;						//select 문 조회
		
		try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();
            
            sql.append(" {(call sungjukUpdate(?, ?, ?, ?,?)} ");
            
            cstmt=con.prepareCall(sql.toString());
			cstmt.setString(1, "자스민");
			cstmt.setInt(2, 65);
			cstmt.setInt(3, 95);
			cstmt.setInt(4, 70);
			cstmt.setString(5, "Jeju");
			cstmt.setInt(6, 22);
			
			int cnt=cstmt.executeUpdate(); 
			System.out.println(cnt);
           
            
        }catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end

	}//main() end
}//class end    

 

 

 

[Test05_ProcedureDelete]

 - sno 22에 해당하는 '자스민' 지우기

1열이 삭제되었음을 알림
22 자스민이 삭제되었음을 확인 가능

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

public class Test05_ProcedureDelete {

	public static void main(String[] args) {
		// sungjuk_ProcedureDelete
		
	
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
		Connection con=null; 				//DB연결
		//프로시저 호출관련 인터페이스
		CallableStatement cstmt=null;
		ResultSet rs=null;						//select 문 조회
		
		try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();
            
            sql.apppend(" {call sungjukDelete(?)} ");
            cstmt=con.prepareCall(sql.toString());
            cstmt.setInt(1, 22);
            
            int cnt=cstmt.executeUpdate();
            System.out.println(cnt);
            
 		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end
		

	}//main() end
}//class end           
			

 

 

 

[Test06_ProcedureList]

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

import oracle.jdbc.OracleTypes;

public class Test06_ProcedureList {

	public static void main(String[] args) {
		// 프로시저를 이용한 sungjuk 테이블 목록연습
		
	
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
		Connection con=null; 		
		CallableStatement cstmt=null;
		ResultSet rs=null;				
		
		try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();
            sql.append(" {call sungjukList(?)} ");
            //첫번째 ? 인덱스
            //OracleTypes.CURSOR 조회하고자하는 DB
            

		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end
	
	}//main() end
}//class end

 

 

 

[Test07_ProcedurePaging]

  - 전체 목록을 확인하고 무엇을 찾았는지 비교확인할 것

 

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

import oracle.jdbc.OracleTypes;

public class Test07_ProcedurePaging {

	public static void main(String[] args) {

		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
		Connection con=null; 		
		CallableStatement cstmt=null;
		ResultSet rs=null;				
		
		try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();
			sql.append("{call sungjukPaging(?, ?, ?)}");
			cstmt=con.prepareCall(sql.toString());
			//첫번째 ?  인덱스
			//OracleTypes.CURSOR 조회하고자 하는 DB
			cstmt.registerOutParameter(1, OracleTypes.CURSOR);  //프로시저에 v_cursor가 1번에 있기 때문에 1 
			cstmt.setInt(2, 7);  //rnum=7 에서
			cstmt.setInt(3, 11);  //rnum=11까지
			cstmt.execute(); //실행
			
			 
			 //1이 의미하는 것 : (1, OracleTypes.CURSOR);
			rs=(ResultSet) cstmt.getObject(1);  //resultset 형태로 만들어서 rs에 넣어라
			if(rs.next()){
				System.out.println("!자료있음!");
				do{
            		System.out.print(rs.getInt("sno")+" ");
            		System.out.print(rs.getString("uname")+" ");
            		System.out.print(rs.getString("addr")+" ");
 
            		System.out.println();
            	}while(rs.next());
			}else{
				System.out.println("자료없음TT");
			}//if end
		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end
		
		
	}//main() end
}//class end

 

 

 

[Test08_ProcedureSearch]

package oop0805;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.tree.ExpandVetoException;

import oracle.jdbc.OracleTypes;

public class Test08_ProcedureSearch {

	public static void main(String[] args) {
		// 프로시저를 이용한 sungjuk 테이블 검색연습
		
	
		String url		 ="jdbc:oracle:thin:@localhost:1521:xe";   
		String user		 ="java0514";
		String password="1234";
		String driver     ="oracle.jdbc.driver.OracleDriver";
			
		Connection con=null; 		
		CallableStatement cstmt=null;
		ResultSet rs=null;				
		
		try{
			Class.forName(driver);

			con=DriverManager.getConnection(url, user, password);
			System.out.println("~오라클DB서버 연결 성공~");
			
			StringBuilder sql=new StringBuilder();
            sql.apped("{call sungjukSearch(?, ?, ?)}");
            cstmt=con.prepareCall(sql.toString());
            
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);  //프로시저에 v_cursor가 1번에 있기 때문에 1 
            cstmt.setInt(2, 1);
            cstmt.setString(3, "화");
            cstmt.execute();          //실행
            rs=(ResultSet) cstmt.getObject(1);
            if(rs.next()){
              System.out.println("!자료있음!");	
				do{
            		System.out.print(rs.getInt("sno")+" ");
            		System.out.print(rs.getString("uname")+" ");
            		System.out.print(rs.getString("addr")+" ");
 
            		System.out.println();
            	}while(rs.next());
			}else{
				System.out.println("자료없음TT");
            } //if end            
		}catch(Exception e){
			System.out.println("!실패!" + e);
		}finally{  //자원반납
			try{
				if(rs!=null){rs.close();}
			}catch(Exception e){}
			try{
				if(cstmt!=null){cstmt.close();}
			}catch(Exception e){}
			try{
				if(con!=null){con.close();}
			}catch(Exception e){}
		}//try end

	}//main() end
}//class end            

'DB' 카테고리의 다른 글

[데이터 유형] CHAR와 VARCHAR 비교  (0) 2020.03.21
[SQL] JOIN의 종류  (0) 2020.01.20
[mySQL] Error code [1046] 원인과 해결  (0) 2019.12.03
[관계형 데이터베이스] 기본, 모델링 개념  (0) 2019.08.07
Comments