티스토리 뷰

개발

[JAVA] JDBC 프로그래밍

woody._.k 2019. 5. 20. 18:57

 

JDBC(Java DataBase Connectivity)


JDBC 구조

 

  • JDBC는 자바 애플리케이션에서 표준화된 방법으로 다양한 데이터베이스에 접속할 수 있도록 설계된 인터페이스 

  • 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 클래스 인스턴스 레퍼런스 얻기

DriverManagergetConnection 메서드를 이용

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만 가져오고 연결을 끊으면 안되며, 필요한 데이터를 모두 가져온 이후, ResultSetclose()하고, 그 다음 connectionclose()해야 한다.
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();

 

참고

  • 황희정, "프로젝트로 배우는 자바 웹프로그래밍", 한빛아카데미
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함