본문 바로가기
Backend

06월 21일 금 | SW활용 05 - 데이버베이스 연동하기

by 구라미 2019. 6. 21.

5. 데이터베이스 연동하기

이클립스에서 자바 프로젝트

Oracle DB Server 서비스 확인

 

1. 시작

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

오라클 라이브러리

ojdbc6.jar

 

https://dev.mysql.com/downloads/mysql/

https://dev.mysql.com/downloads/connector/j/

 

 

 

2. 이클립스에서 연동하기

1) 이클립스에서 시작

package jdbcOracle;

import java.sql.DriverManager;

public class Test01_DBOpen {

	public static void main(String[] args) {
		//JDBC(Java Database Connection)
		//java와 데이터베이스를 연동
		
		try{
			 
			
		//자바와 오라클DB를 연결하기 위한 클래스 필요
		//위의 클래스들을 압축해 놓은 라이브러리 
		//오라클이 제공을 해줌
		//어떤 형태로 제공하냐면 .jar
		//오라클 로그인 후 다운받으면 된다.
		//또는 오라클 설치 폴더에서 복사해서 사용
		//ojdbc6.jar
			
			//비번 변경할 때 서버 껐다 켜야한다.
			//
			
			//1) 오라클DB 연결 관련 정보
			String url ="jdbc:oracle:thin:@localhost:1521:xe"; //localhost:1521:xe 
			String user ="java0514";
			String password ="1234";
			String driver ="oracle.jdbc.driver.OracleDriver";
		
			//2)드라이버 로딩
			Class.forName(driver);
			
			//3) 오라클DB 서버 연결
			DriverManager.getConnection(url, user, password);
			System.out.println("오라클DB 서버 연결 성공!!");
		
		
		}catch(Exception e){
			System.out.println("오라클DB 연결 실패!" + e);
		}

	}//main end
}//class end

 

결과값:

오라클DB 연결 실패! java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

클래스가 없다고 한다. 이러한 결과가 뜬다. 왜 그런 것일까?

ojdbc6.jar 라이브러리 연결을 하지 않았기 때문이다.

 

2) 라이브러리 연결하기

우클릭 -> build path -> configure

라이브러리탭에서 external class folder> ojdbc6.jar

Referenced Libraries에서 불러와진 것을 확인할 수 있다.

 

이렇게 불러온 후 Refresh, validate, clean해주어야한다.

 

Validate

이렇게 해준 결과값은

오라클DB 서버 연결 성공!!

 

*서버를 닫아보기

-시작프로그램에서 stop db로 서버닫기

그러면 아까와는 다른 Exception이 발생한다.

 

3. DB에 성적데이터 확인하기

1) 성적테이블과 데이터 확인 및 삽입

어제 만들었던 SUNGJUK 테이블은 살아있으나 안에 있던 데이터가 없었다.

그래서 새로 데이터를 넣어주었다.

 

2) 이클립스에서 1행 추가하기.

package jdbcOracle;

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

public class Test02_Insert {

	public static void main(String[] args) {
		// 행추가 연습
		try{
				String url ="jdbc:oracle:thin:@localhost:1521:xe"; //localhost:1521:xe 
				String user ="java0514";
				String password ="1234";
				String driver ="oracle.jdbc.driver.OracleDriver";
				Class.forName(driver);				
				Connection con = DriverManager.getConnection(url, user, password); //Connection 인터페이스 변수를 생성하여 계정정보 넣어준다.
				System.out.println("오라클DB 서버 연결 성공!!");
				
				//4)SQL문 작성 - 자바코드랑 분별하기 위해 주로 대문자로 작성한다.
				//SQL문 종결문자 ; 를 쓰면 오류가 나기 때문에 안에 ; 쓰면 안된다.
				String sql = "";
				sql += " INSERT INTO SUNGJUK(UNAME,KOR,ENG,MAT) ";
				sql += " VALUES('김예림',90,80,50) ";
				System.out.println(sql);
				
				//5)SQL형식 변환
				PreparedStatement pstmt = con.prepareStatement(sql); //리턴형 prepareStatement다. SQL을 변환한 값을 가지는 인터페이스
				
				//6)SQL문 실생
				int result = pstmt.executeUpdate();//리턴형 int이다.
				System.out.println("실행결과:"+result); //1행이 추가되었다. 
			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}

	}//main end
}//class end

 

결과는 이렇게 1행이 추가되었다.

 

이 부분은 나중에 클래스로 만들어서 관리하게 된다.

 

 

3)StringBuilder를 사용해서 1행 추가하기

그런데 2)번과 같은 방식은 String으로 연산을 해주기 때문에 반복했을 때 성능이 떨어진다는 단점이 있다.

그래서 StringBuilder를 사용할 것이다.

package jdbcOracle;

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

public class Test03_Insert {

	public static void main(String[] args) {
		// 행추가 연습
		try{
				String url ="jdbc:oracle:thin:@localhost:1521:xe";
				String user ="java0514";
				String password ="1234";
				String driver ="oracle.jdbc.driver.OracleDriver";
				Class.forName(driver);				
				Connection con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				StringBuilder sql = new StringBuilder();
				sql.append(" INSERT INTO SUNGJUK(UNAME,KOR,ENG,MAT) ");
				sql.append(" VALUES('손승완',100,100,100) ");
				
				PreparedStatement pstmt = con.prepareStatement(sql.toString());
				
				int result = pstmt.executeUpdate();
				if(result == 0){
					System.out.println("행이 추가되지 않았습니다.");
				}else {
					System.out.println("행이 "+result+"개 추가되었습니다.");
				}

			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}

	}//main end
}//class end

 

결과값은

오라클DB 서버 연결 성공!!
행이 1개 추가되었습니다.

*페이지당 보여줄 갯수 설정할 수 있음

 

4) 빈 AVG값 UPDATE하기 

package jdbcOracle;

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

public class Test04_Update {

	public static void main(String[] args) {
		// 행수정 연습
		try{
				String url ="jdbc:oracle:thin:@localhost:1521:xe";
				String user ="java0514";
				String password ="1234";
				String driver ="oracle.jdbc.driver.OracleDriver";
				Class.forName(driver);				
				Connection con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				StringBuilder sql = new StringBuilder();
				sql.append(" UPDATE SUNGJUK ");
				sql.append(" SET AVG = (KOR+ENG+MAT)/3 ");
				//sql.append(" WHERE AVG IS NULL ");
				//sql.append(" WHERE UNAME IN ('김예림','손승완') ");
				
				PreparedStatement pstmt = con.prepareStatement(sql.toString());
				
				int result = pstmt.executeUpdate(); //UPDATE가 이루어진 행의 갯수.
				if(result == 0){
					System.out.println("행수정 실패");
				}else {
					System.out.println("행수정 성공");
				}

			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}

	}//main end
}//class end

 

테이블을 설계할 때 반드시 유일성을 보장하는 테이블이 있어야한다.

겹치지 않는 유일성 

- 주민번호

- 핸드폰번호

- 메일주소

 

DB에 관련된 클래스,인터페이스들이 있다.

 

 

5) DELETE하기와 자원반납

중간중간 자원반납을 잘해야 오류가 안생긴다.

늘 클린하게~ 어떻게 할까

package jdbcOracle;

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

public class Test05_Delete {

	public static void main(String[] args) {
		// 행삭제 연습
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try{
				String url ="jdbc:oracle:thin:@localhost:1521:xe";
				String user ="java0514";
				String password ="1234";
				String driver ="oracle.jdbc.driver.OracleDriver";
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				StringBuilder sql = new StringBuilder();
				sql.append(" DELETE FROM SUNGJUK ");
				sql.append(" WHERE UNAME = '이순재' ");
				//sql.append(" WHERE AVG IS NULL ");
				//sql.append(" WHERE UNAME IN ('김예림','손승완') ");
				
				pstmt = con.prepareStatement(sql.toString());				
				int result = pstmt.executeUpdate(); //UPDATE가 이루어진 행의 갯수.
				if(result == 0){
					System.out.println("행수정 실패");
				}else {
					System.out.println("행수정 성공");
				}

			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}finally{
				//자원반납(순서주의!!!!)
				try{
					if(pstmt!=null){pstmt.close();}
				} catch (Exception e){}
				
				try{
					if(con!=null){con.close();}
				} catch (Exception e){}
				
			}

	}//main end
}//class end

 

이순재가 삭제되었다.

 

지금까지 이렇게 연습해보았는데 사실 DB를 CMD로 열어볼일이 없다.

자바에서도 확인할 수 있다.

6) SELECT로 자료가 있는지 확인하기

package jdbcOracle;

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

public class Test06_SelectOne {

	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;
		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 UNAME,KOR,ENG,MAT,AVG "); //칼럼의 순서는 이곳에서.
				sql.append(" FROM SUNGJUK ");
				sql.append(" WHERE UNAME='황예지' ");
				//IT업계에는 DB만 다루는 개발자들이있다.
				//쿼리문을 XML문서에 작성한다.  myBATIS Framwork - 공공프로젝트에서 쓰인다.
				//SELECT는 행이 아니라 테이블이 결과다.
							
				pstmt = con.prepareStatement(sql.toString());				
				//int result = pstmt.executeUpdate(); //INSERT, UPDATE, DELETE 등을 실행할 때
				rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.
				//cursor는 불러온 값 가장 처음것을 가리킴
				//cursor : 가리키는 값
				if(rs.next()){ //cursor가 존재하는지?
					System.out.println("자료있음");
					//1)칼럼의 순서대로 접근하기,SQL 테이블 자료형 순서대로 불러온다.
					System.out.print(rs.getString(1)+" ");
					System.out.print(rs.getInt(2)+" ");
					System.out.print(rs.getInt(3)+" ");
					System.out.print(rs.getInt(4)+" ");
					System.out.print(rs.getInt(5)+" ");
					System.out.println();
					
					//2)칼럼명 (select uname, kor, ~ )
					System.out.println();
					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("AVG")+" ");
					System.out.println();
					
					
				}else{
					System.out.println("자료없음");
				}
			
			}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){}
				
			}

	}//main end
}//class end

 

결과값은

오라클DB 서버 연결 성공!!
자료있음
황예지 100 90 88 93

황예지 100 90 88 93

 

7) SELECT ALL 전체목록을 확인하기

이 이전에는 한 사람의 레코드만 확인하였다. 이번에는 전체목록을 불러볼 것이다.

package jdbcOracle;

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

public class Test07_SelectAll {

	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;
		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 UNAME,KOR,ENG,MAT,AVG "); //칼럼의 순서는 이곳에서.
				sql.append(" FROM SUNGJUK ");
				sql.append(" ORDER BY UNAME ");
									
				pstmt = con.prepareStatement(sql.toString());				
				rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.
				//cursor는 불러온 값 가장 처음것을 가리킴
				//cursor : 가리키는 값
				if(rs.next()){ //cursor가 존재하는지?
					System.out.println("자료있음");
					do{ //칼럼명으로 접근한다.
						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("AVG")+" ");
						System.out.println();
					} while(rs.next());
					
				}else{
					System.out.println("자료없음");
				}
			
			}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){}
				
			}

	}//main end
}//class end

 

do~while문을 사용해 컬럼명으로 자료를 불러왔다.

결과값:

오라클DB 서버 연결 성공!!
자료있음
강슬기 90 100 98 96 
김예림 90 80 50 73 
손승완 100 100 100 100 
윤상현 90 45 30 55 
이다희 50 60 90 67 
이보영 90 80 80 83 
이종석 70 40 20 43 
이해찬 30 30 40 33 
장준혁 90 100 98 96 
지성 50 60 30 47 
황예지 100 90 88 93 

 

8) 변수처럼 값넣기

지금까지 상수처럼 값을 넣고 불러오기 했는데 변수화하여 직접 테이블에 값을 넣어볼 것이다.

? 명령어를 사용한다.

package jdbcOracle;

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

public class Test08_Insert {

	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;
		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(" INSERT INTO SUNGJUK(UNAME,KOR,ENG,MAT,AVG) "); //칼럼의 순서는 이곳에서.
				sql.append(" VALUES(?,?,?,?,?) "); //직접 쓰는 것은 절대상수 값이다. 
				//변수처럼 쓰려면 명령어 ?을 사용한다. ?는 특정값으로 대입할 수 있는 표식이다.
				//?의 갯수와 값 갯수가 같아야 한다. 순서도 중요하다.
				//'?'은 String이니까 조심.
				pstmt = con.prepareStatement(sql.toString());
				// ?순서와 ?에 들어갈 자료형 주의
				pstmt.setString(1, "김다현");//1->첫번째 ?, UNAME칼럼
				pstmt.setInt(2, 78); //2->두번째 ?, KOR칼럼
				pstmt.setInt(3, 90); //3->세번째 ?, ENG칼럼
				pstmt.setInt(4, 100); //4->네번째 ?, MAT칼럼
				pstmt.setInt(5, (78+90+100)/3); //5->다섯번째 ?, AVG칼럼
								
				int result = pstmt.executeUpdate();
				if(result == 0){
					System.out.println("행이 추가되지 않았습니다.");
				}else {
					System.out.println("행이 "+result+"개 추가되었습니다.");
				}
			
			}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){}
				
			}

	}//main end
}//class end

변수처럼 쓰려면 명령어 ?을 사용한다. ?는 특정값으로 대입할 수 있는 표식이다.
?의 갯수와 값 갯수가 같아야 한다. 순서도 중요하다.
'?'은 String이니까 조심.

 

결과값은

오라클DB 서버 연결 성공!!
행이 1개 추가되었습니다.

 

CMD에서 보니

값이 잘 들어가졌다.

 

 

연습문제 1) '김다현'의 국영수 점수와 평균 점수를 수정하시오.

 

package jdbcOracle;

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

public class Test09_Test {

	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;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{	
				String uname ="김다현";
				int kor =83, eng=100, mat=90;
				int avg = (kor+eng+mat)/3;
			
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				//DML로 조작하는 부분.
				StringBuilder sql = new StringBuilder();
				sql.append(" UPDATE SUNGJUK ");	
				sql.append(" SET KOR=?, ENG=?, MAT=?, AVG=? ");	
				sql.append(" WHERE UNAME=? "); //명령어가 되어야하기 때문에 ?는 따옴표 없이.								
				pstmt = con.prepareStatement(sql.toString());
				pstmt.setInt(1, kor);
				pstmt.setInt(2, eng);
				pstmt.setInt(3, mat);
				pstmt.setInt(4, avg);
				pstmt.setString(5, uname);
				
				int count = pstmt.executeUpdate(); //UPDATE가 이루어진 행의 갯수.
				if(count == 0){
					System.out.println("행수정 실패");
				} else {
					System.out.println("행수정 성공");
				}
			
			}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){}
				
			}

	}//main end
}//class end

 

 

혹시 확인할 때 제대로 안돌아가면 CMD끄고 해보기

 

 

 

댓글