티스토리 뷰
JDBC(Java DataBase Connectivity)
-
JDBC는 자바 애플리케이션에서 표준화된 방법으로 다양한 데이터베이스에 접속할 수 있도록 설계된 인터페이스
-
JDBC 스펙에 따라 데이터베이스 개발 회사는 자사 제품에 접속할 수 있는 JDBC 드라이버를 제공
JDBC 프로그래밍 단계
1단계) JDBC 드라이버 로드
-
데이터베이스에 접속하려면 먼저 해당 데이터베이스의 JDBC 드라이버를 로드해야 한다.
-
일반적으로 Class.forName() 메서드를 이용하여 JDBC 드라이버를 직접 프로그램 코드에서 로드한다.
-
데이터베이스마다 구현한 클래스 이름이 다름으로 다른 데이터베이스를 사용한 경우 해당 클래스 이름을 사전에 알아 두어야 한다.
Class.forName("com.mysql.jdbc.Driver");
2단계) 데이터베이스 연결
- JDBC URL
JDBC URL은 데이터베이스에 대한 다양한 정보를 포함한다. JDBC URL 구조는 다음과 같다. 각 데이터베이스별로 JDBC URL이 다르다.
jdbc:<하위 프로토콜>:<데이터 원본 식별자>
MySql은 다음과 같은 형식을 취한다.
jdbc:mysql://IP주소:PORT(옵션)/스키마
-
IP 주소 : MySQL 데이터베이스가 설치된 컴퓨터의 IP주소, 또는 도메인 이름
-
포트 : 기본 설정 값인 3306 포트를 사용하는 경우에는 생략할 수 있다.
-
스키마 : 데이터베이스에서 생성한 스키마(데이터베이스) 이름이다.
- Connection 클래스 인스턴스 레퍼런스 얻기
DriverManager의 getConnection 메서드를 이용
Connection conn = DriverManger.getConnetion(JDBC_URL, “아이디”, “비밀번호”)
- JDBC_URL : 해당 데이터베이스에 맞게 미리 정의되어 있는 문자열
- 아이디와 비밀번호 : 데이터베이스 자체에서 관리하는 계정의 아이디와 비밀번호
3단계) Statement 생성
Statement는 데이터베이스 연결로부터 SQl문을 수행할 수 있도록 하는 클래스로, 대표적으로 다음과 같은 메서드가 사용된다.
- executeQuery() : SELECT문을 수행할 때 사용. 반환 값은 ResultSet 클래스의 인스턴스로, 해당 SELECT문의 결과에 해당하는 데이터에 접근하는 방법을 제공한다
- executeUpdate() : UPDATE, DELETE와 같은 문을 수행할 때 사용. 반환 값은 int 값으로, 처리된 데이터의 수를 반환한다.
Statement stmt = conn.createStatement();
Stmt.executeQuery(“select name from member”);
PreparedStatement
Sql문을 미리 만들어두고 변수를 따로 입력하는 방식이며, Statement 클래스를 상속받기 때문에 Statement 클래스 메서드를 모두 사용할 수 있다.
PreparedStatement pstmt = conn.prepareStatement(“insert into test value(?,?)”);
pstmt.setString(1, request.getParameter(“username”);
pstmt.setString(2, request.getParameter(“email”);
pstmt.executeUpdate();
Statement의 종료
다른 JDBC 리소스와 마찬가지로 Statement 역시 사용하지 않을 때에는 닫아주어야 한다.
stmt.close()
pstmt.close()
4단계) SQL문 전송
Statement 나 PreparedStatement의 executeUpdate(), executeQuery() 메서드를 사용하면 된다.
Int count = pstmt.executeUpdate();
- executeUpdate() 메서드는 처리한 로우의 개수를 반환하며, 처리된 항목이 없다면 0 을 반환한다.
5단계) 결과 받기
executeQuery()를 사용한 경우 결과 데이터를 처리하기 위한 ResultSet 객체가 필요하다.
ResultSet rs = pstmt.executeQuery();
- ResultSet은 조회한 결과 값에 순차적으로 접근할 수 있다.
- ResultSet은 실제 처리 결과의 데이터가 모두 있는 구조가 아니라, 데이터의 인덱스 정보만 있는 구조이다. 따라서 ResultSet만 가져오고 연결을 끊으면 안되며, 필요한 데이터를 모두 가져온 이후, ResultSet을 close()하고, 그 다음 connection을 close()해야 한다.
ResultSet rs = pstmt.executeQuery();
While(rs.next()){
name = rs.getString(1); // or rs.getString(“name”);
age = rs.getInt(2); // or rs.getString(“age”);
}
- ResultSet은 next() 메서드를 이용해서 다음 로우로 이동할 수 있다.
- 로우에서 각각의 칼럼 값을 가져오려면 rs.getXxx() 메서드를 이용한다.
- getXxx()에서 칼럼을 지정하는 방법으로는 해당 칼럼의 index값이나 칼럼 이름을 사용한다.
- 가급적 index보다 칼럼 이름을 사용하는 것을 권장한다.( 코드 이해를 돕고, 유지 보수에도 편리)
6단계) 연결 해제
- 데이터베이스와 연결을 관리하는 Connection 인스턴스는 사용한 뒤 반납하지 않으면 계속해서 연결을 유지하게 되며, 자원의 낭비된다.
- 사용자가 많은 시스템 일 수록 커넥션 관리가 중요하다.
conn.close();
참고
- 황희정, "프로젝트로 배우는 자바 웹프로그래밍", 한빛아카데미
'개발' 카테고리의 다른 글
[JAVA] Servlet 생명주기 (0) | 2019.05.21 |
---|---|
[C++] string 클래스 정리 - ③Capacity (0) | 2019.05.21 |
[C++] string 클래스 정리 - ②Iterators (0) | 2019.05.21 |
[C++] string 클래스 정리 - ①string 생성 (0) | 2019.05.21 |
[JAVA] Servlet구조와 HttpServlet 클래스 (1) | 2019.05.20 |
- Total
- Today
- Yesterday
- 바닐라자바스크립트
- 비밀번호 유효성 검사
- 리액트 네이티브 모듈
- rn
- Java
- TODOLIST
- web
- string 생성
- JavaScript
- 바닐라 자바스크립트
- sevlet
- C++ string
- JSP 내장객체
- loading bar
- 리액트 네이티브
- servlet 생명주기
- 투두리스트
- string
- Android
- VanilaJS
- 개발
- JSP
- C++
- CSS
- Servlet
- react-native-swipe-list-view
- HTML
- ReacNative
- ReactNative
- 자바스크립트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |