본문 바로가기

JSP

JDBC 프로그래밍

○ JDBC 프로그래밍

JDBC(Java DataBase Connectivity)는 자바 프로그램에서 데이터베이스와 연결하여 데이터 베이스 관련 작업을 할 수 있도록 해주는
자바 프로그래밍 인터페이스를 위한 API(Application Programming Interface) 규격이다



JDBC는 Driver, DriverManager, Connection, Statement, PreparedStatement, ResultSet, ResultSetMetaData, DatabaseMetaData, Types, DataSource 등 여러 개의 클래스와 인터페이스로 구성된 페이지 java.sql과 javax.sql로 구성되어 있다

JDBC는 다음과 같은 데이터 베이스 기능을 지원하기 위한 표준 API를 제공한다

  • 데이터 베이스를 연결하여 테이블 형태의 자료를 참조
  • SQL 질의
  • SQL 질의 결과를 처리



○ JDBC의 역할

ODBC는 JDBC보다 먼저 마이크로소프트 회사가 개발한 것으로 C 또는 C++ 등의 언어를 이용하여 DBMS에 독립적으로
데이터 베이스 프로그램을 가능하도록 하는 API 규격이다


JDBC도 ODBC와 마찬가지로 DBMS의 종류에 상관없이 쉽게 SQL문을 수행하고 그 결과를 처리할 수 있도록 설계되어 있다
DBMS에 독립적인 프로그램이 가능하도록 하려면 JDBC와 함께 JDBC Driver도 필요하다





○ JDBC Driver 종류

JDBC Driver는 JDBC 인터페이스에 맞추어 해당 DBMS에서 JDBC 관련 API 호출이 가능하도록
관련 인터페이스와 클래스를 구현한 클래스 라이브러리이다

  • JDBC-ODBC 브릿지 드라이버
  • Native API 드라이버
  • Net-Protocal 드라이버
  • Native-Protocal 드라이버



○ JDBC 프로그래밍 절차

1) JDBC 드라이버 로드

Class.forName("oracle.jdbc.driver.OracleDriver");



//OracleDriver의 객체를 만들어 주는 역할을 한다. 데이터베이스와 자바를 연결해주는 역할을 한다
//Class 클래스 : 클래스의 정보를 얻기 위한 클래스이다


=>
인터페이스 드라이버(Interface Driver)를 구현(Implements)하는 작업으로,
Class 클래스의 forName() 메소드를 사용해서 드라이버를 로드한다
forName(String className) 메소드는 문자열로 주어진 클래스나 인터페이스 이름을 객체로 리턴한다




2) 데이터베이스 연결

String dbURL = "jdbc:oracle:thin:@localhost:1521:ORCL";
Connection con = DriverManager.getConnection(dbURL, "scott", "tiger");



//dbURL : 오라클 서버의 URL
//서버와 연결해주는 역할을 하는 DriverManager의 getConnection 메소드를 통해 매개변수로
 서버 주소와 아이디, 비밀번호를 넘겨주어 연결한다


=>
Connection 객체를 연결하는 것으로 DriverManager에 등록된 각 드라이버들을 getConnection(String url)메소드를 사용해서 식별한다
이때 url 식별자와 같은 것을 찾아서 매핑(mapping)하고 찾지 못하면 no suitable error가 발생한다




3) SQL을 위한 Statement 객체 생성

PreparedStatement pstmt = null;
String sql = "실행할 sql문";
pstmt = con.prepareStatement(sql);


-> String sql = "select * from student where name like ?";
 pstmt.setString(1, name);

//첫번째 ?에 name을 대입한다
//?가 여러 개일 때 위치에 따라 지정한다(sal >= ? AND sal <= ? → 1번, 2번)
//이걸 가능하게 해주는 것이 PreparedStatement이다



Statement stmt = null;
stmt = con.createStatement();



//PreparedStatement 클래스는 sql문을 실행시켜 주는 역할을 하는 클래스이다
//연결한 객체를 통해 prepareStatement() 메소드에 접근하여 담긴 sql문장을 대입한다
//prepareStatement(), createStatement() : 데이터베이스로 쿼리를 담아서 전송할 수 있는 메소드


=>
SQL 쿼리를 생성/실행하며, 반환된 결과를 가져오게 할 작업 영역을 제공한다
Statement 객체는 Connection 객체의 createStatement() 메소드를 사용하여 생성된다




4) SQL 문장 실행

ResultSet result = pstmt.executeQuery();


ResultSet result = stmt.executeQuery("select * from student");


=>
Statement 객체가 생성되면 Statement 객체의 'executeQuery()' 메소드나 'executeUpdate()' 메소드를 사용해서 쿼리를 처리한다


=>
String sql = "update table set password = '0529' where id = 'Tony'";
stmt.executeUpdate(sql);



● 객체 Statement에서 SQL 질의 문장을 실행하는 메서드

메소드 종류 반환 자료형 특징
executeQuery() ResultSet SELECT와 같이 데이터베이스에 변경을 주지 않는 SQL 문장을 실행할 때 사용하며
그 결과로 ResultSet 객체를 반환
executeUpdate() int INSERT, UPDATE, DELETE와 같이 데이터베이스 구조 또는 값을 변경시키는 질의(DML),
CREATE, DROP과 같은 DDL 구문을 사용할 때 사용한다
질의 수행 후 영향을 받은 행의 수를 정수로 반환한다
execute() boolean 실행할 SQL문이 어떠한 종류의 것인지 모를 경우에 사용한다
결과가 ResultSet이면 true, 결과가 행의 수 이거나 없으면 false를 반환한다




5) 질의 결과 ResultSet 처리(executeQuery()를 할 때만 필요)

while(result.next()) {
  String col1 = result.getString(1);
  ....;
}


=>
executeQuery() 메소드는 결과로 ResultSet을 반환하는데 이 ResultSet으로부터 원하는 데이터를 추출하는 과정을 말한다

  • 데이터를 추출하는 방법은 ResultSet에서 한 행씩 이동하면서 get...()를 이용하여 원하는 필드 값을 추출하는데,
    이때 rs.getString("name") 혹은 rs.getString(1)을 사용한다 (필드명을 쓰거나 칼럼 순서대로 숫자를 쓰거나)
  • ResultSet의 첫 번째 필드는 1부터 시작한다
  • 한 행이 처리되고 다음 행으로 이동 시 next() 메소드를 사용한다

while(rs.next()) {
  out.println(rs.getString("id");
  out.println(rs.getString("password");
}




6) JDBC 객체 연결 해제

result.close();
pstmt.close();
con.close();

'JSP' 카테고리의 다른 글

Statement와 PreparedStatement  (0) 2020.07.08
Connection Pool  (0) 2020.07.08
Session과 Cookie  (0) 2020.07.04
page와 pageContext 내장 객체  (0) 2020.07.03
config와 application 내장 객체  (0) 2020.07.03