본문 바로가기

IT_Term

[IT_Term] java_JDBC프로그래밍_방통대 교재 정리

728x90

#####. JDBC

###. Java DataBase Connecticity

#. 자바 프로그램에서 관계형 데이터베이스 RDBMS(Relational Database Management System)와 연동할 수 있도록 제공하는 표준 API이다.

#. RDBMS와 연동하려면 RDBMS의 표준 질의어인 SQL을 프로그램 내에서 처리할 수 있어야 하는데 JDBC가 제공하는 API가 그것을 가능하게 해줌

#. JDBC API는 RDBMS 제조사가 제공하므로 JDBC 드라이버를 통해 구현됨

#. 따라서 특정 RDBMS와 연동하는 자바 프로그램을 작성하려면 그회사가 제공하는 JDBC드라이버를 설치해야 한다.

#. 2-tier / 3-tier

 - 2-tier

 : (Client Applicaiton : JDBC Driver) < - > DBMS

 - 3-tier

 : Client Application < - > (Application Server : JDBC Driver) < - > DBMS

 - 3티어 구조에서는 DBMS와 연동하는 서비스를 Middle-tier Server가 제공하고 클라이언트는 Middle-tier Server가 제공하는 서비스를 사용하는 구조로 구성된다.

 

###. JDBC 프로그래밍 준비

#. 일반적으로 JDBC를 이용하는 프로그램은 다음과 같은 과정을 거쳐 작성

 - 사용하고자하는 RDBMS에서 제공하는 JDBC 드라이버를 설치

 - JDBC 드라이버를 로드 : 드라이버를 로드할 때는 클래스의 동적 바인딩을 제공하는 Class 클래스의 static 메서드인 forName()메서드를 사용

 - DBMS와 연결 설정 : java.sql 패키지가 제공하는 Connection 객체를 사용

 - SQL을 실행 : select 구문을 실행할 떄에는 java.sql 패키지가 제공하는 Statement 객체와 ResultSet 객체를 사용. Statement 객체는 SQL구문을 표현한 것이고, ResultSet은 select 구문을 실행한 결과를 다루기 위한 객체

#. JDBC 드라이버 로드

 - 드라이버는 동적 바인딩 방식으로 로드

 - Class.forName() 메서드를 사용

 - MySQL 용 JDBC 드라이를 로드하는 코드

 : Class.forName("com.mysql.jdbc.Driver").newInstance();

#. DBMS와 연결

 - MySQL과 연결할 떄에는 java.sql 패키지가 제공하는 Connection 객체를 사용

 - DriverManager클래스의 getConnection()메서드를 이용

 - getConnection (String url, String user, String password)메서드는 static 메서드로 url은 서버와 데이터베이스 위치를 나타내고 사용자아이디인 user와 비밀번호 password를 지정

 : 소스코드

String url = "jdbc:mysql:"; //서버 주소 / 데이터베이스 이름

  String user = "내 아이디";

  String password = "내 비밀번호";

Connection con = DriverManager.getConnection(url, user, password);

#. SQL 실행하고 그결과 받아오기

 - SQL 구문을 실행 시킬 떄는 Statement 객체를 사용하고 select 구문의 실행 결과를 받아올 떄는  ResultSet 객체를 사용

 - Statement 객체는 Connection 객체가 제공하는 createStatement() 메서드를 이용하여 생성

 - ResultSet 객체는 Statement 객체의 executeQuery() 메서드를 이용하여 생성

 - 소스코드

Statement stms = conn.createStatement();

ResultSet rs = stmt.executeQuery("select * from t_member");

while(rs.next()){

syso(rs.getString("member_name"));

}

 - Oracle과 연동할 떄는 MySQL과 마찬가지로 Oracle에서 제공하는 JDBC드라이버를 다운받아 적당한 디렉토리에 설치하고 CLASSPATH를 추가한다.

 - Oracle JDBC 드라이버는 orcle.jdbc.OracleDriver 클래스를 사용하며 Oracle에 접속을 위한 url은 "jdbc:oracle:thin:@localhost:1521:orcl"을 사용하면 된다.

 

###. DatabaseMetaData 객체 생성

#. DatabaseMetaData 객체는 Connection 객체의 getMetaData () 메서드로 생성되는데 연결된 DBMS에 대한 각종 정보를 포함

 

#. 주요 메서드

 - String getDriverName() : 현재 연결에 사용된 JDBC 드라이버 이름을 리턴

 - String getURL () : 현재 연결에 사용된 DBMS URL을 리턴

 - String getUserName () : 현재 연결에 사용된 사용자 아이디를 리턴

 

###. Statement 객체

#. SQL 질의를 실행할 떄 사용되는 Statement 객체는 Connection 객체의 createStatement() 메서드로 생성되는데 SQL 질의를 실행하는 데 사용된다. select 구문을 실행하면 실행결과를 리턴하게 되고 그 외 구문을 실행하면 아무것도 리턴하지 않는다.

#. 주요 메서드

 - boolean execute(String sql) : sql에 주어진 SQL문을 실행 시킨다. 만일 select 구문을 실행한 경우에는 rue를 리턴 그렇지 않은 경우 false를 리턴. true를 리턴하는 경우에는 getResultSet() 메서드를 이용하여 ResultSet객체를 생성 시킬 수 있다. update, insertm delete 구문을 사용하는 경우에는 false를 리턴한다. 그리고 이떄는 getUpdateCount() 메서드를 이용하여 영향을 받은 레코드의 개수를 알아낼 수 있다.

 - execute() 메서드의 사용 예이다.

stmt = conn.createStatement();

if( stmt.execute("select * from book"))

  rs = stmt.getResultSet();

 - ResultSet executeQuert(String sql) : select 구문을 실행 시킬 떄 사용

 - int executeUpdate(String sql) : select를 제외한 나머지 insert, create, update, delpete 구문을 실행할 떄 사용

 - ResultSet getResultSet() : 현재 SQL 구문을 실행한 결과를 리턴 select 구문을 실행했을 경우만 유효

 - int getUpdateCount() : 현재 SQL 구문의 실행으로 영향을 받은 행의 개수를 리턴. select를 제외한 나머지 구문에 대해서만 유효

 

###. Result 객체

#. Statement 객체의 getResultSet(), executeQuery() 메서드가 리턴하는 객체로 elect 구문 실행결과를 다룰 떄 사용

#. select 구문을 실행하여 ResultSet 객체가 생성되면 커서(cursor)가 만들어지고 select 구문 실행결과를 가리킨다.

#. 주요 메서드

 - boolean next(): 커서를 다음 행으로 이동시킨다. Result객체가 처음 생성된 직후에 next()메서드를 한 번 호출해야 커서가 첫번쨰 행을 가리킨다. 성공적으로 커서가 이동하면 true를 리턴하고, 더이상 결과가 없어서 커서를 이동시킬 수 없으면 false를 리턴한다.

 - boolean previous() :커서를 이전 행으로 이동시킨다.

 - Statement getStatement() : 현재  ResultSet를 생성시킨 Statement 객체륽 리턴

 - <자료형> get<자료형>(String colName) : colName에 지정된 속성명에 해당하는 실제 데이터를 리턴한다 예를들어 속성의 자료형이 String형과 호환되는 속성이라면 getString() 메서드를 사용한다. 속성이름 대신 속성의 위치정보를 colIndex로 줄 수 있다.

 

###. DMS와 Java의 자료형 변환

#. JDBC간의 변환 정보

 - 대충 감만 잡자 다쓰기 너무 힘들다.

DBMS 자료형 Java 자료형 ResultSet 메서드 PreparedStatement 메서드
CHAR String getString setString
INTEGER int getInt setInt
DOUBLE double getDouble setDouble

 

 

###. PreparedStatement  객체

#. Statement 객체의 xecute 메서드는 모두 SQL문을 컴파일하고 바로 실행시켜서 결과를 리턴하게 된다. 하지만 PreparedStatedment객체는 SQL문을 미리 컴파일하여 실행하기 직전의 상태로 만들어 둔후 실제 실행은 나중에 필요에 따라 여러번 실행시킬 수 있다. 따라서 같은 SQL문을 여러 번 실행시켜야 하는 경우에는 Statement 객체보다 PreparedStatement 객체를 사용하는 것이 효과적이다.

#. 또한 PreparedStatement 객체로 생성되는 SQL문은 마치 함수처럼 매개변수를 설정하여 필요에 따라 매개변수의 값을 바꿔 실행 시킬 수 있다.  따라서 비슷한 SQL 구문을 반복적으로 실행시켜야 하는 경우에도 유용하게 사용될 수 있다. SQL문에 매개변수를 정의할 떄는 '?'를 사용하고 매개변수에 값을 설정할 떄에는 SetXXX() 메서드를 사용한다.

#. PreparedStatemnet가 제공하는 메서드는 Statement가 제공하는 메서드와 거의 같다. 다른 점은 PreparedStatement가 매개변수를 지원하기 때문에 매개변수에 값을 설정하기 위한 setXXX() 메서드를 제공한다는 점이다.

 

#. PreparedStatement 객체 사용 예 소스

import java.sql.*;

 

public class JDBCEx{

main -------------------------\

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try{

  Class.forName("com.mysql.jdbc.Driver").newInstance();

  syso("Driver is loaded");

  String url = "jdbc:mysql";

  String user = "사용자";

   String pass = "비번";

   conn = DriverManager.getConnection(url, user, pass);

  String query = "select * from book were price > ? ";

  ps = conn.preparedStatement(querty);

  ps.setInt(1, 100);

  rs = ps.executeQuery();

   syso("제목₩t\t저자₩t가격");

  while(rs.next()){

  syso(rs.getString(1)+"\t");

  syso(rs.getString(2)+"\t");

  syso(rs.getString(3)+"\t");

}

}catch(Exception ex){

  syso(ex);

} finally{

try{

if (rs != null) rs.close();

if (ps != null) ss.close();

if (conn != null) conn.close();

}catch{ SQLException ex}{   }

}

}

 

###. ResultSetMetaData 객체

#. ResultSetMetaData 객체는 ResultSet의 getMetaData() 메서드로 생성되는데 select 구문 실행 결과에 대한 각종 정보를 이용할 떄 사용

#. 주요 메서드

 - String getColumnName(int colIndex) : colIndex 위치의 컬럼 이름을 리턴

 - int getColumnCount() : 현재 ResultSet의 컬럼 개수를 리턴

 - intColumnType(int colIndex) : colIndex 위치의 칼럼 자료형을 리턴

 - String getTableName(int colIndex) : colIndex 위치의 컬럼을 포함하는 테이블을 리턴

 

728x90