프로그래밍/JAVA 자바

자바로 오라클 DB 간섭하기 / Statement / ResultSet

Heidong 2021. 8. 26. 23:47
반응형

Statement = 인터페이스 쿼리를 실행하는 인터페이스

 

package dbEx;

import java.sql.Connection;
import java.sql.Statement;

import db.util.DBconn;

public class Ex001_Statement {
	// 자바로 오라클DB에 간섭

	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 + "행이 추가 되었습니다.");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
				DBconn.close();
			}
		}

	}

}

- DBconn = 싱글톤 패턴을 이용, Database(데이타베이스) 연결 객체 생성하는 전용 클래스

- 그냥 오라클과 연동하기 위함이니까 암기하는게 좋음

- Connection은 자동 완성으로 import하는 경우 .sql이라고 뜨는 놈으로 해야함

- Statement 객체 생성

- sql 변수에 이제 오라클 명령어를 입력 해준다. (테이블은 미리 생성해 놓자)

- 오라클 형식 그대로 작성해야하기 때문에 작은 따옴표, 큰 따옴표, 공백 등등 주의 해야한다.

(안그러면 sql구문 오류난다고 오류가 나옴)

- 그리고 Connection의 createStatement() 메소드를 호출해서 쿼리를 실행할 객체를 얻어야 한다.

- 마지막으로 쿼리 실행을 위해서 executeUpdate()를 만드는데

executeUpdate =  DDL(CREATE, ALTER, DROP), DML(INSERT, UPDATE, DELETE) 실행함

즉 오라클에서 만들고 바꾸고 지우고 등등 할 수 있게해주는 놈임

- sql 변수에 담아 놨던 오라클 명령어를 executeUpdate를 통해 비로소 실행 한다고 보면 됨

- 문제가 없다면 행이 추가 되었다고 잘 나올거임

(만약 이미 같은 기본키 값이 추가 되어있다면 무결성 제약 조건 오류가 뜰꺼임)

- 그리고 꼭 finally 명령어를 통해서 소스가 제대로 실행된걸 확인시키고 close() 꼭 해주자(오라클 실행 객체, 디비 연결 객체 2개 했으니까 2개 close 해야함)

 

 

 

ResultSet

그냥 쉽게 말해서 자바에서 오라클 컬럼 결과 확인을 할 때 쓴다.

 

package dbEx;

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) {
		// TODO Auto-generated method stub
		Connection conn = DBconn.getConnection();
		Statement stmt = null;
		ResultSet rs = null;
		
		String sql;
		
		try {
			
			stmt = conn.createStatement();
			sql = "SELECT hak hhh, name, birth, kor, eng, mat, kor+eng+mat FROM score  WHERE hak = '1001' ";
			
			// executeQuery() = SELECT문만 실행 나머지 실행은 executeUpdate()
			// ResultSet = SELECT문 실행 결과를 가지고 있는 객체
			rs = stmt.executeQuery(sql);
			
			// 초기에 커서는 첫번째 행 앞에 위치
			// next() = 커서를 다음 행으로 이동
			if(rs.next()) {
				String hak = rs.getString("hhh"); // 컬럼명에 별명을 주면 반드시 별명으로 입력
				String name = rs.getString("name");
				
				
				//String birth = rs.getString(3); // 컬럼의 위치로 가져올 수 있음. (0아니고 1부터 시작함)
					// 날짜는 yyyy-mm-dd hh:mi:ss 로 출력한다.
					// 날짜, 숫자는 String으로 가져올 수 있음
					// 날짜를 원하는 형식으로 가져오기 위해서는 쿼리에서 TO_CHAR(birth, 'YYYY-MM-DD') AS 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) {
					// TODO: handle exception
				}
			}
			
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}

	}

}

- 오라클 데이타베이스와 연결을 위해 Connection 객체 생성 및 DBconn.getConnection() 이용

- Statement 방식으로 SQL 결과 실행 하기위해 생성

- 값 자바에서 볼려고 ResultSet 객체 생성

- Connection의 객체 conn은 createStatement();를 이용한다

- 오라클에서 실행할 명령문 sql 변수에 입력

- executeQuery() = SELECT문만 실행 나머지 실행은 executeUpdate()

- ResultSet = SELECT문 실행 결과를 가지고 있는 객체

(간단히 말해서 executeQuery로 쿼리 실행시키고 그 값을 ResultSet 의 객체 rs에 저장해 둠)

- ResultSet 의 결과 값을 보기 위해서는 커서를 다음 행으로 이동 시켜야 하는데

이때 next() 명령어를 쓴다. => rs.next() if와 같이씀 값이 있으면 true

- 이름과 학번은 VARCHAR2 즉 String 형태니까 getString을 쓰고 자바 변수에 담는다.

(쿼리에서 별명을 지어 줬으면 꼭 별명 쓸것)

- birth는 날짜 형태니까 getDate 사용해서 값 가져오고 String 변수에 담기 위해서 toString() 사용

- 나머지 kor, eng, mat, tot는 숫자니까 Integer나 int로 가져온다.

(int일때는 값이 NULL이면 안된다.)

- 그리고 가져온 값들을 출력

- 마찬가지로 finally 이용해서 꼭 close()해주자.

 

 

반응형