java.sql.Statement 인터페이스

- 정적인 SQL 문을 실행하여 작성된 결과를 돌려주는 객체

- Statement 객체는 Connection의 createStatement() 메소드를 호출하여 얻는다.

 

Statement를 이용한 JDBC프로그램 작성 순서

1) JDBC 드라이버를 로딩한다.

- ORACLE 을 사용하는 경우

Class.forName("oracle.jdbc.driver.OracleDriver");

- MySQL을 사용하는 경우

Class.forName("com.mysql.jdbc.Driver");

 

- 자바 6부터는 JDBC드라이버를 자동으로 로딩하므로 생략 가능하다.

 

2) Connection 객체를 생성한다.

- 오라클의 Connection 객체 생성

String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; // 11g, ORCL : SID
// String url = "jdbc:oracle:thin:@//127.0.0.1:1521/ORCL"; // 12C 이상
String user = "계정이름";
String pwd = "비밀번호";
Connection conn=DriverManager.getConnection(url, user, pwd);

 

- MySQL의 Connection 객체 생성

String url="jdbc:mysql://127.0.0.1:3306/mydb"; // mydb : 데이터베이스명
String user="계정이름";
String pwd="비밀번호";
Connection conn=DriverManager.getConnection(url, user, pwd);

3) Connection의 createStatement() 메소드를 호출하여 쿼리를 실행할 Statement 객체를 얻는다.

Statement stmt = conn.createStatement();

 

4) 실행할 쿼리를 작성한다.

- INSERT 문의 예

String sql = "INSERT INTO 테이블명(컬럼명, 컬럼명) VALUES (값, 값)";

 

- SELECT 문의 예

String sql = "SELECT 컬럼명, 컬럼명 FROM 테이블명 WHERE 조건";

 

5) 쿼리를 실행한다.

- DML(INSERT, UPDATE, DELETE), DDL 실행

int result = stmt.executeUpdate(sql);

 

- SELECT 문 실행

ResultSet rs = stmt.executeQuery(sql);

 

6) SELECT 문의 경우 next() 메소드를 이용하여 실행된 결과를 읽어 온다.

if(rs.next()) {
	String hak = rs.getString("hak");
    // ...
}

 

7) 리소스를 close 한다.

rs.close(); // SELECT 문을 실행한 경우
stmt.close();
conn.close();

 

예 >>

더보기
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import db_util.DBConn;

public class Ex001_Statement {

	public static void main(String[] args) {
		Connection conn = DBConn.getConnection();
		
		// Statement 인터페이스 쿼리를 실행하는 인터페이스
		Statement stmt = null;
		String sql;
		
		try {
			// 쿼리를 작성할때 쿼리 마지막에 ;를 붙이지 않는다. 
			// 만약에 쿼리에 ;를 붙이면 ORA-00933 에러 발생
			sql = "INSERT INTO score(hak, name, birth, kor, eng, mat) VALUES ( " 
					+ " '1001', '김자바', '2000-10-10', 80, 90, 70) ";
			
			stmt = conn.createStatement();
			
			// executeUpdate() : DDL(CREATE, ALTER, DROP), DML(INSERT, UPDATE, DELETE) 실행
			int result = stmt.executeUpdate(sql);
				// DML을 실행한 경우 쿼리를 실행 후 변경 개수를 반환하고
			    // DDL은 실행 여부를 반환 한다.
			System.out.println(result +" 행이 추가 되었습니다.");
			
			// 이 프로그램은 한번만 실행 할 수 있다.
			// 두번 실행하면 학번이 기본키 이므로 동일한 학번을 추가 할수 없어서
			// ORA-00001(SQLIntegrityConstraintViolationException) 에러 발생
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}
			DBConn.close();
		}
		

	}

}

java.sql.ResultSet 인터페이스

- 데이터베이스 결과 집합을 나타내는 데이터 테이블로, 일반적으로 데이터베이스에 조회하는 문을 실행하여 생성된다.

- ResultSet 객체는 현재 데이터 행을 가리키는 커서를 유지하며, 초기에 커서는 첫 번째 행 앞에 위치한다.

- next() 메소드는 커서를 다음 행으로 이동시키고, ResultSet 객체에 더 이상 행이 없을 때 false를 리턴하므로 while 루프에서 결과 세트를 반복할 수 있다.

- 디폴트의 ResultSet 객체는 갱신이 불가능하며, next() 메소드로 다음 행(순방향)으로만 이동 가능하다.

- 옵션을 이용해 갱신이 가능하며, 스크롤이 가능한 ResultSet객체를 생성할 수 있다.

- ResultSet 객체를 생성한 Statement 객체가 close()되거나 다시 실행되는 경우에는 ResultSet 객체는 자동으로 close() 된다.

- ResultSet 객체는 Statement의 executeQuery(String sql) 메소드, PreparedStatement의 executeQuery() 메소드 등을 이용하여 객체를 얻는다. 

 

예 >>

더보기
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import db_util.DBConn;

public class Ex002_ResultSet {
	public static void main(String[] args) {
		Connection conn = DBConn.getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		String sql;
		
		try {
			stmt = conn.createStatement();
			sql = "SELECT hak hno, name, birth, kor, eng, mat, kor+eng+mat FROM score"
					+ "  WHERE hak = '1001' ";
			
			// executeQuery() : SELECT 문 실행
			// ResultSet : SELECT 문 실행 결과를 가지고 있는 객체. 전부 다 가져옴
			rs = stmt.executeQuery(sql);
			
			// 초기에 커서는 첫번재 행 앞에 위치
			// next() : 커서를 다음 행으로 이동
			if(rs.next()) {
				// String hak = rs.getString("hak"); // 에러
					// 컬럼명에 별명을 주면 반드시 별명으로 가져와야 한다.
				String hak = rs.getString("hno");
				String name = rs.getString("name");
				// String name = rs.getString(2);
				// String birth = rs.getString(3); // 컬럼의 위치로 가져오기(1부터 시작)
					// 날짜는 yyyy-mm-dd hh:mi:ss 로 출력
					// 날짜, 숫자는 String으로 가져 올수 있음
					// 날짜를 원하는 형식으로 가져오기 위해서는 쿼리에서
					// TO_CHAR(birth, 'YYYY-MM-DD') birth
					// 같이 해줘어야 함
					// 날짜는 getDate()로 가져오며, java.sql.Date 형임
				String birth = rs.getDate(3).toString(); // yyyy-mm-dd 로 반환
				int kor = rs.getInt("kor");
				int eng = rs.getInt("eng");
				int mat = rs.getInt(6);
				int tot = rs.getInt(7);
				
				System.out.print(hak + "\t" + name +"\t" + birth +"\t");
				System.out.println(kor + "\t" + eng +"\t" + mat +"\t" + tot);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				try {
					rs.close();
				} catch (Exception e2) {
				}
			}
			
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}
		}
		
		
	}
}

위 Statement 예시를 실행 후 ResultSet에서 불러온 결과

+ Recent posts