Statement 객체와 PreparedStatement 객체 Connection 객체 - Connection 객체가생성되면데이터베이스에접근이가능해진다. - Connection 객체는자바와데이터베이스의접속된상태의객체를말한다. 데이터베이스에 DML작업을위해서는반드시접속을먼저해야한다. 그리고, 작업후에는반드시접속을해제한다. - Connection 객체를생성할때두개의문자열이필요하다. 하나는, 오라클데이터베이스의드라이버를로드할때사용하는문자열, 다른하나는해당데이터베이스의로그인할때사용하는문자열 String driver = "oracle.jdbc.driver.oracledriver";// 오라클데이터베이스드라이버이름 - 대소문자에유의한다. String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";// 데이터베이스에로그인을위한문자열 - 맨끝의 "orcl" 은해당데이터베이스의이름이고, ""@127.0.0.1" 은해당데이터베이스의 IP 주소이다. - 다음은 Connection 객체를생성하는예 String driver = "oracle.jdbc.driver.oracledriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; Connection con = DriverManager.getConnection(url,"hr","hr"); Statement와 PreparedStatement - 쿼리를실행할때사용하는객체이다. - Statement는쿼리에직접데이터를입력하는경우에사용한다. - PreparedStatement는쿼리에데이터를입력할때? 를사용한다. - 다음은 PreparedStatement 객체를사용해서삽입 (insert) 작업의예 String sql = "insert into member(code, name, id, pwd, age) values (?,?,?,?,?)"; PreparedStatement pstmt = con.preparestatement(sql);//preparedstatement 객체생성 - PreparedStatement 객체는 Connection 객체로접근해서 preparestatement() 메서드를호출해서생성한다. -? 자리에실제데이터를명시해서다음과같이사용한다. setxxx(int 순서, 실제데이터나 _ 변수 ); pstmt.setstring(1, s_code); pstmt.setstring(2, s_name); pstmt.setstring(3, s_id); pstmt.setstring(4, s_pwd); pstmt.setint(5, s_age); - 메소드에서지정된숫자는? 의위치를의미하며, 해당위치의? 에데이터가전달되어쿼리문이완성된다. - SQL을처리하기위해서는 executequery() 메소드와 executeupdate() 메소드를사용한다. pstmt.executequery() : select pstmt.executeupdate() : insert, update, delete - 1 -
- 다음은 Statement 객체를사용해서삽입 (insert) 작업의예 String sql = "insert into member(code, name, id, pwd, age) values ("; int id = 10; sql = sql + id +, ;// 항목사이에콤머 (,) 가있어야한다. String name = " 홍길동 "; sql = sql + "'" + name +, ;//varchar2 데이터는앞뒤로작은따옴표를붙인다. int code = 505; sql = sql + code + ",";//code항목은숫자 (number) 형태이므로작은따옴표가없어야한다. String pwd = "1212"; sql = sql + "'" + pwd + "',"; int age = 35; sql = sql + age + ")";// 삽입할마지막항목이므로괄호 ( ) ) 가필요하다. Statement stmt = con.createstatement();//statement 객체생성 stmt.executeupdate(sql);// 삽입쿼리문실행 - Statement 객체는 Connection 객체로접근해서 createstatement() 메서드를호출해서생성한다. - 쿼리작업이종료되면해당객체를받드시닫는다. 예외가발생할수있으므로, 예외처리를해야한다. stmt.close(); catch(exception e) { - Statement 객체로 SQL 을처리하기위해서는 executequery() 메소드와 executeupdate() 메소드를사용한다. stmt.executequery() : select stmt.executeupdate() : insert, update, delete - 2 -
SELECT select 의결과는 ResultSet 객체에서관리한다. String str = "select * from employees"; ResultSet rs = stmt.executequery(str); rs.next() rs.first() 검색결과 ResultSet rs.previous() rs.last() ResultSet 에서다음의메소드를사용해서검색결과를처리한다. 메소드이름 next() previous() first() last() 설명현재행에서한행다음으로이동현재행에서한행앞으로이동현재행에서첫번째행의위치로이동현재행에서마지막행의위치로이동 위의메소드를성공적으로처리한경우에는 true, 그렇지않을경우에는 false 를반환한다. 조회결과를모두출력하기위해서는 ResultSet 객체에 next() 메소드를사용해서반복처리한다. String sql = "select * from employees"; ResultSet rs = stmt.executequery(sql); // 검색한결과를처리 위의 next() 메소드는검색된결과가존재하면 true를반환하고해당위치의정보로이동하지만, 결과가존재하지않으면 false를반환한다. 검색된각행에서실제로값을추출하기위해서는 get으로시작하는메소드를사용한다. 즉, getstring(), getint() 등의메소드를사용해서해당열에저장된데이터의형태에알맞는메소드를사용한다. getstring() 메소드는문자열형태의데이터를, getint() 메소드는정수형태의데이터를읽어오는데사용한다. - 3 -
다음과같은형태의테이블이존재한다고가정하고, 이테이블의모든검색결과를처리하는프로그램은다음과같다. code( 문자열 ) name( 문자열 ) id( 문자열 ) pwd( 문자열 ) age( 정수형 ) 1001 홍길동 hong hong123 20 1002 박길동 park park100 30 1003 이길동 lee lee 15 String s_code = rs.getstring("code"); String s_name = rs.getstring("name"); String s_id = rs.getstring("id"); String s_pwd = rs.getstring("pwd"); int s_age = rs.getint("age"); System.out.printf("%s \t %s \t %s \t %s \t %d \n", s_code, s_name, s_id, s_pwd, s_age); 위의 get 메소드에서열의이름을사용하는방법이외에인덱스값을사용하는방법도있다. String s_code = rs.getstring(1);// 인덱스는테이블의열의순서이며 1부터시작한다. String s_name = rs.getstring(2);// 성능면에서열의이름을사용하는것보다빠르다. String s_id = rs.getstring(3); String s_pwd = rs.getstring(4); int s_age = rs.getint(5); System.out.printf("%s \t %s \t %s \t %s \t %d \n", s_code, s_name, s_id, s_pwd, s_age); 도전과제 : ResultSet 을이용해서데이터베이스에저장된데이터를출력하세요. - 4 -
import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.statement; public class Jdbc_Select { static String driver = "oracle.jdbc.driver.oracledriver"; static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; static Connection con = null; static Statement stmt = null; static ResultSet rs = null; public static void main(string[] args) { String sql = "select * from employees"; Class.forName(driver); con = DriverManager.getConnection(url, "hr", "hr"); stmt = con.createstatement(); rs = stmt.executequery(sql);//select 수행 System.out.print(rs.getInt("employee_id") + "\t"); System.out.print(rs.getString("first_name") + "\t"); System.out.print(rs.getString("last_name") + "\t"); System.out.print(rs.getString("phone_number") + "\n"); catch(exception e) { System.out.println(" 데이터베이스에서예외가발생했습니다."); finally { if(rs!= null) rs.close(); if(con!= null) con.close(); if(stmt!= null) stmt.close(); catch(exception e) { System.out.println(" 데이터베이스를닫는중에예외가발생했습니다."); - 5 -
Meta 데이터이용하기메타데이터 (Meta-data) 란저장된데이터자체를의미하는것이아니라, 해당데이터와관련된정보를의미한다. 예를들어, 데이터의소유자, 데이터의크기, 데이터의열제목등데이터자체가아니라데이터와관련된유용한정보들을뜻한다. 이러한메타데이터를이용하면상당히다양한형태로데이터를처리할수있다. 메타데이터를사용하기위해서는 ResultSet 클래스의 getmetadata() 메소드를호출해서 ResultSetMetaData 객체를얻으면된다. ResultSetMetaData 의주요메서드는다음과같다. 메소드 기능 getcolumnname() 해당데이터의열의이름을알려준다. getcolumntype() 해당데이터의데이터형태를알려준다. getcolumncount() ResultSet의총열의갯수를알려준다. isreadonly() 읽기만가능한열인지알려준다. 도전과제 : 메타데이터를이용해서검색결과에열의제목을추가하세요. - 6 -
import java.io.bufferedreader; import java.io.inputstreamreader; import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.statement; public class Jdbc_Meta { static String driver = "oracle.jdbc.driver.oracledriver"; static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; static Connection con = null; static Statement stmt = null; static ResultSet rs = null; public static void main(string[] args) { String sql; BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); System.out.println("SELECT문입력하기 "); System.out.print(" 처리할 SELECT 문 : "); sql = br.readline();// 화면에서 SELECT 문을입력받는다. // 주의!!! 화면에서 SELECT문을입력할때에는쎄미콜론 (;) 은생략해야한다. Class.forName(driver);//JDBC 드라이버로드 con = DriverManager.getConnection(url, "hr", "hr"); stmt = con.createstatement(); rs = stmt.executequery(sql);// 입력된 select를실행한다. ResultSetMetaData rsm = rs.getmetadata();// 메다데이터를얻어온다. int cols = rsm.getcolumncount();// 조회한테이블의총열의갯수를얻어온다. // 조회한테이블의열제목을출력한다. for(int i = 1; i <= cols; i++) { System.out.print(rsm.getColumnName(i) + "\t"); System.out.println();// 테이블의열제목을모두출력한뒤한줄을띄운다. for(int i = 1; i <= cols; i++) { System.out.print(rs.getObject(i) + "\t"); // 무슨형태의데이터가저장되어있는지 - 7 -
// 알수없기때문에 Object형태로읽는다. System.out.println();// 한줄의데이터를출력한뒤한줄을띄운다. // 조회된모든데이터를출력한다. catch(exception e) { System.out.println(" 데이터베이스에서예외가발생했습니다."); finally { if(rs!= null) rs.close(); if(stmt!= null) stmt.close(); if(con!= null) con.close(); catch(exception e) { System.out.println(" 데이터베이스를닫는중에예외가발생했습니다."); - 8 -