본문 바로가기
DB/Oracle

2024_06_11_화

by 알케니브 2024. 6. 11.

오늘의 코딩

ch15_ex01>>>

ojdbc6.jar
2.05MB
Create Table-EMP_DEPT_실습용 자료 생성.sql
0.01MB

  • OraDr01
    • String driver = "oracle.jdbc.driver.OracleDriver";
    • String url = jdbc:oracle:thin:@127.0.0.1:1521:xe   >>
      • 127.0.0.1 은 Localhost(이 숫자 자리에 @localhost가 들어가도 됨), 1521은 port번호, 다른 곳은 이 번호가 다를 수 있다
    • C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN
    • getConnection:
    • DriverManager:
    •  
package ch15_ex01;

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

public class OraDr01 {

	public static void main(String[] args) {
		String driver	= "oracle.jdbc.driver.OracleDriver";
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
						//jdbc:oracle:thin:: 예약어 reserved word
						//127.0.0.1: DB가 설치될 ip주소
						//			+ 오라클의 localhost
		System.out.println("Start1");
		try	{
			Class.forName(driver);
			// Oracle Driver 메모리에 올리는 것
			System.out.println("start2");
			Connection conn = DriverManager.getConnection(url, "scott","tiger");
					System.out.println("start3");
			if (conn != null)	{
				System.out.println("Success 연결 성공");
			} else {
				System.out.println("Fail");
			}
			conn.close();
		} catch (Exception e) {
			//System.out.println(e.getMessage());
			System.out.println("Error");
		}
	}

}
  • SQL>>> scott_0611
    • 왼쪽 워크시트 빈칸에 우클릭>>행번호토글 누르면 번호가 뜸
    • 예약어(reserved): INSERT, UPDATE, SET, SELECT등
    • table space에는 진짜 DB를 넣을 때 쓴다
    • row: 행, column 열
    • commit
    • Rollback은 현재 내린 명령을 원상복귀하는 명령어, 다만 commit을 하고 나면 ㄲollback이 먹히지 않음
    • 초록색 재생버튼는 한 개의 row(한 행)만 실행, 그 오른쪽의 버튼은 전체 실행
    • *:  모든 컬럼아 다 나와라
-- CRUD
INSERT INTO DEPT 
        VALUES('50','영업1팀','이대');
        
UPDATE  DEPT
SET     dname = '', LOC = '홍대'
WHERE   DEPTNO = 50
;

SELECT *
FROM    DEPT
;

DELETE  DEPT
WHERE   DEPTNO = 52
;

Select dname, loc From Dept Where deptno=51;

commit;


Select * From emp
;

 

  • SQL>>> EMP_INFO2
    • p_:파라미터(매개변수
    • --IN 값은 건드리지 않을 때 사용
    • --out:내가 호출한 환경으로 값 돌려줌 --OUT 값은 나중에 변경하고 싶을 때 사용
    • emono는 상수도 변수도 아니지만 상수라고 생각해두면 조금 편하다, 다만 다른데서 이렇게 말하지는 말것ㅎㅎ
    • dbms_output.put_line:  -- sysout. 과 같은 뜻
    •  || v_empno || CHR(10) || CHR(13)|| '줄바뀜');
      • ||: 중위연산자, java의 +와 같은 뜻
      • 10,13: 아스키코드
    •  
create or replace PROCEDURE EMP_Info2
( p_empno IN  emp.empno%TYPE,    --p_:파라미터(매개변수)        --IN 값은 건드리지 않을 때 사용
  p_ename OUT emp.ename%TYPE,   --out:내가 호출한 환경으로 값 돌려줌 --OUT 값은 나중에 변경하고 싶을 때 사용
  p_sal   OUT emp.sal%TYPE 
  )
IS
    -- %TYPE 데이터형 변수 선언
    v_empno emp.empno%TYPE;
BEGIN
        DBMS_OUTPUT.ENABLE;
        -- %TYPE 데이터형 변수사용
        SELECT empno,   ename,   sal
        INTO   v_empno, p_ename, p_sal  --위에 선언한 v_empno 변수 가져오기
        FROM   emp
        WHERE  empno = p_empno   ;
        --결과값 출력
        dbms_output.put_line( '사원번호 : ' || v_empno || CHR(10) || CHR(13)|| '줄바뀜');
        -- sysout. 과 같은 뜻       -- ||: 중위연산자, java의 +와 같은 뜻      --10,13: 아스키코드
        DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || p_ename ) ;  
        DBMS_OUTPUT.PUT_LINE( '사원급여 : ' || p_sal );
END;
  • OraInsert
    • 여기서 String은 가독성을 올리기 위해 자주 사용됨
    • Statement와 PreparedStatement, CallableStatement 모두 SQL 쿼리를 실행시킨다는 공통점이 있으나, Statement는 sql을 할당하는 시점에서 고정된 데이터를 갖는 쿼리문을 실행한다
      반면, PreparedStatement의 경우, 임의의 데이터를 ? 표로 대체하고, set~(Int, String 등)의 메소드를 통해
          임의의 데이터를 주입하여 실행할 수 있다.
    • Statement 에서도 임의의 데이터를 주입하여 실행하기 위해 Java의 + 연산자를 이용할 수도 있으나,
          해당 방식은 데이터 값으로 쿼리에 영향을 줄 수 있는 값이 주입될 경우 오류를 일으킬 수 있다.
    • SQLException
package ch15_ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraInsert {

	public static void main(String[] args) throws SQLException {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("부서번호 입력?");		String deptno	= sc.nextLine();
		System.out.println("부서명 입력?");	
		String dname	= sc.nextLine(); 	
		System.out.println("위치 입력?");			String loc	= sc.nextLine();
				
		String driver	= "oracle.jdbc.driver.OracleDriver";
		//Localhost  -> 127.0.0.1; , Port 번호: 1521 , xe(orcl)-> Service ID(Sid)
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
//혹은   String url		= "jdbc:oracle:thin:@localhost:1521:xe";
		// ex) INSERT INTO DEPT VALUES(50, '영업1팀', '이대')
		
		String sql = String.format("Insert Into dept values(%s, '%s', '%s')", deptno, dname, loc);
		System.out.println("sql->"+sql);
		Connection conn	= null;
		Statement  stmt = null;
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott", "tiger");
			stmt = conn.createStatement();
			//result Set
			int result	= stmt.executeUpdate(sql);	//executeUpdate: 수행-> execcuteQuery
								//insert 된 카운터 개수를 돌려줌
			if(result > 0) System.out.println("입력성공 ^^");
				//1이 아님, 0보다 크다 입력 필수
			else			System.out.println("입력실패 T.T");
		} catch(Exception e) {
			System.out.println(e.getMessage());
		}finally {
			if (stmt != null) stmt.close();
			if (conn != null) conn.close();
				
		}
		sc.close();
	}

}

 

  • OraSelect01
    • String sql = "Select dname, loc From Dept Where deptno=" +deptno; >> dname과 loc자리를 이용해 교체 가능
      • 유일성(=유니크)를 보장하기 때문에 한 줄만 나온다
    • String loc = rs.getString("loc"); // String loc = rs.getString(2); >> 괄호 안에는 column명을 넣어도 되고 column의 순서를 아라비아 숫자로 넣어도 된다
package ch15_ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraSelect01 {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("부서코드를 입력하세요");
		int		deptno	= sc.nextInt();
		String driver	= "oracle.jdbc.driver.OracleDriver";
		// Localhost -> 127.0.0.1; , Port 번호:1521  , xe(orcl)-> Service ID(Sid)
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql 		= "Select dname, loc From Dept Where deptno=" +deptno;
		Connection conn	= null;	//DB
		Statement  stmt = null; //Sql
		ResultSet  rs	= null; //Select
		//select로 쓸 때 그 값을 result에 저장해 두어라
		System.out.println("sql->" + sql);
		
		try	{
			Class.forName(driver);	//Driver
			conn	= DriverManager.getConnection(url, "scott","tiger");
			stmt	= conn.createStatement();	//stmt
			rs		= stmt.executeQuery(sql);	//SQL Select
			//select를 입력했을 경우 result를 반드시 써야함
			//rs Row
			if (rs.next())	{
				String dname	= rs.getString("dname");	//rs.getString(1)	<---dname
				String loc		= rs.getString("loc");		//rs.getString(2)	<---loc
			//	String loc		= rs.getString(2); //column명을 넣어도 되고 순서를 넣어도 됨
				System.out.println("부서코드 :" + deptno);
				System.out.println("부서명 :" + dname);
				System.out.println("위치 :" + loc);
			}
			else {
				System.out.println("자료가 없습니다");
			}
		
		} catch(Exception e ) {
			System.out.println(e.getMessage());
		} finally {
			if( rs != null)	rs.close();
			if( stmt != null) stmt.close();
			if( conn != null) conn.close();
		}
		sc.close();

	}

}

 

  • OraSelect02
    • 선언을 파악하기 위해 + multi row이기 때문에 do-while문을 사용, row가 한 줄이어도 함께 쓰는 row는 multi가 될 가능성을 배제해서는 안되기 때문에 do-while문 사용
package ch15_ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

public class OraSelect02 {

	public static void main(String[] args) throws SQLException {
		String driver	= "oracle.jdbc.driver.OracleDriver";
		// Localhost -> 127.0.0.1; , Port 번호:1521  , xe(orcl)-> Service ID(Sid)
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql		= "Select * From emp";
		Connection conn = null;		//DB연결
		Statement  stmt	= null;;	//Sql문장
		ResultSet  rs	= null;		//Rdsult Set
		System.out.println("사원명단");
		System.out.println("사원코드\t 사원명\t 업무\t\t 급여\t 일자");
		System.out.println("==========================================");
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott","tiger");
			stmt = conn.createStatement();
			rs	 = stmt.executeQuery(sql);
			if (rs.next()) {		
				do {
					int		empno	= rs.getInt(1);
					String  ename	= rs.getNString(2);
					String 	job		= rs.getString(3);
					int		sal		= rs.getInt("sal");
					Date	date	= rs.getDate("hiredate");
					if		(job.length() > 7) System.out.printf("%d\t%s\t%s\t%d\t%TF\n", empno, ename, job, sal, date);
					
					else System.out.printf("%d\t%s\t%s\t\t%d\t%TF\n",empno, ename, job, sal, date);
					
				}while (rs.next());	//multi row이기 떄문에 do-while문 사용		//row단위(한 줄)로 이동,  향상형 for문과 비슷함
			}
			else {
				System.out.println("data No");
			}
			
		}catch(Exception e)	{
			System.out.println(e.getMessage());
		}finally {
			if (rs	!= null) rs.close();
			if (stmt!= null) stmt.close();
			if (conn!= null) conn.close();
		}
		
		

	}

}

 

  • OraPrepare
    • PreparedStatement, CallableStatement의 키워드: Secure Coding(보안) & 가독성
    • PreparedStatement: 문장을 준비해 놓을 때 씀, 가독성이 뛰어남, 긴 코드를 정리할 때 좋음, 보안유지가 우수함
    •  
package ch15_ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class OraPrepare {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("입력할 Oracle 부서코드 ?");	 String deptno	= sc.nextLine();
		System.out.println("입력할 Oracle 부서명 ?");   String dname	= sc.nextLine();
		System.out.println("입력할 Oracle 근무지 ?");	 String loc		= sc.nextLine();
		
		Connection conn = null;
		PreparedStatement pstmt = null;	
		//PreparedStatement: 문장을 준비해 놓을 때 씀
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql		= "Insert Into dept values(?, ?, ?)";
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott","tiger");	//sql추가
			pstmt = conn.prepareStatement(sql);
			//PreparedStatement:가독성이 뛰어남, 긴 코드를 정리할 때 좋음, 보안유지가 우수함
			pstmt.setString(1, deptno);
			pstmt.setString(2, dname);
			pstmt.setString(3, loc);
			//물음표가 세 개니까 코드도 세 줄
			//result는 작업에 성공한 갯수
			int result = pstmt.executeUpdate();
			if(result > 0) System.out.println("OraPrepare 입력성공 ^^");
			else			System.out.println("OraPrepare 입력실패 T.T");
		} catch(Exception e)	{
			System.out.println(e.getMessage());
			
		} finally {
			if (pstmt != null) pstmt.close();
			if (conn != null) conn.close();
		}
		sc.close();
		
		
	}

}

 

  • OraProc01
    • CallableStatement: Procedure 호출시 사용하는 인터페이스
    • CallableStatement의 경우, SQL 데이터베이스 내의 프로시저 객체를 실행시킬 때 사용하는 것으로, 기본적으로 그 쿼리문은 {CALL 프로시저_이름} 형태로 되어있다.
      그러나 out 매개변수가 있을 경우 {? = CALL 프로시저_이름} 의 형태로 쿼리문을 작성하는데, 이 out 매개변수는 registerOutParameter(물음표 순서, 데이터베이스의 데이터 타입); 메소드를 통해 Java에서 그 값을 이용할 수 있다.
package ch15_ex01;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class OraProc01 {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("입력할 Oracle 부서코드 ?");	 String deptno	= sc.nextLine();
		System.out.println("입력할 Oracle 부서명 ?");   String dname	= sc.nextLine();
		System.out.println("입력할 Oracle 근무지 ?");	 String loc		= sc.nextLine();
		
		Connection			conn	= null;	
		CallableStatement	cs		= null;
		//CallableStatement: Procedure 호출시 사용하는 인터페이스
		String driver	= "oracle.jdbc.driver.OracleDriver";
		// Localhost -> 123.0.0.1; , Port 번호:1521, xe(orcl) -> Service Id(Sid)
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		
		String sql		= "{call dept_Insert(?, ?, ?)";
					//call이 Procedure을 호출
				
		try {
			Class.forName(driver);
			conn	= DriverManager.getConnection(url, "scott","tiger");
			cs		= conn.prepareCall(sql);
            			//preparecall로 CallableStatement를 호출
			cs.setString(1, deptno);
			cs.setString(2, dname);
			cs.setString(3, loc);
			int result = cs.executeUpdate();
			if ( result > 0) System.out.println("Oracle CallableStatement 입력성공 ^^");
			else			System.out.println("Oracle CallableStatement 입력실패 T.T");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if( cs		!= null ) cs.close();
			if( conn	!= null ) conn.close();
		}
		
		sc.close();
		

	}

}
  • SQL>>>프로시저>>DEPT_INSERT
create or replace Procedure Dept_Insert
( 
 p_deptno  in dept.deptno%type, --변수를 전환해도 재컴파일 할 필요가 없음
 p_dname   in dept.dname% type,
 p_loc     in dept.loc%Type
 )
Is
begin  
    Insert into dept values(p_deptno , p_dname, p_loc);
    commit; --진짜로 값을 넣을지 말지는 commit를 만난 후 결정됨
End;

 

  • OraProc02
    • 안에 넣을 것은 in선언, 밖으로 던질 것은 out선언
package ch15_ex01;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class OraProc02 {

	public static void main(String[] args) throws SQLException {
		Scanner sc	= new Scanner(System.in);
		System.out.println("정보가 궁금한 사람 사번");
		int		empno 	= sc.nextInt();
		String driver	= "oracle.jdbc.driver.OracleDriver";;
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql		= "{call emp_Info2(?, ?, ?)";
		Connection conn = null;
		CallableStatement cs = null;
		
		try {
			Class.forName(driver);
			conn= DriverManager.getConnection(url,"Scott","tiger");
			cs = conn.prepareCall(sql);
			cs.setInt(1, empno);
			cs.registerOutParameter(2, java.sql.Types.VARCHAR);
			cs.registerOutParameter(3, java.sql.Types.INTEGER);
			cs.executeQuery();
			String	ename	= cs.getString(2);
			int		sal		= cs.getInt(3);
			System.out.println("사번 :" + empno);
			System.out.println("이름 :" + ename);
			System.out.println("급여: " + sal);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (cs	!= null) cs.close();
			if (conn!= null) conn.close();
		}
			
			
		}

	}

 


수업교재 18] JDBC⭐⭐⭐⭐⭐(프로젝트 필수템)

1. 데이터베이스란?

  • 연관된 데이터들의 묶음을 데이터베이스라고 함
  • 데이터베이스에서는 정보를 저장하기 위해서 테이블을 사용함
  • 테이블은 표처럼 볼 수 있도록 Row(행,가로줄), column(열,세로줄)으로 구성됨

2. JDBC 프로그래밍

1. JDBC(Java Database Connectivity)

  • 자바 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나, 반대로 데이터베이스에 저장된 데이터를 자바 코드 레벨에서 사용할 수 있도록 해주는 자바에서 제공하는 표준 사양
  • 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고받을 수 있게 해주는 프로그래밍 인터페이스
  • 자바 데이터베이스 프로그래밍 API라고도 할 수 있음
  • 동작흐름: JAVA 애플리케이션 => JDBC API => JDBC 드라이버 => 데이터베이스
    Java 애플리케이션에서 JDBC API를 이용해 적절한 데이터베이스 드라이버를 로딩한 후, 데이터베이스와 상호작용시킴

2. JDBC 드라이버

  • MySql 또는 Oracle 드라이버를 자바가 설치되어 있는 폴더에 복사해서 사용
  • 종류: OJDBC6.JAR, mysql-connector-j-8.0.33.jar

3 .⭐⭐⭐⭐⭐JDBC 프로그래밍 단계 및 Class(이 부분이 JDBC 통틀어서 제일 중요함)

JDBC 프로그래밍 단계 및 Class

아래의 과정은 Logic이 아닌 고정된 절차!

Class.forName(driver);
	Connection conn = DriverManager.getConnection(url,"scott","tiger");
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);\
    
    
    rs.close();
	stmt.close();
	conn.close();
  1. JDBC 드라이버 로드
    • System.setProperty⭐⭐⭐
      • setProperty() 메서드를 호출해서 JDBC 드라이버의 시스템 속성을 설정하여 드라이버를 로딩함
    • Class.forName⭐⭐⭐
      • 인터페이스 드라이버를 구현하는 작업
      • forName을 이용해서 드라이버를 로딩하면 객체가 생성되고, DriverManager에 등록됨
      • Driver 클래스를 찾지 봇할 경우, ClassNotFoundException 예외가 발생하니 반드시 예외처리를 해야함
      • 사용방법: Calss.forName("com.mysql.jdbc.Driver")
  2. 데이터베이스 연결(Connection 객체 생성)
    • Connection
      • 데이터베이스를 연결해 작업을 수행할 수 있도록 만들어주는 중요한 객체, 어떤 SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야함
      • 특정 데이터 원본과 연결된 커넥션을 나타내며, 특정한 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 생성할 때 사용함
      • DriverManager 클래스의 static 메서드인 getConnection()을 호출해야함
      • 사용방법: Connection con = DriverManager.getConnection(url, uid, pwd); 으로  Connection 객체를 생성함
        • url: 관계형 데이터베이스 엔진에서의 위치
        • uid:사용자 계정(ex. scott)
        • pwd: 사용자 패스워드(ex.tiger)
    • DriverManager
      • 데이터 원본에 JDBC 드라이버를 통해 Connection을 만드는 역할을 함
      • Class.forName()메서드를 통해서 생성됨
      • DriverManager 클래스의 모든 메서드는 static이기 때문에 반드시 객체를 생성시킬 필요가 없음
      • DriverManager 클래스는 Connection 인터페이스의 구현 객체를 생성하는데 getConnection() 메서드를 사용함
  3. Statement 생성
    • Statement
      • Statement 인터페이스는 Connection 객체를 통해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메서드 집합을 정의함
      • Statement 객체는 Statement 인터페이스를 구현한 객체로, 항상 인수가 없는 Connection 클래스의 CreateStatement() 메서드를 호출함으로서 얻어짐
      • 단순한 질의문을 사용할 경우에 좋음
        Statement 객체를 생성하면 Statement 객체의 exequteQuery() 메서드를 호출하여 SQL 질의를 실행시킬 수 있기 때문
      • 사용방법: Statement stmt = con.createStatement(); 
      • Statement 객체로 쿼리문 수행하는 법
        • select문과 같이 결과가 있는 쿼리문인 경우: executeQuery() 메서드 사용
        • insert, update, delete문과 같이 내부적으로는 어떤 변화가 있지만 결과가 없는 경우: executeUpdate()메서드 사용 
          •  사용방법: ⭐⭐String str="select*fron employee";     ResultSet rs = stmt.executeQuery(str);
        • ↳ Query?
          • 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청(주로 문자열을 기반으로 한 요청)에 의한 처리
          • 대개 데이터베이스로부터 특정한 주제어나 어귀를 찾기 위해 사용됨
          • 주제어가 검색엔진의 검색필드 내에 입력된 다음, 그 내용이 웹 서버로 넘겨짐
    • PreparedStatement
      • 쿼리를 미리 생성하여 쿼리에 들어갈 변수를 설정해준뒤 쿼리를 실행한다는 점에서 Statement 객체와 다르며, Statement보다 좀 더효율적임
      •  재사용률이 높고, 반복되는 작업에서 처리속도가 빠르며, 객체를 여러 개 생성할 필요가 없음
      • 어떨 때 사용하면 유용한가?
        • 동일한 질의문을 특정 값만 바꾸어서 여러번 실행해야할 때
        • 많은 데이터를 다루기 때문에 질의문을 정리해야 할 필요가 있을 때
        • 인수가 많아서 질의문을 정리해야 할 필요가 있을 때
      • PraparedStatement 객체를 생성하기 위해서는 Connection 인터페이스의 PreparedStatement() 메서드를 호출함
      • 이 메서드의 인자로 사용되는 SQL 문은 ? 기호를 사용해서 표현할 수 있음
        이 기호는 Token이라고 하는데, SQL 문장이 실행되기 전에 실제 값으로 대체됨
        이 방법을 이용하면 특정 값으로 문자열을 연결하느 ㄴ방법보다 훨씬 쉽게 SQL 문장을 만들 수 있음
        ex) String sql = "insert into employee values(?,?,?,?,?)"; ==> 각 ?로 지정된 인자에 값을 줌
      • 사용방법: PreparedStatement pstmt = con.PreparedStatement(sql);
  4. SQL문 전송 (Query 실행)
    • Statement
    • excute()
      • Boolean 값을 반환하며, 모든 구문에 대해 수행할 수 있음
      • 리턴값이 ResultSet일 경우에는 true, 그렇지 않다면 false로 출력됨
    • executeQuery()⭐⭐⭐
      • select나 show처럼 주로 조회문에 사용됨
      • 저장된 값을 레코드 단위(한 행)로 불러올 수 있으며, ResultSet 객체를 반환함
        이때, get.자료타입() 메서드로 불러온 해으이 칼럼값에 접근할 수 있음
      • 사용방법:
        Result rs = pstmt.excuteQuery();
        rs.getInt(1)
        rs.getString(2)
    • executeUpdate() 
      •  insert문, update문, delete문, create문과 같이 데이터베이스 파일의 내용을 변경하는 SQL문을 실행할 때 사용함
      • int 타입을 반환함( 반영된 레코드 수를 반환하는 것)
      • executeUpdate() 메서드는 변경된 행(레코드)의 수를 반환해 주기 때문에 리턴형이 Integer임
      • 키보드에서 읽어온 변수에 저장된 값으로 행을 추가할때, 문자열 상수의 경우 반드시 단일 따옴표로 둘러싸야 하기 때문에 복잡한 형태의 문장을 만들어야함
  5. 결과 받기 (ResultSet 객체로부터 데이터 조회)
    • ResultSet⭐⭐⭐
      • 결과 값으로 얻어진 여러 개의 row를 출력하기 위해서 사용함
      • SQL 문에서 SELECT 문을 사용한 질의의 경우 성공 시 결과물로 ResultSet을 반환함
      • 레코드 단위로 이동하는 next() 메서드를 사용하며, 일반적으로 while 문과 함께 사용함
      • 종류: rs.getInt(인덱스숫자 or "데이터이름") , rs.getString(인덱스숫자 or "데이터이름" );
  6. 연결 해제(ResultSet 객체, Statement 객체, Connection 객체 Close)
    • Connection
    • Close()
      • 모든 작업이 끝나면 Statement 객체에서 close()메서드를 호출해서 데이터베이스와의 연결을 해제해야 함
      • 사용방법: stmt.close();

오늘의 과제

  • OraUpdate
package ch15_ex01;
//HW01
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraUpdate {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("수정할 부서를 입력하세요 ?"); String deptno	= sc.nextLine();
		System.out.println("  부서명 ?");			String dname	= sc.nextLine();
		System.out.println("  근무지 ?");	 		String loc	= sc.nextLine();
		
		String driver	= "oracle.jdbc.driver.OracleDriver";
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		Connection conn	= DriverManager.getConnection(url, "scott","tiger");
		Statement  stmt	= conn.createStatement();
		

	}

}
//결과값
수정할 부서를 입력하세요 ?
51
  부서명 ?
경영3팀
  근무지?
삼성
수정성공 ^^

 

>>>결과물

package ch15_ex01;
//HW01
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class OraUpdate {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("수정할 부서를 입력하세요 ?"); String deptno	= sc.nextLine();
		System.out.println("  부서명 ?");				String dname	= sc.nextLine();
		System.out.println("  근무지 ?");	 			String loc		= sc.nextLine();
		
		String driver	= "oracle.jdbc.driver.OracleDriver";
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql		= String.format("Update dept Set dname = '%s', loc = '%s' Where deptno = %s", dname, loc, deptno);
							//format을 사용하여 깔끔하게 정리
		Connection conn = DriverManager.getConnection(url, "scott","tiger");
		Statement  stmt	= conn.createStatement();
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "scott", "tiger");
			stmt = conn.createStatement();
			int result	= stmt.executeUpdate(sql);
			
			if(result > 0) System.out.println("수정성공");
			else			System.out.println("수정실패");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (stmt != null) stmt.close();
			if (conn != null) conn.close();
			
		}
		sc.close();
	}

}

 

  • OraDelete
    • 전체를 날릴 떄 사용, 하나만 날리는 것은 불가능 하므로 그럴 때는 Update 사용하기
package ch15_ex01;
import java.sql.Connection;
import java.sql.Statement;
//HW02
import java.util.Scanner;

public class OraDelete {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 부서를 입력하세요 ?");
		String deptno = sc.nextLine();
		Connection conn = null;
		Statement  stmt	= null;;
		String driver = "oracle.jdbc.driver.OracleDriver";
		// Localhost -> 127.0.0.1; , Port 번호:1521  , xe(orcl)-> Service ID(Sid)
		

	}

}
//결과값
삭제할 부서를 입력하세요 ?
53
삭제 성공 ^^

 

>>결과물

package ch15_ex01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//HW02
import java.util.Scanner;

public class OraDelete {

	public static void main(String[] args) throws SQLException {
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 부서를 입력하세요 ?");
		String deptno 	= sc.nextLine();
		Connection conn = null;
		Statement  stmt	= null;
		String driver 	= "oracle.jdbc.driver.OracleDriver";
		// Localhost -> 127.0.0.1; , Port 번호:1521  , xe(orcl)-> Service ID(Sid)
		String url		= "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String sql		= "delete dept where deptno=" +deptno;
		
		try {
			Class.forName(driver);
			conn	= DriverManager.getConnection(url, "scott","tiger");
			stmt	= conn.createStatement();
			int result = stmt.executeUpdate(sql);
			
			if(result > 0) System.out.println("삭제 성공^^");
			else			System.out.println("삭제 실패T.T");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (stmt != null) stmt.close();
			if (conn != null) conn.close();
		}
		sc.close();
	}

}

'DB > Oracle' 카테고리의 다른 글

2024_06_27_목  (0) 2024.06.27
2024_06_26_수  (0) 2024.06.26
2024_06_26_수  (0) 2024.06.26
2024_06_25_화  (0) 2024.06.25
2024_06_12_수  (0) 2024.06.12