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에서 불러온 결과
'쌍용강북교육센터 > 8월' 카테고리의 다른 글
0829_Java : JDBC : 급여관리 문제[21.09.01추가] (0) | 2021.08.29 |
---|---|
0827_Java : JDBC : 회원관리 문제 (0) | 2021.08.29 |
0826_Java : JDBC : DriverManager 클래스 Connection 인터페이스 (0) | 2021.08.26 |
0826_Java : JDBC (Java Database Connectivity) (0) | 2021.08.26 |
0825_Java : Serializable 직렬화 (0) | 2021.08.26 |