JDBC(Java Database Connectivity)
JDBC란 자바에서 DB와 통신할 수 있게 사용되는 표준 SQL 인터페이스 API이다.
실제 DB 관련 기능이 동작하려면 java.sql의 인터페이스들을 상속하여 메소드의 몸체를 구현한 클래스 파일들이 필요하다.
이 파일들을 JDBC드라이버라고 하며, 접속하려는 DBMS 서버에 따라서 각 홈페이지에서 다운로드할 수 있다.
JDBC 실행 순서 및 예제
1.JDBC 드라이버 로딩 (Mysql 기준)
JDBC 드라이버를 메모리에 동적으로 로딩하기 위해서는 Class.forName();
을 이용한다.
Class.forName("com.mysql.jdbc.Driver");
2.DBMS 서버 접속 - Connection
java.sql 패키지의 DriverManager 클래스의 getConnection();
메소드를 사용한다.
인자 값으로는 프로토콜, 서버 주소, 서버 포트, 사용할 데이터베이스 이름으로 구성된다.
String dbURL = "jdbc:mysql://localhost:3306/bbs?serverTimezone=Asia/Seoul";
String dbId = "root";
String dbPassword = "1234";
conn = DriverManager.getConnection(dbURL, dbId, dbPassword);
3.SQL문 전송- Statement
Connection으로 자바 프로그램와 DB 연결이 되었다면, 이제 자바 프로그램은 DB 쪽으로 SQL문을 전송해야 하는데 그 쿼리문을 전송하는 객체가 Statement, PreparedStatement이다.
둘 중 PreparedStatement가 가독성, 유지보수성이 좋아 자주 사용한다고 한다. (뒤에서 자세히 알아보자)
- Statement
Statement stmt = conn.createStatement();
4.SQL문 실행
Statement 클래스는 스스로 SQL 구문 해석을 못하고, 전달 역할만 한다.
때문에 SELECT문의 결괏값을 가지고 있는 객체 ResultSet을 사용해야 한다.
* INSERT, DELETE, UPDATE문은 ResultSet 객체를 사용하지 않고 Statement객체의 executeUpdate메소드를 사용한다.
String sql = "SELECT * FROM book";
Result res = stmt.executeQuery(sql);
while (res.next()) {
int bookId = res.getInt("book_id");
String bookName = res.getString("book_name");
String bookLoc = res.getString("book_loc");
out.print("bookId : " + bookId + ", ");
out.print("bookName : " + bookName + ", ");
out.print("bookLoc : " + bookLoc + "</br>");
}
커서의 다음 위치가 없을 때까지 while문을 돌려 데이터들을 출력해보자.
ResultSet객체는 커서를 갖고 내부적으로 위치를 가리키는데 다음의 메소드들을 이 커서의 위치를 이동시킨다.
- void afterLast() - 커서를 끝 빈 행으로 위치시키는 메소드
- void beforeFirst() - 커서를 시작 빈행으로 위치시키는 메소드
- boolean next() - 커서 다음에 레코드가 있는지 판단하여 있으면 true,없으면 false를 반환하여 이동시킨다.
5.자원해제
DB 관련 처리 작업이 완료된 다음에는 사용했던 객체들을 메모리에서 해제해주어야 하는데,
순서는 최근에 사용했던 객체부터 거꾸로 올라가며 해제한다.
위의 코드로 보면 ResultSet, Statement, Connection 순서로 해제해야 한다.
if(res != null) res.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
PreparedStatement
만약 Statement로 insert문을 실행하면 코드가 가독성도 낮고 오류가 나기 쉽다.
stmt = con.createStatement();
String sql = "INSERT INTO book(book_id, book_name, book_loc)";
sql += " VALUES (BOOK_SEQ.NEXTVAL, '" + bookName + "', '" + bookLoc + "')";
int result = stmt.executeUpdate(sql);
하지만 PreparedStatement 객체를 사용하면 ? 기호를 사용해 값을 동적으로 지정할 수 있다.
이런 식의 코드는 가독성이 높고 유지 보수하기 좋아 요즘 많이 사용한다고 한다.
String sql = "UPDATE book SET book_loc = ? WHERE book_name = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, "001-00007123");
pstmt.setString(2, "book7");
Statement와 PreparedStatement객체의 가장 큰 차이는 캐시 사용 유무이다.
statement와 달리 preparedStatement는 객체를 캐시에 담아 재사용하기 때문에 반복적인 쿼리 수행에 좋다.
[참고] 인프런 - 백기선 님의 실전 JSP - 신입 프로그래머를 위한 강좌를 보고 공부한 내용을 바탕으로 작성했습니다.
'💻 Dev > JSP & Servlet' 카테고리의 다른 글
JSP 파일이 브라우저 화면에 출력되기까지의 과정 (0) | 2025.01.09 |
---|---|
[JSP] 게시판 미니 프로젝트 - MVC2패턴 적용 (0) | 2020.10.26 |
[JSP] 10.세션(Session) (0) | 2020.09.15 |
[JSP] 9.쿠키(Cookie) (0) | 2020.09.10 |
[JSP] 8.jsp request,response (0) | 2020.09.01 |
[JSP] 7.form 데이터 처리 (0) | 2020.08.31 |