
지금까지는 생성에 관한 쿼리만 사용했다.
쿼리를 입력하고 데이터베이스에서 확인만하면 끝이었지만, 데이터베이스에 있는 내용을 조회하는 것은 조금 다르다.
결과셋은 ResultSet이라는 타입으로 받을 수 있고, 내부의 데이터는 메소드를 통해 직접 추출해야 한다.
앞선 create문이나 insert문을 사용하는 코드와 크게 다르진 않다.
결과셋을 불러오는 과정이 추가된다.
또한 executeUpdate() 대신 executeQuery()를 사용하는 것도 차이점으로 볼 수 있다.
(링크 최하단 참조)
// 테이블 내용 불러오기
public void selectTable(String tbName) throws SQLException {
String sql = "select * from "+tbName;
Connection con = ConnectionManager.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
pstmt.close();
con.close();
int no = 0;
String name = "";
String manufacturing = "";
int price = 0;
while(rs.next()) {
no = rs.getInt(1);
name = rs.getString(2);
manufacturing = rs.getString(3);
price = rs.getInt(4);
System.out.println("No:"+no+" / "+"name:"+name+" / "+"manufacturing:"+manufacturing+" / "+"price:"+price);
}
}// selectTable()
이 쿼리를 작성하면서 알게 된 사실은...
바인드 변수(?)는 반드시 칼럼의 값을 대체해야 한다는 점이다.
테이블 명을 선택하게 하려고
String sql = "select * from ?";
위와 같이 바인드 변수를 설정해도 쿼리 예외가 생길 뿐이다.
테이블명과 칼럼명은 바인드 변수로 설정할 수가 없다.
따라서,
String sql = "select * from "+tbName;
이렇게 tbName 자체를 문자열 결합으로 묶어줬다.
from 뒤의 공백에 주목한다.
일단, 위와 같은 코드 구성으로 select절의 결과셋을 ResultSet에 저장한 상태를 마련하였다.
ResultSet은 executeQuery()의 반환값(쿼리의 결과셋)을 받아오기 위한, 정해진 틀이다.
레코드 즉, 한 행(row) 단위로 데이터가 저장된다.
next() 메서드를 사용하여 한 행씩 넘겨간다.
int no = 0;
String name = "";
String manufacturing = "";
int price = 0;
/* 결과셋 rs를 next()메서드를 통해 한 행씩 조회한다 */
while(rs.next()) {
no = rs.getInt(1);
name = rs.getString(2);
manufacturing = rs.getString(3);
price = rs.getInt(4);
System.out.println("No:"+no+" / "+"name:"+name+" / "+"manufacturing:"+manufacturing+" / "+"price:"+price);
}
getInt()와 getString()의 파라미터는, 칼럼의 이름 또는 순서다.
위 쿼리에서 가져온 toys테이블의 한 행은 다음과 같이 구성되어 있다.
MariaDB [jdbc]> desc toys;
+---------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+----------------+
| no | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| manufacturing | varchar(20) | NO | | NULL | |
| price | int(11) | NO | | NULL | |
+---------------+-------------+------+-----+---------+----------------+
4 rows in set (0.006 sec)
여기서 칼럼 'no'는 Int 타입이면서 첫 번째 칼럼이다.
따라서 칼럼 'no'의 값을 가져오기 위해서는 getInt(1) 또는 getInt('no')를 사용한다.
칼럼 'name'은 문자열 즉, String 클래스이면서 두 번째 칼럼이다.
따라서 칼럼 'name'의 값을 가져오기 위해서는 getString(2) 또는 getString('name')을 사용해야 할 것이다.
이렇게 가져오는 값을 출력하거나 변수에 받아서 원하는 대로 사용할 수 있게 된다.