JDBC (Java Database Connectivity) 양용철(ycyang@cs.chonbuk.ac.kr) 김기헌(khkim@cs.chonbuk.ac.kr)
JDBC 자바 프로그램내에서 SQL문을 실행하기 위한 자바 API 동일 프로그램으로 Oracle, Informix, MS-SQL, mySQL 등 접속 플랫폼에 독립 자바 애플릿 (Browser) Client HTTP, RMI, CORBA 등 자바 응용 프로그램 Client JDBC 응용 서버(자바) 서버 JDBC 특정 DB 프로토콜 특정 DB 프로토콜 DBMS DBMS DB Server DB Server 2019-02-16
JDBC JDBC가 하는일 JDBC Type 데이타베이스 연결 SQL문장 전송 결과 처리 Type 1 : JDBC-ODBC Bridge Type 2 : Native API 부분적 자바 드라이버 Type 3 : JDBC-Net 순수 자바 드라이버 Type 4 : JDBC-네이티브 프로토콜 2019-02-16
Type 1 : JDBC-ODBC Bridge ODBC드라이버를 이용하여 DB접근 클라이언트 시스템에 ODBC 바이너리 코드와 데이타베이스 클라이언트 코드가 설치되어 있어야 함 Ex) MS-SQL 접속 클라이언트 DBMS 서버 자바 응용 프로그램 DBMS Engine Storage JDBC ODBC Bridge Database Connection Via middle ware or DBMS Network ODBC Driver 2019-02-16
Type 2 : Native API 부분적 자바 드라이버 JDBC호출을 Oracle, Informix등의 클라이언트 API호출로 변환 데이타베이스 API가 클라이언트에 설치되어 있어야 함 Ex) Oracle OCI Driver 클라이언트 DBMS 서버 자바 응용 프로그램 DBMS Engine Storage Native JDBC Driver Database Connection Via DBMS Network DBMS API 2019-02-16
Type 3 : JDBC-Net 순수 자바 드라이버 JDBC 호출이 DBMS독립적인 네트워크 프로토콜로 변환 네트워크 서버 미들웨어 필요함 가장 융통성있는 JDBC DBMS 서버 클라이언트 DBMS Engine Storage 자바 응용 프로그램 JDBC Driver Middleware All-Java JDBC Driver 2019-02-16
Type 4 : JDBC-네이티브 프로토콜 JDBC 호출을 특정 DBMS에 제공되는 네트워크 프로토콜로 변환 순수 자바로 구현 Ex) Oracle Thin Driver DBMS 서버 클라이언트 DBMS Engine Storage 자바 응용 프로그램 Database connection Via DBMS networking All-Java JDBC and Networking Protocol 2019-02-16
SQL*Plus – 예제 데이타 2019-02-16
JDBC 예제 프로그램 import java.sql.*; import java.io.*; public class JDBCExample { public static void main(String args[]) throws SQLException { 1. Class.forName(“oracle.jdbc.driver.OracleDriver”); 2. Connection conn = DriverManager.getConnection("jdbc: oracle:thin:@210.117.172.160:1521:csdblab","scott","tiger"); 3. Statement stmt = conn.createStatement(); try { 4. ResultSet rs = stmt.executeQuery("select empno, ename from emp"); while(rs.next()) System.out.println(rs.getInt(1)+” “+rs.getString(2)); rs.close(); } catch(Exception e){ System.out.println(e); 5. conn.close(); 2019-02-16
실행 결과 2019-02-16
JDBC 프로그램 1. 드라이버 선택 2. 연결 설정 3. SQL Statement 객체 생성 4. 수행, 결과 처리 5. 연결 해제 2019-02-16
1. 드라이버 선택 Class.forName(); 사용 Ex) Drivermanager.registerDriver();사용 오라클 : 오라클 JDBC드라이버 필요 Class.forName(“oracle.jdbc.driver.OracleDriver”); MS-SQL(JDBC-ODBC Bridge) Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Drivermanager.registerDriver();사용 Drivermanager.registerDriver( new oracle.jdbc.driver.OracleDriver()); 2019-02-16
2. 연결 설정 JDBC URL Connection jdbc:<subprotocol><subname> jdbc:oracle:thin:@210.117.172.160:1521:csdblab jdbc:oracle:oci:@210.117.172.160:1521:csdblab jdbc:odbc:csdblab Connection DriverManager.getConnection(URL,user,password); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@210.117.172.160:1521:csdblab","scott","tiger"); 2019-02-16
3. SQL Statement 객체 생성 Statement 객체 생성 Statement stmt = conn.createStatement(); 2019-02-16
4. 수행, 결과 처리 수행 : Statement 클래스 결과 처리 : ResultSet 클래스 executeQuery(String) ResultSet rs = stmt.executeQuery("select empno, ename from emp"); 결과 처리 : ResultSet 클래스 while(rs.next()) System.out.println(rs.getInt(1)+” “+rs.getString(2)); rs.close(); getInt(), getString(), getFloat(), getBool()….. 2019-02-16
4. 수행, 결과 처리 executeUpdate() Select문장은 executeQuery() Update, Insert, Delete…문장은 executeUpdate() ResultSet처리 필요 없음 Ex) String updateString = “update coffees set empno = 10” + “where ename like ‘John’ ”; stmt.executeUpdate(updateString); 2019-02-16
4. 수행, 결과 처리 PreparedStatement setXXX() 메소드를 이용하여 값 설정 Ex) Statement String updateString = “update coffees set empno = 10” + “where ename like ‘John’ ”; stmt.executeUpdate(updateString); PreparedStatement PreparedStatement updateStmt = conn.preparedStatement(“update coffees set empno = ? where ename like ? ”; updateStmt.setInt(1,10); updateStmt.setString(2,”John”); updateStmt.executeUpdate(); 2019-02-16
5. 연결 해제 Connection클래스의 close()메소드 conn.close() 2019-02-16
JDBC를 이용한 웹과 DB연동 웹서버 프로그래밍 언어 : Java Servlet, JSP OS : Linux 웹서버 : Apache 1.3.9 Servlet 엔진 : Apache-Jserv 1.0 JSP 엔진 : gnujsp-1.0 DB : Oracle 8.1.5 JDBC드라이버 : Oracle thin Driver 2019-02-16
Servlet 작동 방식 Is servlet loaded? Class Loader Servlet Instance No HTTP request Request Yes Invoker Service Thread HTTP response Response Web Server 2019-02-16
Java Servlet import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletDemo extends HttpServlet { Connection con; String dbUrl = “jdbc:oracle:thin:@210.117.172.160:1521:csdblab”; String user = “scott”; String passwd = “tiger”; public void init(ServletConfig config) throws ServletException { try { Class.forName(“oracle.jdbc.driver.OracleDriver”); con = DriverManager.getConnection(dbUrl, user, passwd); } catch( Exception e ) { System.err.println(e); 2019-02-16
Java Servlet public synchronized void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html;charset=euc-kr"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head><title> Servlet Demo</title></head>"); out.println("<body>"); try { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select empno, ename from emp"); while(rs.next()) out.println(rs.getInt(1)+” “+rs.getString(2)+”<br>”); rs.close(); } catch(SQLException e){ System.err.println(e); out.println(“</body></html>”); 2019-02-16
Java Servlet public void destroy() { try { con.close(); } catch( SQLException e ) { System.err.println(e); 2019-02-16
실행 결과 2019-02-16
JSP 작동 방식 Generate Reading Class file Tokenize Is jsp modified? Yes Loader HTTP request Request No Servlet Instance HTTP response Response Web Server Invoker Service Thread 2019-02-16
JSP <html> <%@ page language="java" %> <%@ page import= " java.sql.* " %> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-KR"> <title> JSP Demo </title> <body> <% String dbUrl = “jdbc:oracle:thin:@210.117.172.160:1521:csdblab”; String user = “scott”; String passwd = “tiger”; Class.forName(“oracle.jdbc.driver.OracleDriver”); Connection con = DriverManager.getConnection(dbUrl, user, passwd); 2019-02-16
JSP Statement stmt = con.createStatement(); try { ResultSet rs = stmt.executeQuery("select empno, ename from emp"); while(rs.next()) { %> <%= rs.getInt(1) %> <%= rs.getString(2) %><br> <% } rs.close(); catch(Exception e){ System.err.println(e); con.close(); </body> </html> 2019-02-16
실행 결과 2019-02-16
참고 문헌 JDBC Servlet, JSP Web Site 프로그램 세계 99/12, 2000/01, 2000/02 마이크로 소프트웨어 2000/04 Java Servlet Programming Java Server Programming Web Site http://java.sun.com http://www.javastudy.co.kr/ http://www.idcsoft.net/~java/index.html 2019-02-16