지금까지는 생성에 관한 쿼리만 사용했다.
쿼리를 입력하고 데이터베이스에서 확인만하면 끝이었지만, 데이터베이스에 있는 내용을 조회하는 것은 조금 다르다.
결과셋은 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')
을 사용해야 할 것이다.
이렇게 가져오는 값을 출력하거나 변수에 받아서 원하는 대로 사용할 수 있게 된다.