개발자입니다
[Java] JDBC(Connection, PreparedStatement, ResultSet 본문
JDBC
자바에서 데이터베이스를 사용하기 위한 절차에 대한 규약
DBMS에 따라 DB를 다루는 방식이 다르다면, 사용자는 알아야 할 것이 매우 많을 것입니다.
그래서 JDBC를 통해 추상화된 인터페이스를 제공하기만 하고, 각 벤더들( Oracle, Mysql 등.. )은 각자의 DBMS에 맞게 구현을 해놓은 상태입니다.
사용자는 특정 DBMS를 사용하기 위해, 각 벤더에서 개발해놓은 드라이버를 설치하면 됩니다.
그리고 DB에 접근하기 위한 인터페이스는 JDBC에서 제공하는 API를 사용하면 됩니다.
JDBC 란 자바에서 제공하는 데이터베이스와 연결하여 데이터를 주고 받을 수 있도록 하는 인터페이스입니다.
JDBC를 사용하는 방법은 어떤 데이터베이스를 사용하던지 같습니다. 방법은 간략하게 다음과 같습니다.
- Class.forName() 을 이용해서 드라이버 로드
- DriverManager.getConnection() 으로 연결 얻기
- Connection 인스턴스를 이용해서 Statement 객체 생성
- Statement 객체의 결과를 ResultSet 이나 int에 받기
Statement
자바에서 쿼리문을 사용할 때 java.sql 패키지에 있는 Statement를 사용한다. Statement는 SQL문을 실행할 때 사용하는 인터페이스이다.
PreparedStatement가 SQL Injection을 방어할 수 있다.
PreparedStatement pStmt = conn.prepareStatement("INSERT INTO instructor VALUES(?,?,?,?)");
pStmt.setString(1, "88877");
pStmt.setString(2, "Perry");
pStmt.setString(3, "Finance");
pStmt.setInt(4, 125000);
pStmt.executeUpdate();
pStmt.setString(1, "88878");
pStmt.executeUpdate();
위 코드는 JDBC에서 prepared statement를 사용하는 예시다. 쿼리문에서 어떤 값이 들어갈 부분이 물음표로 대체되어 있는 것을 prepared statement라고 한다. Prepared statement가 생성되면 데이터베이스 시스템은 그것을 미리 컴파일한다. (물음표에 들어갈 값이 결정되지 않은 상태에서 컴파일하는 것이다.) 그 후에 물음표에 들어갈 값이 정해지면 (위 예시에서는 setString 또는 setInt 등의 메소드를 사용하여 그 값을 정한다.) 데이터베이스 시스템은 이미 컴파일된 쿼리문에 값만을 대입해서 쿼리를 실행할 수 있다. 따라서 동일한 쿼리문을 여러 번 실행할 경우 쿼리문을 한 번만 컴파일하면 되는 prepared statement를 사용하는 것이 효율적이다.
설령 같은 쿼리를 여러 번 실행하지 않는 경우라도 유저가 입력한 값을 가지고 쿼리문을 생성하는 경우에는 prepared statement를 사용하는 것이 좋다. Prepared statement를 사용하지 않는 경우, 일반적으로 "INSERT INTO instructor VALUES(" + v1 + "," + v2 + "," + v3 + "," + v4 + ")"와 같이 문자열들을 연결하여 쿼리문을 생성하게 되는데, 이때 유저가 부적절한 값을 입력할 경우 문법에 맞지 않는 쿼리문이 생성되거나 해킹을 허용할 수 있다. (해커가 쿼리문에 부적절한 값을 입력하여 데이터베이스의 정보를 손상시키거나 민감한 정보를 탈취하는 것을 SQL injection이라고 한다.)
ResultSet
ResultSet이란 대충 SELECT문을 실행하여 테이블로부터 얻은 결과를 저장하고있는 저장소라고 알면 되겠다.
executeQuery(String) - SELECT(조회)문을 전송할 떄 사용하는 메서드로, ResultSet 자료형의 데이터를 반환한다.
이 때, ResultSet이란 대충 SELECT문을 실행하여 테이블로부터 얻은 결과를 저장하고있는 저장소라고 알면 되겠다.
Ex) stmt.executeQuery(SELECT * FROM Test;); //Test테이블로부터 받아온 데이터를 담고있는 ResultSet 반환
executeUpdate(String) - INSERT, UPDATE, DELETE 문을 실행할 때 사용, 수정한 레코드 수를 int형으로 반환
Ex) stmt.executeUpdate(INSERT INTO `test` VALUES ('1', '티스토리', '2017-01-05';); //1이 반환
//2017-01-06 추가 - DDL (CREATE DROP 등등..)문도 잘 되더라
rs.next() - next함수는 ResultSet에 저장된 SELECT문 실행 결과를 행단위로 1행씩 넘겨서 만약에 다음 행이 있으면
true, 다음 행이 없으면 false를 반환하는 함수다. while(rs.next())를 하게되면 한 루프가 돌아갈 때 마다 1행씩 넘겨주다가
더이상 행이 없으면 while문이 끝나게 된다.
rs.getString() - getString함수는 해당 순서의 열에있는 데이터를 String형으로 받아온단 뜻이다.
예로들어 rs.getString(2)를 하게되면 2번째 열에있는 데이터를 가져오게 된다. (getInt, getFloat등 도 있음)
출처: https://reallemonjuice.tistory.com/46 [byungmeo:티스토리]
'Java' 카테고리의 다른 글
[Java] JDBC 사용 객체(DriverManager, Connection, Statment, PrepareStatement, CallableStatement, ResultSet) (0) | 2022.10.03 |
---|---|
[Java] printStackTrace (0) | 2022.10.03 |
[Java] 블로그 일기 형식 자동 출력 코딩 (0) | 2022.10.03 |
[Java] 문자열 자르기(substring) (0) | 2022.10.03 |
[Java] 특정 날짜의 요일 구하기 (숫자, 영문, 한글) (0) | 2022.10.01 |