1. READ
CRUD 중 하나 빼먹었던 것이 있다.
바로 Read이다.
Read, Select문을 사용하여 작업한 SQL문을 출력시키는 작업이었다.
이 과정은 위에서 진행했던 것들과는 다른 방향으로 코드가 진행이 되기에 이렇게 따로 다루고 있다.
READ 작업을 진행하기 위해선 ResultSet이라는 자료형을 사용하게 된다.
ResultSet은 SQL에서 테이블 형태의 데이터에 접근하는 코드이며 SELECT문의 결과를 저장하는 객체이다.
그래서 여기까지 SQL문과 관련된 객체는 총 3가지 종류를 사용하고 있다.
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
- DB 서버와 연결시켜주는 객체인 Connection
- String형태의 SQL문을 SQL문으로 변환시켜서 DB 서버에 보내주는 객체인 PreparedStatement
- SQL문의 SELECT문 결과값을 저장하는 객체인 ResultSet
위의 내용을 모르면 자바에서 SQL문을 작업할 수 없으니 잘 기억해두자.
그리고 자원 반납은 선언한 반대 순서로 해주면 된다.
(왜? 자바에서 외부 작업을 건드릴 때는 작업이 끝나면 작업들을 종료시켜주어야 안정성이 높아지니깐)
finally {
// 자원 반납
try {
if(rs!=null) {rs.close();}
} catch (Exception e) {}
try {
if(pstmt!=null) {rs.close();}
} catch (Exception e) {}
try {
if(con!=null) {rs.close();}
} catch (Exception e) {}
}// end
2. ResultSet으로 퀴리문 실행시키기
이제 ResultSet을 활용하여 SQL문(쿼리문)을 실행시켜보자. 방법은 아주 간단하다.
위에서는 .executeUpdate() 메서드를 사용했지만 Read를 하려면 .executeQuery() 메서드를 사용하면 된다.
이것을 우리가 선언했던 rs 변수에 담은 뒤 if문을 사용하여 출력시킨다.
여기서 .next() 메서드를 사용하여 커서를 통해 자료가 있는지부터 확인해보자.
if(rs.next()) { // 커서가 있는지?
System.out.println("자료 있음");
} else {
System.out.println("자료 없음");
} // if end
자료가 있으니 이제 직접적으로 Select된 값들에 접근해보자.
접근하는 방법은 두 가지가 있다.
1) 칼럼 순서로 접근하기
DB에서는 칼럼 순서가 전혀 의미가 없었다. 하지만 자바에서는 순서가 의미가 있다.
우리는 지금 SELECT문을 사용하여 cnt라는 sungjuk 테이블의 행 갯수를 새는 데이터에 접근한 상태이다.
사전에 실습했던 테이블을 활용한 상태로 행의 갯수는 12개가 나와야 한다.
칼럼의 갯수가 적을 때는 칼럼 순서로 간단하게 접근할 수 있다.
여기서 주의할 점은 칼럼의 순서와 자료형이 일치하여야 한다는 것이다.
cnt 칼럼이 갖고 있는 값은 12, 정수형이므로 Int 형으로 출력시키면 도니다.
코드는 아래와 같다.
// rs.getInt(1)
System.out.println("전체 행 개수 : " + rs.getInt(1));
1을 쓰면 첫 번째 칼럼을 출력시켜달라는 뜻이다.
2) 칼럼 이름으로 접근하기
이름으로 접근하는 것도 문법은 동일하다.
다만 순서를 기록하는 대신 칼럼의 명을 직접 언급해주면 된다.
// rs.getInt("cnt")
System.out.println("전체 행 개수 : " + rs.getInt("cnt"));
3. SELECT문 활용하기
1) sungjuk 테이블에서 데이터 하나씩 가져오기
SQL문에서 우리는 SELECT문을 사용할 떄 전체 칼럼을 선택한다는 의미로 * 기호를 사용했다.
하지만 자바에서는 * 기호를 사용하기 이전에 칼럼들을 모두 선언해주어야 한다.
이렇게 선언해주면 위에서와 같은 문법을 사용하면 데이터를 가져와서 출력시킬 수 있다.
int sno = 61;
StringBuilder sql = new StringBuilder();
sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ");
sql.append(" FROM sungjuk ");
sql.append(" WHERE sno = ? ");
pstmt = con.prepareStatement(sql.toString());
pstmt.setInt(1, sno);
rs= pstmt.executeQuery();
if(rs.next()) {
System.out.println("자료 있음");
// 1) 칼럼 순서 접근
System.out.print(rs.getInt(1));
System.out.print(rs.getString(2));
System.out.print(rs.getInt(3));
System.out.print(rs.getInt(4));
System.out.print(rs.getInt(5));
System.out.print(rs.getInt(6));
System.out.print(rs.getInt(7));
System.out.print(rs.getString(8));
System.out.print(rs.getString(9));
System.out.println();
// 2) 칼럼 명으로 접근
System.out.print(rs.getInt("sno"));
System.out.print(rs.getString("uname"));
System.out.print(rs.getInt("kor"));
System.out.print(rs.getInt("eng"));
System.out.print(rs.getInt("mat"));
System.out.print(rs.getInt("tot"));
System.out.print(rs.getInt("aver"));
System.out.print(rs.getString("addr"));
System.out.print(rs.getString("wdate"));
System.out.println();
} else {
System.out.println("자료 없음");
} // if end
2) sungjuk 테이블에서 전체 데이터 가져오기
DB의 테이블에서 한 줄씩 데이터를 가져올 수 있는 것처럼 전체 데이터를 한번에 가져올 수도 있다.
.next() 메서드가 boolead값으로 반환되는 것을 이용하여 do~while 문으로 출력을 시켰다.
if(rs.next()) {
System.out.println("자료 있음");
do {
System.out.print(rs.getInt("sno") + " ");
System.out.print(rs.getString("uname") + " ");
System.out.print(rs.getInt("kor") + " ");
System.out.print(rs.getInt("eng") + " ");
System.out.print(rs.getInt("mat") + " ");
System.out.print(rs.getInt("tot") + " ");
System.out.print(rs.getInt("aver") + " ");
System.out.print(rs.getString("addr") + " ");
System.out.print(rs.getString("wdate") + " ");
System.out.println();
} while(rs.next()); // 다음 cursor가 있는지
} else {
System.out.println("자료 없음");
} // if end
4. Like 활용하기
문제) 이름에 '나' 문자가 있는 행을 조회하시오
package jdbc0922;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test05_selectLike {
public static void main(String[] args) {
// 문제) 이름에 '나' 문자 있는 행을 조회하시오
String col = "uname"; // 검색 칼럼 keyfield
String word = "나"; // 검색어 keyword
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String url = "jdbc:oracle:thin:@localhost:1521:xe"; // == "127.0.0.1"
String user = "system";
String password = "1234";
String driver = "oracle.jdbc.driver.OracleDriver"; // ojdbc6.jar
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
System.out.println("오라클DB 서버 연결 성공!!");
StringBuilder sql = new StringBuilder();
sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ");
sql.append(" FROM sungjuk ");
// 검색어 존재하는지?
if(word.length()>0) {
// where uname like '%나%'
String where = " WHERE " + col + " LIKE '%" + word + "%'";
sql.append(where);
} // if end
sql.append(" ORDER BY sno DESC ");
// System.out.println(sql.toString());
pstmt = con.prepareStatement(sql.toString());
rs= pstmt.executeQuery();
if(rs.next()) {
System.out.println("자료 있음");
do {
System.out.print(rs.getInt("sno") + " ");
System.out.print(rs.getString("uname") + " ");
System.out.print(rs.getInt("kor") + " ");
System.out.print(rs.getInt("eng") + " ");
System.out.print(rs.getInt("mat") + " ");
System.out.print(rs.getInt("tot") + " ");
System.out.print(rs.getInt("aver") + " ");
System.out.print(rs.getString("addr") + " ");
System.out.print(rs.getString("wdate") + " ");
System.out.println();
} while(rs.next()); // 다음 cursor가 있는지
} else {
System.out.println("자료 없음");
} // if end
} catch (Exception e) {
System.out.println("오라클DB 연결 실패 : " + e);
} finally {
// 자원 반납
try {
if(rs!=null) {rs.close();}
} catch (Exception e) {}
try {
if(pstmt!=null) {rs.close();}
} catch (Exception e) {}
try {
if(con!=null) {rs.close();}
} catch (Exception e) {}
}// end
System.out.println("뚱");
} // main() end
} // class end
'⁂ Java > : JDBC - Java DataBase Connectivity' 카테고리의 다른 글
[JAVA] JDBC #3-1 자바로 페이징하기 (0) | 2022.09.22 |
---|---|
[JAVA] JDBC #2-1 CRUD(Create, Read, Update, Delete) : C,U,D (1) | 2022.09.21 |
[JAVA] JDBC #1 - 환경 구축하기 (0) | 2022.09.21 |