본문 바로가기
프로그래밍/JAVA,JSP

JSP DB - JDBC구성

by 판데스 2009. 12. 3.
반응형
JDBC를 구현하는 절차를 간단한 예제를 통해서 알아보겠습니다. 기본 구현이라고는 하지만 JDBC 드라이버의 로딩, 연결설정, 질의수행, 결과처리 등 JDBC의 전반적인 사용법에 대해 모두 살펴볼 것입니다. 먼저 SELECT 쿼리 명령이 아닐 때의 구현 절차부터 살펴보도록 하겠습니다. 

▣ JDBC 구현의 절차
◈ 1. JDBC Driver 로딩(Class.forName())
◈ 2. DriverManager를 이용해서 Connection 얻기(getConnection())
◈ 3. Connection으로부터 Statement 생성(createStatement())
◈ 4. Statement를 이용해서 SQL문 질의(executeUpdate())
◈ 5. Statement 닫기, Connection 닫기(close())

SQL 쿼리 중 SELECT 쿼리가 아닌 경우는 전부 위의 절차대로 구현이 됩니다. SELECT 쿼리를 보낼 때에는 ResultSet이라는 결과가 반환되기 때문에 ResultSet을 처리하는 부분이 추가되어야 합니다. 위의 절차를 이용해서 데이터베이스 내에 새로운 테이블을 만드는 예를 알아보도록 하죠.

『chap15\HelloJDBC.java』
ⓙ───────────────────────────────────────
/** 
테이블 생성하는 예제
**/
import java.sql.*;
public class HelloJDBC{
    public static void main(String[] args)
            throws ClassNotFoundException, SQLException{
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
        String url = "jdbc:microsoft:sqlserver://localhost:1433";
        String id = "javadbo";
        String pass = "javadbo";
        Connection conn = DriverManager.getConnection(url,id,pass);
        Statement stmt = conn.createStatement();
        String sql = "create table MyHello(name varchar(20), age int) ";
        stmt.executeUpdate(sql);
        System.out.println(" MyHello 테이블 생성 OK!" );
        stmt.close();
        conn.close();
    } //end of main
} //end of HelloJDBC class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap15>javac HelloJDBC.java
C:\javasrc\chap15>java HelloJDBC
 MyHello 테이블 생성 OK!
***/
───────────────────────────────────────ⓑ

먼저 JDBC를 이용하기 위해서 java.sql 패키지를 import하고 있습니다.

◈ import java.sql.*;

그리고 SQLServerDriver JDBC 드라이버를 Class.forName() 메서드를 통해서 로딩시킵니다. 다시 한번 말하지만 여기서 로딩할 MS-SQL JDBC 드라이버는 클래스 패스에 잡혀 있어야 합니다. 

▣ JDBC Driver 로딩(Class.forName())
◈ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 

JDBC 드라이버를 관리하는 DriverManager로부터 Connection 객체를 생성합니다. 여기서 getConnection() 메서드의 매개변수로는 데이터베이스의 위치(url)와 아이디(id) 그리고 비밀번호(pass)가 문자열 형태로 들어갑니다.

▣ DriverManager를 이용해서 Connection 얻기(getConnection())
◈ Connection conn = DriverManager.getConnection(url,id,pass);

이 때 데이터베이스의 위치를 명시하는 url을 보시면 다음과 같이 특수한 방법으로 데이터베이스의 위치를 지정하고 있습니다.

▣ 데이터베이스의 위치
◈ jdbc:microsoft:sqlserver://localhost:1433

이것은 데이터베이스마다 약간씩 다르며, MS-SQL Driver를 다운로드받았을 때의 매뉴얼를 참고하시면 쉽게 데이터베이스의 위치를 작성할 수 있습니다. 그리고 데이터베이스 계정의 아이디와 비밀번호를 입력하시면 됩니다.

세 번째 절차로 Connection 객체 conn으로부터 Statement 객체를 생성합니다. Statement 객체는 데이터베이스에 질의를 하거나 작업 명령을 전달하는데 사용됩니다.

▣ Connection으로부터 Statement 생성(createStatement())
◈ Statement stmt = conn.createStatement();

생성된 Statement 객체 stmt를 통해서 쿼리문을 데이터베이스로 전송해서 작업을 처리합니다. 이 때 이용하는 메서드가 바로 executeUpdate()입니다. 

▣ Statement를 이용해서 SQL문 질의(executeUpdate())
◈ stmt.executeUpdate(sql);

위에서 sql에 해당하는 쿼리는 MyHello라는 테이블을 작성하기 위한 쿼리입니다. 마지막으로 열려진 Statement와 Connection을 닫아주면 됩니다.

▣ Statement 닫기, Connection 닫기(close())
◈ stmt.close();
◈ conn.close();

대부분의 데이터베이스 명령들은 위의 절차대로 처리하면 됩니다. 물론 SELECT와 관련된 쿼리는 ResultSet이 추가되어야 하지만, SELECT 이외의 명령들은 전부 위의 방법을 사용하니 꼭 기억해 두시기 바랍니다. 

위의 절차를 이용해서 데이터를 삽입해 보도록 하겠습니다. 앞의 예제에서 데이터를 삽입할 수 있는 SQL 쿼리만 변경하시면 됩니다. MyHello라는 테이블에 데이터를 삽입하는 예는 다음과 같습니다.

『chap15\HelloInserter.java』
ⓙ───────────────────────────────────────
/** 
테이블에 데이터를 삽입하는 예
**/
import java.sql.*;
public class HelloInserter{
    //main()의 매개변수
    //args[0] : 이름
    //args[1] : 나이
    public static void main(String[] args)
                           throws ClassNotFoundException, SQLException{
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
        String url = "jdbc:microsoft:sqlserver://localhost:1433";
        String id = "javadbo";
        String pass = "javadbo";
        Connection conn = DriverManager.getConnection(url,id,pass);
        Statement stmt = conn.createStatement();
        String sql = "insert into MyHello values('" +args[0]+ "'," +args[1]+ ")"; 
        int r = stmt.executeUpdate(sql);
        System.out.println(r + " 데이터 삽입 OK" );
        stmt.close();
        conn.close();
    } //end of main
} //end of HelloInserter class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap15>javac HelloInserter.java
C:\javasrc\chap15>java HelloInserter 홍길동 20
1 데이터 삽입 OK

C:\javasrc\chap15>java HelloInserter 박문수 40
1 데이터 삽입 OK
***/
───────────────────────────────────────ⓑ

데이터베이스의 테이블에 데이터가 삽입되었는지 직접 확인해 보시기 바랍니다. 데이터를 삽입했다면 출력을 해보도록 하겠습니다. 데이터베이스에서 테이블의 데이터를 출력하기 위해서는 SELECT 쿼리를 이용합니다. SELECT 쿼리를 사용할 때 자바의 프로그램 절차는 다음과 같습니다.

▣ SELECT 쿼리에 대한 JDBC 구현 절차
◈ 1. JDBC Driver 로딩
◈ 2. DriverManager를 이용해서 Connection 얻기
◈ 3. Connection으로부터 Statement 생성
◈ 4. Statement를 이용해서 SQL문 질의(executeQuery())
◈ 5. SQL문 질의에 대한 반환결과로 ResultSet 얻기
◈ 6. ResultSet 출력하기
◈ 7. ResultSet 닫기, Statement 닫기, Connection 닫기

테이블 생성이나 데이터 삽입의 절차와 달리 SELECT 쿼리를 사용할 때에는 ResultSet이라는 것을 얻어내는 과정이 포함되어 있습니다.

『chap15\HelloSelector.java』
ⓙ───────────────────────────────────────
/** 
테이블의 데이터를 읽어오는 예
**/
import java.sql.*;
public class HelloSelector{
    public static void main(String[] args)
            throws ClassNotFoundException, SQLException{
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
        String url = "jdbc:microsoft:sqlserver://localhost:1433";
        String id = "javadbo";
        String pass = "javadbo";
        Connection conn = DriverManager.getConnection(url,id,pass);
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select * from MyHello");
        while(rs.next()){
            System.out.print(rs.getString("name") + " ");
            System.out.println(rs.getInt("age"));
        }
        rs.close();
        stmt.close();
        conn.close();
    } //end of main
} //end of HelloSelector class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap15>javac HelloSelector.java
C:\javasrc\chap15>java HelloSelector
홍길동 20
박문수 40
***/
───────────────────────────────────────ⓑ

JDBC Driver 로딩 과정, DriverManager를 이용해서 Connection을 얻어내는 과정, Connection을 이용해서 Statement를 생성하는 과정은 동일합니다. 

▣ 1. JDBC Driver 로딩(Class.forName())
◈ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 

▣ 2. DriverManager를 이용해서 Connection 얻기(getConnection())
◈ Connection conn = DriverManager.getConnection(url,id,pass);

▣ 3. Connection으로부터 Statement 생성(createStatement())
◈ Statement stmt = conn.createStatement();

SELECT 쿼리일 경우 Statement로 데이터베이스에 질의를 할 때 executeQuery()를 사용합니다. 이 때 리턴되는 결과값은 ResultSet입니다.

▣ 4. Statement를 이용해서 SQL문 질의(executeQuery())
◈ ResultSet rs = stmt.executeQuery("select * from MyHello");

ResultSet은 키(Key)를 움직이는 방식이기 때문에 먼저 키를 이동시킨 후 데이터를 읽어내면 됩니다. 처음 ResultSet을 리턴받았을 때 키는 데이터의 첫부분의 앞을 가리키고 있습니다. 즉 어떠한 데이터도 가리키지 않고 있습니다. 키를 움직이기 위해서는 next()를 사용합니다. next()를 호출할 때 키가 데이터가 있는 곳으로 이동되면 true를, 실패하면 false를 리턴합니다. 키를 움직이면서 전체 데이터를 얻어내는 방법은 다음과 같습니다.

▣ 키를 움직이면서 전체 데이터 얻어내기
◈ while(rs.next()){
◈        System.out.print(rs.getString("name") + " ");
◈        System.out.println(rs.getInt("age"));
◈ }

키가 존재하는 곳의 데이터를 읽어낼 때에는 ResultSet에서 제공하는 getXxx() 계열의 메서드를 이용하면 됩니다. 만약 테이블의 필드가 char형이면 getString()을, int형이면 getInt()를 호출하며 현재의 키가 가리키고 있는 레코드의 데이터를 추출할 수 있습니다.

마지막으로 모든 데이터를 사용하고 나면 ResultSet부터 닫아주면 됩니다. 

▣ 5. ResultSet 닫기, Statement 닫기, Connection 닫기(close())
◈ rs.close();
◈ stmt.close();
◈ conn.close();

지금까지 CREATE, INSERT, SELECT의 명령을 JDBC를 이용해서 처리해 보았습니다. 만약 UPDATE와 DELETE 같은 쿼리를 사용하고자 한다면 CREATE에서 사용한 절차를 이용하시면 됩니다.

반응형

'프로그래밍 > JAVA,JSP' 카테고리의 다른 글

Java - JDK 환경설정  (0) 2011.12.04
JAVA - 제어문  (0) 2010.01.15
JSP - JSP의 구성요소  (0) 2009.12.03
Java - 객체 지향의 개요  (0) 2009.12.03
Java - 클래스  (0) 2009.12.03