JDBC 를통한 SQL 연동 JAVA 프로그래밍
준비사항 } 실습조건 } MS-SQL Server 에연결가능한컴퓨터 } 실습용서버혹은별도의 MS-SQL 서버 } Northwind 데이터베이스 } MS-SQL 2000 에제공되는예제데이터베이스 } MS-SQL 2008 에는 Northwind 가기본으로제공되지않기때문에실습용서버를사용할것을권장 2
예제데이터베이스의테이블구조 } 예제데이터베이스 Northwind 의 Orders 테이블의스키마는다음과같다. } 실습은이테이블을이용하여진행한다. 3
데이터베이스접속 } 드라이버로딩 } JDK 에는 JDBC 를위한 java.sql.* 클래스들이있다. } 이클래스는 JDBC API 의인터페이스정의에대한것만담고있을뿐, 개별데이터베이스 (MS-SQL, 오라클, mysql 등 ) 와는무관 } 따라서, JAVA 가제공하는 JDBC API 를사용하기위해서는개별데이터베이스에맞게구현된드라이버가있어야함 } JDBC 버전에따라 JDK 요구버전이다름 } JDBC 2.0 은 JDK 1.2 이상 } JDBC 3.0 & 4.0 은 JDK 1.6 이상 4
데이터처리과정 Class.forName } 드라이버검색 DriverManager } Connection 성립 Connection } Session 성립 Statement PreparedStatement } 데이터처리 5
데이터처리의유형 } JDBC 는데이터또는질의를스트링및여러형태로입력받을수있으며, 다음의두가지방식을통해데이터베이스서버와통신한다. } Statement 인터페이스 } SQL 명령을수행하고그결과값을저장하기위한객체 } JDBC 가데이터베이스서버와통신할수있는가장기본적인메소드제공 } PreparedStatement 인터페이스 } Statement 를확장하는인터페이스 } Statement 인터페이스에서상속 6
Statement 인터페이스 } Statement 인터페이스 } 사용법 } Statement 오브젝트를선언후 Connection 객체의 createstatement() 를이용하여현세션에종속되는 Statement 객체생성 Statement stmt = null; stmt = con.createstatement(); String query = SELECT OrderID, CustomerID, EmployeeID FROM orders ; ResultSet rs = stmt.executequery(query); } 한계점 프로그램의성능에영향을줄수있음 반복되는질의가수행되더라도매번질의를해석하는상황이발생할수있어리소스와네트워크트래픽유발가능성이있음 프로그램확장성제한 동적으로조건이변경되더라도 Statement 객체에서는이를효과적으로처리하지못함 7
Statement 인터페이스 } 예제 1 : Staetment 를통한질의처리 1 데이터베이스주소 2 3 4 5 1. JDBC 를위한클래스 2. MS-JDBC 드라이버를통해 MS-SQL 에연결하기위한접근자 3. SQL 서버에서수행할질의 포트번호 DB 명 4. SQL 서버에세션연결을수행할 Connection 인터페이스 5. SQL 명령을수행하고그결과값을저장하기위해정의된 Statement 객체 8
Statement 인터페이스 } 예제 1 : Staetment 를통한질의처리 1 2 계정과암호 3 1. DriverManager 를통한 Connection 성립 Connection 에서는 Session 을성립시킴 2. 데이터처리과정 Statement 를통해질의를수행하고 ResultSet 의결과를반환 ResultSet 의 next() 메소드를통해각 Row 의데이터를가져오고 getxxx() 메소드를통해각 Column 의데이터를지정한타입으로가져옮 next() 를통해더이상참조할결과가없다면 false 를반환 3. 리소스확보를위해연결종료 9
Statement 인터페이스 } 예제 1 : Staetment 를통한질의처리 } 질의문 } Select OrderID, CustomerID, EmployeeID from orders } 소스파일 } Ex1.java } 실행클래스 } Ex1 10
PreparedStatement 인터페이스 } PreparedStatement 인터페이스 } Statement를확장 } Statement로부터상속 } Statement 와다른점 } 컴파일시함께컴파일된 SQL 구문포함 } 변수를받아서처리가능 } 질의문이미리컴파일됨 } Statement 보가빠른질의처리가가능하고다양한질의문을한번의컴파일로처리할수있다. } Statement 보다빠른질의처리가가능하며, 다양한질의를한번의컴파일로처리 11
PreparedStatement 인터페이스 } 예제 2 : PreparedStaetment 를통한질의처리 1. PreparedStatement 를사용하기위한질의 }? 자리에파라미터의값이대체됨 2. PreparedStatement 오브젝트선언 3. 질의문을가지고 PreparedStatement 초기화 } PreparedStatement 는초기화단계에서질의문을가지고있기때문에미리질의를컴파일해서가지고있지만, Statement 는질의를실행시키는과정에서질의문을지정하므로매번질의에대한컴파일이이루어짐 } Statement 의초기화와질의실행 Statement stmt = mycon.createstatement(); ResultSet rs = stmt.executequery(query); } PreparedStatement 의초기화와질의실행 12 PrepareStatement pstmt = mycon.preparedstatement(query); pstmt.setint(1, 4); ResultSet rs = pstmt.executequery();
PreparedStatement 인터페이스 } 예제 2 : PreparedStaetment 를통한질의처리 4. PreparedStatement 를사용한질의의파라미터값지정 } setxxx() 메소드를통해? 자리에대체될파라미터값을지정 } 예제에서는정수형 4 의값을사용할것이기때문에 setint() 메소드를사용하며, 첫번째인자는? 의순서를의미하며, 두번째인자는대체될값을의미함 pstmt.setint(1, 4); pstmt.setstring(2, John ); // 첫번째파라미터를정수 4로지정 // 두번째파라미터를문자열 John 으로지정 13
PreparedStatement 인터페이스 } 예제 2 : PreparedStaetment 를통한질의처리 1 2 3 4 14
PreparedStatement 인터페이스 } 예제 2 : PreparedStaetment 를통한질의처리 } 질의문 } Select OrderID, CustomerID, EmployeeID from orders Where EmployeeID =? } 소스파일 } Ex2.java } 실행클래스 } Ex2 15
커서 (Cursor) } 커서란? } 질의결과집합에서 다음행 이라는개념이없기때문에전체결과집합을커서라는개념으로나타내어순차파일의레코드를사용하는것과유사한방법으로결과집합의개별행을나타낼수있게하는개념 } 커서의역할 } 데이터베이스에서추출한데이터를일련의배열에저장함으로써프로그램에서그내용을필요에맞는양으로나누어검색할수있게한다. } 프로그래머는얼마만큼의데이터가추출되는지상관없이보기에편리한프로그램을작성하도록돕는다. Database Select * from table Row 1 Row 2 Row 3 Row 4 Row 5 Row 6... Cursor 16
커서 (Cursor) } 커서생성예제 Statement stmt = con.createstatement(resultset.type_scroll_sensitive, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executequery("select cof_name, price FROM coffees"); } 위와같이 createstatement 메소드에상수파라미터를주어다양한특성의커서를사용할수있게한다. 17
커서 (Cursor) } 커서생성파라미터 } createstatement(parameter 1, PARAMETER 2); 파라미터파라미터종류파라미터기능 Parameter 1 Parameter 2 TYPE_SCROLL_SENSITIVE TYPE_SCROLL_INSENSITIVE TYPE_FORWARD_ONLY CONCUR_READ_ONLY CONCUR_UPDATABLE 스크롤가능하며, 데이터베이스의테이블에저장된값에업데이트가발생하면바로반영됨 스크롤가능하며, 데이터베이스의테이블에저장된값에업데이트가발생해도반영되지않음 스크롤이되지않으며, 다음 row 만진행가능 ResultSet 을갱신할수없이읽기만가능 ResultSet 을갱신할수있음 18
커서 (Cursor) } 커서의종류 ( 메소드 ) } next() } 순방향검색 } 커서를다음행으로이동 } previous() } 역방향검색 } 커서를이전행으로이동 } afterlast() } 마지막데이터의다음으로커서를위치시킴 } isafterlast() } 커서의위치가마지막데이터의다음위치인지를판별 19
커서 (Cursor) } 예제 3 : 커서를사용한역방향출력 1 2 1. i-net software 의 JDBC 연결접근자 2. 동적으로사용할데이터베이스가변경이되는경우라면연결접근자가아닌 setcatalog() 메소드로사용할데이터베이스를지정가능 20
커서 (Cursor) } 예제 3 : 커서를사용한역방향출력 1 2 3 1. 커서속성을지정한 Statement 생성 2. 역방향출력을위해가장마지막행의다음으로커서를이동 3. 커서를이전행으로이동, 첫행보다앞이라면 false 를반환 21
커서 (Cursor) } 예제 3 : 커서를사용한역방향출력 } 질의문 } Select OrderID, CustomerID, EmployeeID from orders } 소스파일 } Ex3.java } 실행클래스 } Ex3 22
레코드셋 (RecordSet) } RecordSet 에제공되는메소드 } absolute(n) : n 번째 row 로커서를이동 } deleterow() : 커서가가르키는 row 를삭제 } movetoinsertrow() : 새로운데이터튜플을추가하기위하여예비된공간으로커서를이동 } updatexxx(key, value) : key 에해당하는 column 의값을 value 로변경, movetoinsertrow() 를통해현재커서가새로운튜플을생성중이라면데이터가새로생성됨 } updatestring, updateint 등이있음 } insertrow() : movetoinertrow() 를통해새로운튜플을생성한것을반영 } refreshrow() : 새롭게변경된내용을반영 } 이외에도이전에설명한 next(), previous() 등의메소드와그외다양한메소드들이존재 23
레코드셋 (RecordSet) } 예제 4 : RecordSet 을통한삽입, 삭제, 수정 } 예제 4 에서사용되는 score 테이블의구조및데이터 24 } 예제 4 를수행하기위하여본인의데이터베이스에반드시추가
레코드셋 (RecordSet) } 예제 4 : RecordSet 을통한삽입, 삭제, 수정 1 1. Ex4 클래스객체를사용하여 SQL 서버에접속및질의수행 25
레코드셋 (RecordSet) } 예제 4 : RecordSet 을통한삽입, 삭제, 수정 1 2 1. RecordSet 을통해업데이트가가능하고, 업데이트된내용이 RecordSet 에반영되도록커서를설적 2. RecordSet 을통한삽입, 삭제, 수정의과정 26
레코드셋 (RecordSet) } 예제 4 : RecordSet 을통한삽입, 삭제, 수정 1 2 27 1. RecordSet 에삽입, 삭제, 수정된내용이반영된내용을출력 2. 연결해제를위한메소드
레코드셋 (RecordSet) } 예제 4 : RecordSet 을통한삽입, 삭제, 수정 } 질의문 } Select * from score } 소스파일 } Ex4.java } 실행클래스 } Ex4 28
Statement 인터페이스 } 실습과제 1 } Products 테이블에서 ProductName 이 C 로시작하는모든상품을찾아서 ProductName, UnitPrice, UnitsinStock 그리고 UnitPrice 와 UnitsinStock 을곱하여전체해당상품의전체 Price 를계산하여출력하라. 29
PreparedStatement 인터페이스 } 실습과제 2 } Customers 테이블에서사용자로부터검색하고자하는나라 (Country) 를입력받아 CompanyName, ContactName, Phone 를출력 30
과제 } 제출방법 } 실습및과제를캡쳐후한글, word 파일에캡쳐부분에대한설명과 SQL 구문에간단한주석을넣어서제출하시기바랍니다. } 실습화면캡쳐시자신의학번데이터베이스가보이도록하시기바랍니다. } 파일형식 : [ 분반 ]_ 이름 _ 학번 _6 } 한글 / 워드에캡쳐파일 } 제출형식어길시감점처리 } 제출 : dbcyy1@gmail.com 로제출 } 제출기간 : 11 월 3 일목요일 23 시 59 분까지 31