YJ의 새벽

SQL응용 JDBC (PreparedStatement) 본문

SelfStudy/Oracle (SQL)

SQL응용 JDBC (PreparedStatement)

YJDawn 2023. 1. 25. 18:15
  • JDBC 프로그래밍 단계

JDBC 드라이버 로드  -->   JDBC driver class    /   Class.forName()

데이터베이스 연결 -->   Java.sql.Connection   /   getConnection()

Statement 생성 -->   Java.sql.Statement    /    createStatement()

                                 Java.sql.PreparedStatement    /   prepareStatment()

SQL 문 전송 -->   Java.sql.Statement    /    executeQuery() , excuteUpdate()

결과받기 -->   Java.sql.ResultSet   /   resultSet()

연결해제  -->   Java.sql.Connection   /   close()

 

JDBC 프로그래밍 (출처 : http://leess.kr  이상식교수님 홈페이지)

 

Statement vs PreparedStatement

**PreparedStatement 

-- DBMS 에서 동일하거나 비슷한 SQL 문을 높은 효율성으로 반복적 실행할때 사용.

--작동원리

   --1. 준비 (Prepare) :

              --SQL문의 틀(Template)을 만들고 이를 DBMS 로 보냄.

              -- 특정값은 지정하지 않음 .

         ex ) INSERT INTO products (name , age ) VALUES ( ?,? ) ;

            --물음표 기호를 사용하여 SET+자료형() 의 메소드 호출시에 전달받을 값의 자리를 지정.

   --2. 컴파일 (Compile) :

              --DBMS는 SQL문의 틀을 컴파일하여(최적화및 변환) 실행하지않고 결과만 저장.

              --캐시(Cache) 에 저장 . 임시메모리. 

         ex ) PreparedStatement ps = conn.prepareStatement(sql);

               ps.setString ( 1,"홍길동" );

               ps.setInt ( 2 , 20 ) ;               

               --> 실행하고 나면 

               INSERT INTO products (name , age ) VALUES ( '홍길동', 20 ) ;

   --3. 실행 ( Execute ) :

             --SQL 문을 실행 

             ex ) int res = ps.executeUpdate();   

                --UPDATE,DELETE SQL문 실행가능. 

                --SELECT SQL문은 executeQuery() 메소드를 호출해야함. 

 

**Statement 와 PreparedStatement 의 차이 .

--Statement 사용하면 매번 쿼리수행시 4단계를 거치고 ,

  PreparedStatement 는 처음한번만 세단계 거친후 캐시에 담아 재사용.

--동일한 쿼리를 반복적으로 수행한다면 , PreparedStatement 가 DB에 적은 부하를주며, 성능도 좋다.

--Statement 는 executeQuery() , executeUpdate() 를 실행하는시점에 파라미터로 SQL문을 전달하는데,

  이때 전달되는 SQL문은 완성된형태로 한눈에 SQL문을 파악하기 쉽다.

  하지만, 매번 컴파일하기때문에 효율성이 떨어진다 .

 

 

EX ))) PreparedStatement  인터페이스를 사용하여 emp_tbl 새로운데이터 저장하기. 

 

1. 실행할 SQL 문 작성하기. 

--INSERT INTO emp_tbl (empno , ename) VALUES (? , ? ) ;     -- 기본키, NOT NULL 제약조건 확인 . 

	public class TestJDBC {
    // PreparedStatement 인터페이스 사용하여 INSERT INTO SQL문 실행
	// 연결객체 : Connection pcon
	// 사원번호 : int pempno 
	// 사원이름 : String pename
	public void insert(Connection pcon, int pempno, String pename) {
		//실행할 SQL 문장 문자열로 정의
		String sql = "INSERT INTO emp_tbl (empno,ename) VALUES (?,?)";
		//PreparedStatement 참조변수 선언
		PreparedStatement ps = null;
		
		try {
			//SQL문 임시로 보관할 객체 생성
			ps = pcon.prepareStatement(sql);
			//SQL문 ?,? 자리에 값을 대입.
			ps.setInt(1, pempno);
			ps.setString(2, pename);
			//SQL문 실행
			int res = ps.executeUpdate();
			//데이터베이스에 저장된 데이터 갯수(행) 을 출력
			System.out.println("INSERT INTO SQL문 실행한 결과는 "+res);
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(ps !=null) ps.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

변수를 추가할때 .

EX ))) SELECT MAX(empno)+1 FROM emp_tbl 실행하는 메소드

         --EMPNO + 1 씩 증가 .

	//SELECT MAX(empno)+1 FROM emp_tbl SQL 문 실행하는 메소드
	//외부로부터 입력받을 값의 목록
	// 1) 오라클 연결객체
	//반환값 : MAX(empno)+1 , MAX(NVL(empno,0))+1 
	public int getNextEmpno(Connection pcon) {
		//반환값 보관할 변수를 선언
		int res = 0 ;
		String sql = "SELECT MAX(empno)+1 FROM emp_tbl";
		Statement s = null;
		//SELECT 문의 결과를 ResultSet 타입으로 보관할 참조변수선언
		ResultSet rs = null;
		
		try {
			//SELECT문 저장할 객체생성
			s = pcon.createStatement();
			//SELECT문 실행
			rs = s.executeQuery(sql);
			// next() 메소드 호출하여 값을 전달했는지 확인하기.
			if(rs.next()==true) {
				//get() 호출, 값을 가져와서 변수에 대입
				res = rs.getInt(1);
				System.out.println("오라클데이터베이스로부터 받은 값은 "+res);
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if( rs != null) rs.close();
				if( s != null) s.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
		return res;
	}

EX ))) 예제문들 실행.

	public static void main(String[] args) {

		Connection con = null;
		Statement st = null;
		ResultSet rs = null;
		// 메소드 호출 
		TestJDBC test = new TestJDBC();
		
		try {
			java.lang.Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("오라클 데이터베이스 연결 , 드라이버객체 생성");
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "user1", "1234");
			System.out.println("오라클 DBMS에 연결되었습니다");
			
			//getNextEmpno() 호출
			int nextEmpNo = test.getNextEmpno(con);
			System.out.println("getNextEmpno() 메소드 반환값: "+nextEmpNo);
			
			//insert (Connection, int, String) 메소드 호출
			test.insert(con,nextEmpNo,"홍길동");
            
        } catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(con !=null) con.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			
		}

 

 

 

 

 

          

 

 

 

 

 

Comments