Presentation is loading. Please wait.

Presentation is loading. Please wait.

프로그래머를 위한 Java 2 제14장 JDBC 프로그래밍

Similar presentations


Presentation on theme: "프로그래머를 위한 Java 2 제14장 JDBC 프로그래밍"— Presentation transcript:

1 프로그래머를 위한 Java 2 제14장 JDBC 프로그래밍

2 14.1 SQL 기본 14.1.1 DDL(Data Definition Language) 문장들
SQL(Structured Query Language) IBM의 SEQUEL(Structured English QUEry Language)에서 연유 ANSI와 ISO에서 관계 데이터베이스의 표준 언어 SQL의 기능 데이터 정의 데이터 조작 제어 기능 DDL(Data Definition Language) 문장들 SQL에서 사용할 수 있는 DDL 문장 Create Table Drop Table Alter Table Create Index Drop Index

3 14.1 SQL 기본 Create table 문장 테이블을 생성 형태 CREATE TABLE 테이블_이름
(열_이름 데이터_타입 [NOT NULL] {, 열_이름 데이터_타입 [NOT NULL]}*); SQL이 지원하는 데이터 타입 INTEGER : 4 바이트 정수 SMALLINT : 2 바이트 정수 FLOAT(n) : 부동 소수 DECIMAL(i,j) : 고정 소수 CHAR(n) : n 문자의 문자열 VARCHAR(n) : 최대 n 문자의 문자열 DATE : 날짜(yyyymmdd) TIME : 시간(hhmmss) 예: create table orders (order_num integer, cost integer, quantity integer)

4 14.1 SQL 기본 Drop table 문장 Alter table 문장 테이블을 삭제 형태 DROP TABLE 테이블_이름;
예: drop table orders Alter table 문장 테이블에 새로운 열을 추가 ALTER TABLE 테이블_이름 ADD 열_이름 데이터_타입; 예 : alter table orders add address varchar(60);

5 14.1 SQL 기본 Create index 문장 Drop index 문장 데이터베이스 성능을 향상시키기 위한 인덱스 생성
형태 CREATE [UNIQUE] INDEX 인덱스_이름 ON 기본_테이블 (열_이름 [ASC | DESC] {, 열_이름 [ASC | DESC]}*) [CLUSTER]; 예 : create index cost_index on orders(cost); Drop index 문장 인덱스 제거 DROP INDEX 인덱스_이름; drop index cost_index;

6 14.1 SQL 기본 14.1.2 DML (Data Manipulation Language) 문장들 Select 문장
데이터 검색 Select 문장을 이용한 검색 결과는 다시 테이블이 된다. 형태 SELECT [ALL | DISTINCT] 열_리스트 FROM 테이블_리스트 [WHERE 조건] [GROUP BY 열_리스트] [HAVING 조건] [ORDER BY 열_리스트 [ASC | DESC]]; 예 : select orders.*, items.* from orders, items where orders.order_num = items.order_num order by orders.cost desc;

7 14.1 SQL 기본 SQL에서는 사용의 편리를 위해 집단 함수(aggregation function)를 제공. 이 집단 함수들은 테이블의 한 열의 값 집합에 적용 COUNT : 값의 개수 SUM : 값의 총계 AVG : 평균값 MAX : 최대값 MIN : 최소값 예 : select count(*) from orders where cost > 500; SQL에서 LIKE 문을 이용해서 정규 문법을 표현할 수 있다. select * from orders where address like '서울%';

8 14.1 SQL 기본 Update 문장 Delete 문장 기존 레코드의 열 값을 변경하기 위해서 사용 형태 UPDATE 테이블
SET 열_이름 = 산술식 {, 열_이름 = 산술식}* [WHERE 조건]; 예 : update items set price = price * 1.1 where cost > 100 ; Delete 문장 기존 테이블의 행을 삭제할 때 사용 DELETE FROM 테이블 [WHERE 조건]; delete from items where order_num = 100 ;

9 14.1 SQL 기본 Insert 문장 기존 테이블에 행을 삽입할 때 사용 형태 INSERT
INTO 테이블[(열_이름 {[, 열_이름]}*] VALUES (값_리스트); 예 : insert into orders (order_num, cost, quantity) values (200, 300, 20)

10 14.2 JDBC 기초 JDBC란? CLI SQL 문을 지원할 수 있는 함수 호출 인터페이스(CLI : Call Level Interface) MS사의 ODBC, Sun사의 JDBC JDBC 자바 통해서 DBMS와 무관하게 어디서든지 사용할 수 있는 API JDBC API는 표준적인 API만 제공할 뿐, 실질적인 작업은 JDBC 드라이버가 수행 JDBC 프로그램 구조

11 14.2 JDBC 기초 14.2.2 JDBC 프로그램 작성 DBMS에 독립적인 프로그램 작성 가능 MySQL - DBMS
에서 다운로드 받을 수 있음. JDBC 프로그래밍을 위해 필요한 것들. JDK와 DBMS(예: MySQL), DBMS에 맞는 JDBC 드라이버 mm 드라이버 사용.( ) JDBC 드라이버 설치는 다운로드 받아서 JDBC 드라이버 클래스들을 CLASSPATH에 추가하면 된다. 예: C:\> jar xvf mm.mysql-2.x.x-src.jar 압축이 풀리면 mysql.jar 파일이 나타남. 이 파일을 CLASSPATH에 추가

12 14.2 JDBC 프로그래밍 절차 1. JDBC 드라이버를 로드한다. ` 드라이버를 메모리에 로드하기 위한 방법들
예: MySQL에서 mm 드라이버를 로드하는 경우 Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 예: ODBC 브리지를 로드하는 경우 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 예: MS-SQL에서 JTurbo 드라이버를 로드하는 경우 Class.forName("com.ashna.jturbo.driver.Driver").newInstance(); JDBC 드라이버를 로드하는 방법은 드라이버마다 약간씩 다를 수 있지만, 대부분 위와 유사 JDBC 드라이버를 다운로드 받아 사용하는 경우에 반드시 드라이버에 포함된 문서와 예제 프로그램을 살펴보아야 한다. `

13 14.2 JDBC 프로그래밍 절차 2. DBMS에 컨넥션을 연다.
컨넥션은 DriverManager의 getConnection() 메소드를 이용 컨넥션을 열기 위해서는 이용하는 DBMS와 데이터베이스의 위치를 기술하기 위한 URL, DBMS의 사용자 계정, 암호가 필요 데이터베이스 위치를 기술하기 위한 URL은 JDBC URL이라고 한다. 형태: jdbc:<subprotocol><subname> jdbc는 JDBC URL임을 표시하기 위한 것으로 항상 사용 subprotocol 부분은 JDBC 드라이버를 기술하기 위해서 사용 subname 부분은 데이터베이스를 찾기 위해서 사용되는 부분

14 14.2 JDBC 프로그래밍 절차 MySQL에서 mm 드라이버를 사용하는 경우의 JDBC URL 형태
mysql이 subprotocol이고, :// 부분부터 나머지가 subname이 됨. 형태: jdbc:mysql://[hostname][:port]/dbname[?param1=value1][&param2=value2]... subprotocol과 subname은 사용하는 드라이버에 따라 기술 방법이 약간씩 다르기 때문에 올바른 사용을 위해서는 설치된 드라이버의 문서를 참조해야 한다. JDBC URL을 이용해서 컨넥션을 열기 위해서 DriverManager의 getConnection() 메소드를 호출한다. 예: MySQL에서 mm 드라이버를 사용하는 경우 String url = "jdbc:mysql://localhost:3306/contacts"; Connection con = DriverManager.getConnection(url, "user-id", "password");

15 14.2 JDBC 프로그래밍 절차 예: MS-SQL에서 JTurbo 드라이버를 사용하는 경우
String url = "jdbc:JTurbo://localhost:1433/contacts"; Connection con = DriverManager.getConnection(url, "sa", ""); 드라이버 매니저와 드라이버

16 14.2 JDBC 프로그래밍 절차 3. SQL을 전송한다. SQL 문장을 DBMS에 전송하는 단계.
SQL 문장을 전송하기 위해서는 Statement 객체를 이용. Statement 객체 생성은 Connection 클래스의 createStatement() 메소드를 이용 Statement 객체가 생성되면 SQL 문장을 DBMS에 전송하게 되는데, 이때에는 두 가지 형태의 메소드가 사용된다. executeQuery() 메소드: SELECT 문을 이용할 때 사용 executeUpdate() 메소드: 내용을 변경하는 경우에 사용

17 14.2 JDBC 프로그래밍 절차 executeUpdate() 메소드 리턴 값은 SQL 문장이 수행됨으로 변경된 레코드의 수
예: Statement stmt = con.createStatement(); int rc = stmt.executeUpdate("create table friends ( name varchar(8), " + "phone varchar(13), varchar(35), company varchar(30))" ); rc = stmt.executeUpdate("insert into friends values ('홍길동', " + "' ', '(주)홍길동 소프트')"); executeQuery() 메소드 리턴 값은 SELECT 문장의 수행됨으로서 나온 결과 값으로 ResultSet 타입으로 리턴된다. ResultSet rs = stmt.executeQuery("select * from friends");

18 14.2 JDBC 프로그래밍 절차 Statement 객체를 이용해서 전달되는 SQL문은 그대로 DBMS에 전달되며
Connection, Statement, ResultSet의 관계 DriverManager는 드라이버를 이용하여 여러 개의 Connection을 만들 수 있으며 각 Connection은 여러 개의 Statement를 가질 수 있다. 각 Statement는 하나의 ResultSet을 갖는다.

19 14.2 JDBC 프로그래밍 절차 4. 결과를 처리한다. executeUpdate() 메소드를 이용하는 경우 변경된 레코드의 수를 리턴 하기 때문에 처리가 필요 없으나 executeQuery()를 이용해서 나온 결과는 테이블 형태로 데이터들을 가지고 있어서 처리가 필요. 필드 이름을 기술하는 방법 ResultSet에서 데이터 추출은 커서를 한 행(row)씩 이동시키며, 각 행에서 getXXX() 메소드를 이용하여 필드(column) 값을 추출 다음 행으로 커서를 옮길 때 next() 메소드 사용

20 14.2 JDBC 프로그래밍 절차 다음 예는 friends 테이블에서 name과 phone 값을 얻어오는 SQL을 사용하는 경우에 ResultSet에서 값을 추출하는 방법을 보여준다. ResultSet에서 커서의 위치를 첫 번째 행(row)에 이동시키기 위해서는 처음에 한번 next() 메소드를 호출해야 한다. next() 메소드는 읽을 행이 있는 경우에는 true 값을 리턴하고, 더 이상 읽을 행이 없는 경우에는 false를 리턴한다. 예: String query = "select name, phone from friends"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("name"); String phone = rs.getString("phone"); System.out.println(name + " | " + phone); }

21 14.2 JDBC 프로그래밍 절차 인덱스 값 사용 getXXX() 메소드 방법이외에 인덱스 값을 사용
인덱스는 1부터 시작하며, 인덱스 사용이 필드 이름 사용보다 성능면에서 뛰어남 예: String query = "select name, phone from friends"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString(1); String phone = rs.getString(2); System.out.println(name + " | " + phone); } getXXX()메소드는 SQL의 데이터 타입과 자바의 데이터 타입을 맞추기 위해서 사용 다음 표는 각 타입에 따라 사용할 수 있는 getXXX() 메소드들이다. 'x'로 표시된 것은 사용 가능한 것을 의미하고, 'X'는 가장 적합한 메소드를 의미한다.

22 14.2 JDBC 프로그래밍 절차 x SQL 데이터 타입 getXXX() 메소드 getByte getShort getInt
getString getBoolean getBigDecimal getDouble getFloat getLong getInt getShort getByte T I M E S A P D L O N G V R B Y C H U F SQL 데이터 타입 getXXX() 메소드

23 14.2 JDBC 프로그래밍 절차 x SQL 데이터 타입 getXXX() 메소드 getBytes getDate getTime
getObject getBinaryStream getUnicodeStream getAsciiStream getTimestamp getTime getDate getBytes T I M E S A P D L O N G V R B Y C H U F SQL 데이터 타입 getXXX() 메소드

24 14.2 JDBC 프로그래밍 절차 5. 컨넥션을 닫는다. 모든 작업이 끝난 경우에는 ResultSet, Statement, Connection의 close() 메소드를 호출함으로서 작업을 종료한다. 예: rs.close(); stmt.close(); con.close();

25 14.2 JDBC 기초 JDBC 프래로그램 작성 DBMS는 MySQL이고, 데이터베이스는 contacts, 테이블은 friends mysql> desc friends; | Field | Type | Null | Key | Default | Extra | | name | varchar(8) | YES | | NULL | | | phone | varchar(13) | YES | | NULL | | | | varchar(35) | YES | | NULL | | | company | varchar(30) | YES | | NULL | | 현재 friends 테이블에는 다음과 같은 내용들이 들어있다. mysql> select * from friends; | name | phone | | company | | 홍길동 | | | (주)홍길동 소프트 | | 김개똥 | | | (주)홍길동 소프트 | | 홍길숙 | | | NULL |

26 14.2 JDBC 기초 예제: HelloJdbc.java 1 import java.sql.*; 2
3 public class HelloJdbc { String id, passwd; 5 public HelloJdbc(String id, String passwd) { this.id = id; this.passwd = passwd; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); } catch (Exception e) { e.printStackTrace(); } } 15 public void getData() { try { String url = "jdbc:mysql://localhost:3306/contacts"; String option="?useUnicode=true&characterEncoding=KSC5601";

27 14.2 JDBC 기초 20 url = url + option; 21 Connection con =
DriverManager.getConnection(url, id, passwd); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from friends"); while(rs.next()) { String name = rs.getString(1); String phone = rs.getString(2); String = rs.getString(3); String company = rs.getString(4); 30 System.out.println(name + " \t| " + phone + “\t| " " \t| " + company); } rs.close(); stmt.close(); con.close(); }catch(Exception e) { e.printStackTrace(); } } ……………………..

28 14.2 JDBC 기초 예제: InsertData.java 1 import java.sql.*; 2
3 public class InsertData { String id, passwd; 5 public InsertData(String id, String passwd) { this.id = id; this.passwd = passwd; try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); } catch (Exception e) { e.printStackTrace(); } } 15

29 14.2 JDBC 기초 public void insert(String name, String phone, String , String company) { try { String url = "jdbc:mysql://localhost:3306/contacts"; String option="?useUnicode=true&characterEncoding=KSC5601"; url = url + option; Connection con = DriverManager.getConnection(url, id, passwd); Statement stmt = con.createStatement(); String sql = "insert into friends values('" + name + "', '" + phone + "', '" + + "', '" + company + "')"; stmt.executeUpdate(sql); stmt.close(); con.close(); }catch(Exception e) { e.printStackTrace(); } } ……………………

30 14.3 클래스들 14.3.1 DriverManager 클래스
DriverManager는 JDBC 드라이버를 관리하기 위한 클래스. JDBC 드라이버는 메모리에 로드될 때 DriverManager에 등록. DriverManager에 드라이버를 등록방법은 프로그램에서 등록하는 방법과 환경에서 등록하는 방법이 있다. 예: 프로그램에서 등록하는 방법 Class.forName("my.sql.Driver"); 환경에서 등록하는 경우에는 ~/.hotjava/properties 파일에 다음 예와 같은 방식으로 기술한다. 예: 환경에서 등록하는 방법 jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver

31 14.3 클래스들 DriverManager의 메소드
static Connection getConnection(String url) - 주어진 데이터베이스 URL을 이용해서 컨넥션을 연결 static Connection getConnection(String url, Properties info) - 주어진 데이터베이스 URL과 Properties를 이용해서 컨넥션을 연결. static Connection getConnection(String url, String user, String password) - 주어진 URL과 사용자 계정, 암호를 이용해서 컨넥션을 연결 static void registerDriver(Driver driver) - JDBC 드라이버를 등록 static void setLoginTimeout(int seconds) - 드라이버가 데이터베이스에 연결하기 위해 기다릴 수 있는 최대 시간을 설정(단위: 초) static void setLogWriter(PrintWriter out) - JDBC 드라이버가 작동되는 작업 내용을 트레이스해서 출력

32 14.3 클래스들 Statement 인터페이스 Statement는 SQL 문장을 실행하고, 그 결과를 얻어오기 위해서 사용. 하나의 Statement에는 하나의 ResultSet만 사용될 수 있다. 따라서 현재 ResultSet에서 값을 읽고 있는 동안 동일한 Statement에서 만들어진 다른 ResultSet이 섞여서 사용될 수 없다. 예: 잘못 사용한 예 Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from coffees"); ResultSet rs2 = stmt.executeQuery("select price from coffees"); while(rs.next()) { }

33 14.3 클래스들 Statement의 메소드들 ResultSet executeQuery(String sql) - SELECT SQL 문장을 실행하고 결과 값을 리턴한다. int executeUpdate(String sql) - INSERT, UPDATE, DELETE 등의 SQL 문장을 수행한다. 리턴 값은 SQL 문장을 수행함으로서 변경되는 레코드의 수이다. void setFetchSize(int rows) - 데이터베이스에서 결과 값으로 가져오는 레코드의 수를 JDBC 드라이버에 알려준다. void setMaxFieldSize(int max) - 컬러의 크기를 주어진 바이트 크기로 제한한다. void setMaxRows(int max) - ResultSet이 주어진 수의 레코드만 포함할 수 있도록 제한한다. void setQueryTimeout(int seconds) - SQL 문장이 수행되는데 걸리는 최대 시간을 주어진 시간으로 설정한다. (단위: 초)

34 14.3 클래스들 ResultSet 인터페이스 ResultSet은 데이터 테이블에 접근해서 값을 추출하는 기능을 제공 ResultSet은 현재 데이터 행을 가리키는 커서(cursor)를 가짐. 처음에는 테이블의 행을 가지키고 있지 않다가, next() 메소드를 호출하면 첫 번째 행을 가리킴. 이후 next() 메소드는 다음 행으로 커서를 이동 ResultSet의 메소드들 Array getArray(int i) - SQL ARRAY 값을 얻는다. (JDBC 2.0) Array getArray(String colName) InputStream getAsciiStream(int columnIndex) - ASCII 스트림을 얻는다. InputStream getAsciiStream(String columnName) BigDecimal getBigDecimal(int columnIndex) - BigDecimal 값을 얻는다. BigDecimal getBigDecimal(String columnName)

35 14.3 클래스들 InputStream getBinaryStream(int columnIndex) - 바이트 스트림을 얻는다.
InputStream getBinaryStream(String columnName) Blob getBlob(int i) - BLOB을 얻는다.(JDBC 2.0) Blob getBlob(String colName) <type> getXXX(int columnIndex) - 해당되는 데이터 타입의 값을 얻는다. <type> getXXX(String columnName) Reader getCharacterStream(int columnIndex) - 문자 스트림을 얻는다. Reader getCharacterStream(String columnName) Clob getClob(int i) - CLOB을 얻는다. Clob getClob(String colName)

36 14.3 클래스들 ResultSetMetaData getMetaData() - ResultSet의 컬럼 속성, 타입, 수를 알 수 있는 ResultSetMetaData를 얻는다. boolean next() - 커서를 다음 행으로 이동시킨다. 더 이상 행이 없으면 false를 리턴한다. boolean previous() - 커서를 이전 행으로 이동시킨다. 더 이상 행이 없으면 false를 리턴한다. void refreshRow() - 현재 행을 최신 데이터로 변경한다. boolean relative(int rows) - 현재 행을 중심으로 앞뒤로 이동한다. rows값이 양수인 경우에는 앞으로, 음수인 경우에는 뒤로 이동한다. JDBC 2.0에서 제공하는 ResultSet에서 값을 변경하는 메소드 void updateXXX(int columnIndex, <type> x) - 컬럼의 데이터를 x 값으로 변경한다. void updateXXX(String columnName, <type> x)

37 14.3 클래스들 14.3.4 PreparedStatement
PreparedStatement는 Statement로부터 상속받는다. PreparedStatement는 Statement와는 달리 미리 컴파일된 SQL을 사용하기 때문에 Statement보다 성능면에서 뛰어나다. PreparedStatement에 포함된 SQL 문장은 IN 파라메터를 받을 수 있는 곳을 ?로 표시한다. 예 : Connection con = DriverManager.getConnection(); PreparedStatement pstmt = con.prepareStatement( "UPDATE table4 SET m = ? WHERE x = ?"); PreparedStatment를 실행시키기전에 ‘?’부분은 IN 파라메타를 이용해서 값을 채워주어야 한다. 값을 채우기 위해서는 setXXX() 메소드를 이용한다. pstmt.setString(1, "Hi"); for (int i = 0; i < 10; i++) { pstmt.setInt(2, i); int rowCount = pstmt.executeUpdate(); }

38 14.3 클래스들 setBytes()나 setString()은 무제한 길이의 데이터를 보낼 수 있지만 큰 데이터는 작은 단위로 잘라 보냄이 바람직함. 이것은 IN 파라메타에 자바 입력스트림을 설정해주면 가능함. SQL 문장이 수행되면서, JDBC 드라이버가 반복적으로 입력스트림을 호출/내용을 읽어 PreparedStatement의 실제 IN 파라메터에 값을 전달. JDBC는 입력스트림을 연결하기 위한 3가지 메소드 setBinaryStream() - 바이너리 스트림을 가짐 setAsciiStream() - ASCII 문자를 포함하는 스트림을 위해 사용 setUnicodeStream() - 유니코드 문자를 위해서 사용 예 : 바이너리 스트림을 이용하여 파일의 내용을 데이터 베이스에 전달 java.io.File file = new java.io.File("/tmp/data"); int fileLength = file.length(); java.io.InputStream fin = new java.io.FileInputStream(file); java.sql.PreparedStatement pstmt = con.prepareStatement( "UPDATE Table5 SET stuff = ? WHERE index = 4"); pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();

39 14.3 클래스들 14.3.5 CallableStatement
CallableStatement는 PreparedStatement로부터 상속받으며, 저장된 SQL 프로시듀어(stored SQL procedure)를 호출하기 위해 사용. 형 태: {call procedure_name [(?, ?, ...)] } {? = call procedure_name [(?, ?, ...)]} {call procedure_name } CallableStatement는 prepareCall() 메소드를 이용해서 만듬 예 : Connection con = DriverManager.getConnection(); CallableStatement cstmt = con.prepareCall(“{ call getTestData (?, ?) }“ ); IN 파라메타를 CallableStatement에 전달하기 위해서는 PreparedStatement에서와 마찬가지로 setXXX() 메소드를 사용한다.

40 14.3 클래스들 만약 저장된 프로시듀어가 OUT 파라메타를 리턴한다면
CallableStatement가 실행되기 전에 registerOutParameter() 메소드를 이용해서 사전에 등록해야한다. 다음 예제는 getTestData 프로시듀어를 호출하고 TINYINT 타입과 DECIMAL 타입으로 2개의 결과를 OUT 파라메타를 이용해서 리턴한다. 예 : Connection con = DriverManager.getConnection(); CallableStatement cstmt = con.prepareCall( " {call getTestData (?, ?)} " ); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3); cstmt.executeQuery(); byte x = cstmt.getByte(1); java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

41 14.3 클래스들 CallableStatement는 INOUT 파라메타를 사용할 수 있다.
INOUT 파라메타는 IN 파라메타 타입으로 setXXX() 메소드를 이용해서 CallableStatement에 값을 전달할 수 있고, OUT 파라메타 형식으로 내장된 프로시듀어의 결과를 리턴받아올 수 있다. 예 : Connection con = DriverManager.getConnection(); CallableStatement cstmt = con.prepareCall( " {call reviseTotal (?)} " ); cstmt.setByte(1, 25); cstmt.registerOutParameter(1, java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(1);

42 14.4 2-tier/3-tier 모델과 트랜잭션 14.4.1 2-tier와 3-tier 모델
JDBC API는 2-tier와 3-tier를 모두 지원 2-tier 자바 애플릿이나 어플리케이션이 JDBC를 이용해서 DBMS의 데이터베이스에 직접 접근한다. 가장 대표적인 클라이언트/서버 구조이다. 자바 애플릿이나 어플리케이션은 클라이언트가 되고, DBMS는 서버가 된다. 2-tier 형태

43 14.4 2-tier/3-tier 모델과 트랜잭션 3-tier
클라이언트는 서비스를 위한 미들티어(middle-tier)에 명령어를 보내고 미들티어가 데이터베이스에 접근 3-tier 형태는 보안, 확장성 등에서 2-tier보다 뛰어나다. 3-tier 형태

44 14.4 2-tier/3-tier 모델과 트랜잭션 장단점 2-tier 의 장점 프로그래밍이 간단 3-tier의 장점 로드밸런싱
캐싱 기능 확장성 보안

45 14.4 2-tier/3-tier 모델과 트랜잭션 14.4.2 트랜잭션
트랜잭션은 하나 이상의 SQL 문장으로 구성되어 실행되면서 전체가 커밋(commit)되던가 롤백(rollback)된다. 한 트랜잭션이 커밋이나 롤백되면 현재 트랜잭션을 종료되고 다른 트랜잭션이 시작된다. 새로운 컨넥션은 디폴트로 auto-commit 모드로 설정되어 있다. SQL 문장이 하나 실행되면 자동적으로 커밋 혹은 롤백됨을 의미한다. 트랜잭션의 각 SQL 문장들이 개별적으로 커밋 혹은 롤백됨으로 문제가 발생할 수 있다. auto-commit 모드가 해제되면 트랜잭션의 모든 문장들이 수행되고 commit() 이나 rollback() 메소드가 호출되면 트랜잭션은 종료된다. auto-commit 모드를 변경하기 위해서는 Connection 클래스의 setAutoCommit(boolean mode) 메소드를 이용한다. 충돌이 발생하는 경우에 DBMS가 어떻게 해결할 것인지를 아이솔레이션 레벨(isolation level)로 기술해 줄 필요가 있다.

46 tier/3-tier 모델과 트랜잭션 아이솔레이션 레벨을 기술하기 위해서는 Connection 클래스의 setTransactionIsolation(int level) 메소드를 이용 dirty read를 허용하는 레벨을 기술한 예 예 : Connection con = DriverManager.getConnection(); con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); setTransactionIsolation()를 이용하는 레벨 TRANSATION_READ_UNCOMMITTED : dirty read가 허용된다. TRANSACTION_READ_COMMITTED : 트랜잭션이 종료될 때까지 행(row) 읽기가 블락 TRANSACTION_REPEATABLE_READ : 행(row)에 대해 반복적으로 읽혀진 데이터가 원래 데이터와 일치된다. TRANSACTION_SERIALIZABLE : 모든 읽기가 트램잭션이 종료될 때까지 블락 TRANSACTION_NONE : 트랜잭션이 지원되지 않음

47 14.5 JDBC 응용 프로그램 동문회 주소록 프로그램 MySQL와 JDBC를 이용하고 2-tier 모델을 이용
MySQL DBMS에서 내용을 추가/삭제/검색할 수 있는 기능을 제공한다. 프로그램을 작성하기 전에 데이터베이스를 작성하여야 한다. 데이터베이스 이름은 alumni이고 테이블 이름은 cs로 한다. mysql> desc cs; | Field | Type | Null | Key | Default | Extra | | num | varchar(8) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | phone | varchar(16) | YES | | NULL | | | company | varchar(20) | YES | | NULL | | | | varchar(30) | YES | | NULL | |

48 14.5 JDBC 응용 프로그램 결과


Download ppt "프로그래머를 위한 Java 2 제14장 JDBC 프로그래밍"

Similar presentations


Ads by Google