웹프로그래밍 설계 및 실습 DB & JDBC 이경화 (oracle@ssu.ac.kr) First off http://java.sun.com/ http://java.sun.com/j2se/1.4.2/docs/api/index.html http://java.sun.com/javase/6/docs/api/ [영문API_1.6] http://apollo89.com/java/ko/api/ [한글API_1.6] http://en.wikipedia.org/wiki/Main_Page [Wikipedia] 2 Contents • • • • Overview Overview Overview JDBC API of DB & DBMS of SQL(Structured Query Language) of JDBC (Java DB Connection Driver) in Java 3 DB & DBMS ? • DB (Database) – 데이터를 조직적으로 통합해 구조화시켜 놓은 데이터의 집합체 • DBMS (Database Management System) – 데이터베이스를 생성하고 검색하며, 추가, 삭제를 원활히 하려는 프로그램의 집합 • 특징 – – – – – 데이터 구조 정의 데이터 검색과 갱신 데이터 추가와 삭제 복수의 사용자로부터의 데이터 처리 및 실행 제어 정보보호 DBMS (Database Management System)? • A DBMS(Database Management System) is a set of computer programs that controls the creation, maintenance, and the use of the database of an organization and its end users. • It provides facilities for controlling data access, enforcing data integrity, managing concurrency controlled, restoring database. DBMS 데이터 모델 • • • • 계층형 데이터 모델 네트워크형 데이터 모델 관계형 데이터 모델 객체지향 데이터 모델 SQL (Structured Query Language)? • 관계형 데이터베이스로부터 데이터 관리를 위해 고안된 컴퓨터 언어이다. • 자료의 검색과 수정, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리 역할을 포함한다. • 관계형 모델을 위한 최초의 언어이며 많은 관계형 데이터 베이스들이 SQL을 사용하고 있다. SQL (Structured Query Language)? • SQL is a database computer language designed for managing data in RDBMS (Relational DataBase Management Systems). • Its scope includes data query and update, schema creation and modification, and data access control. • SQL was one of the first languages for relational model and became the most widely used language for relational databases. SQL 명령어 (1/2) • DDL (Data Definition Language) – computer language for defining data structures – 데이터 정의 • DML (Data Manipulation Language) – computer languages used by computer programs and/or database users to insert, delete and update data in a database – 데이터 조작 • DCL (Data Control Language) – computer language and a subset of SQL used to control access to data in a database – authorizes users and groups of users to access and manipulate data – 데이터 제어 SQL 명령어 (2/2) DDL SQL DML DCL Create Table 테이블 생성 Alter Table 테이블 구조 변경 Drop Table 테이블 삭제 Select 데이터 조회 Insert 데이터 추가 Update 데이터 수정 Delete 데이터 삭제 Grant 권한 부여 Revoke 권한 해제 ※ 참고자료 첨부 Create Table 문장 SQL 기본 - DDL • 기본 테이블 생성 • 구문 CREATE TABLE 기본_테이블_이름 ( 열_이름 데이터_타입 [NOT NULL] {, 열_이름 데이터_타입 [NOT NULL]}*); • 사용 예 create table ( order_num , cost , good_name orders integer not null integer not null char(20) not null); • SQL이 지원하는 데이터 타입 – INTEGER, SMALLINT, FLOAT(n), DECIMAL(i,j), CHAR(n), VARCHAR(n), DATE, TIME … ※ 참고자료 첨부 Alter Table 문장 • 생성된 테이블에 새로운 열 추가 • 구문 ALTER TABLE 테이블_이름 ADD 열_이름 데이터_타입; • 사용 예 alter table orders add address char(60); SQL 기본 - DDL Drop Table 문장 • 생성된 기본 테이블 제거 • 구문 DROP TABLE 기본_테이블_이름; • 사용 예 drop table orders; SQL 기본 - DDL Insert 문장 SQL 기본 - DML • 기존 테이블에 행을 삽입 • 구문 INSERT INTO 테이블[(열_이름 {[, 열_이름]}*] VALUES (값_리스트); • 사용 예 insert into orders (order_num, cost, good_name, address) values (1, 300, ‘컴퓨터’, ‘서울시 동작구 상도동’); insert into orders (order_num, cost, good_name) values (2, 400000, ‘컴퓨터’); Select 문장(2/2) SQL 기본 - DML ※ SQL에서 제공하는 집단함수(aggregation function) – 테이블의 한 열의 값 집합에 적용 – COUNT, SUM, AVG, MAX, MIN select count(*) from orders where cost > 500; ※ LIKE문(정규 문법 표현) select * from orders where address like ‘서울%’; – ‘%’는 어떤 길이의 어느 문자와도 매치 Update 문장 SQL 기본 - DML • 기존 레코드의 열 값을 변경 • 구문 UPDATE 테이블 SET 열_이름 = 산술식 {, 열_이름 = 산술식}* [WHERE 조건]; • 사용 예 update orders set cost = cost * 1000 where cost < 500; Delete 문장 SQL 기본 - DML • 기존 테이블의 행을 삭제 • 구문 DELETE FROM 테이블 [WHERE 조건]; • 사용 예 delete from orders where order_no = 1; delete from orders where good_name = ‘컴퓨터’; 권장 JDBC (Java DataBase Connectivity)? • 자바 프로그래밍 언어로 만들어진 데이터베이스 조작 인터 페이스 • 다양한 관계형 데이터베이스를 위한 일관된 인터페이스를 제공하는 API 집합 • 프로그래머가 SQL 요구를 만드는데 사용할, 일련의 객체 지향 프로그램의 클래스들을 정의 • 어떤 데이터베이스를 사용하더라도 JDBC 드라이버만 제 공 된다면 코드 수정 없이 바로 적용 가능 • java.sql package JDBC (Java Database Connectivity)? • JDBC is API for the Java programming language that defines how a client may access a database. • It provides methods for querying and updating data in a database. • JDBC is oriented towards relational databases. • JDBC was first introduced in the Java 2 Platform, Standard Edition, version 1.1 (J2SE). • JDBC is implemented via classes in the java.sql package JDBC Structure 출처 : Introduction to JDBC, SUN JDBC Driver Type (1/2) • Type I: Bridge : JDBC-ODBC 브리지 타입 – JDBC에 들어온 모든 명령을 ODBC형으로 변환해 ODBC 드라이버로 전달 • Type II: Native : Native-API/Partly Java 타입 – JDBC에 들어온 데이터베이스 명령을 DBMS 시스템 호출에 맞춰서 변환한 후 그 명령을 전달 • Type III: Middleware :명령어 변환 타입 – JDBC에 들어온 모든 명령을 데이터베이스 접근 미들웨어로 전송하고 이를 데이터베이스에 적합한 명령어로 변환 • Type IV: Pure : 직접 전송 타입 – 자바로 구현된 JDBC로 네트워크를 통해 데이터베이스로 직접 전송 JDBC Driver Type (2/2) 자바 애플리케이션 JDBC API JDBC loads a driver JDBC 드라이버 관리자 JDBC-ODBC 드라이버 ODBC 드라이버 Native-API 드라이버 CLI (.lib) JDBC 드라이버 API Net-Protocol 드라이버 JDBC 미들웨어 DBMS Native-Protocol 드라이버 JDBC API in Java JDBC 프로그래밍 단계 JDBC 드라이버 로드 데이터베이스 연결 Statement 생성 SQL문 전송 클래스 메서드 System.setProperty() JDBC driver class Class.forName() Java.sql.Connection getConnection() Java.sql.Statement createStatement() Java.sql.PreparedStaement Java.sql.Statement prepareStatement() executeQuery() executeUpdate() 결과 받기 Java.sql.ResultSet resultSet() 연결 해제 Java.sql.Connection close() JDBC class workflow DriverManager getConnection() close() ResultSet Connection prepareStatement() getXXX() PreparedStatement createStatement() setXXX() subclass Statement executeQuery() executeUpdate() dataType JDBC 프로그래밍 (1/6) • JDBC 드라이버 로드 – 데이터베이스에 접속하기 위해서는 해당 JDBC 드라이버를 로드 해야함 형식 Class.forName("JDBC드라이버 클래스 이름“); 예 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); – 드라이버에 따른 클래스의 이름 • • • • ODBC : sun.jdbc.odbc.JdbcOdbcDriver Microsoft SQL - com.microsoft.jdbc.sqlserver.SQLServerDriver MySQL - com.mysql.jdbc.Driber Oracle - oracle.jdbc.driver.OracleDriver 25 JSP Programming with a Workbook JDBC 프로그래밍 (2/6) • 데이터베이스 연결 (Connection) – DriverManager 클래스의 getConnection() 메소드를 사용하여 데이터베 이스에 연결 형식 예 Connection conn = DriverManager.getConnection(String url, String user, String password); Connection conn = DriverManager.getConnection(url, “khlee”, “1111”); • 첫 번째 인자 형식 (url) 형식 예 jdbc:mysql://[hostname]:[port number]/[DB name] jdbc:oracle:thin:@127.0.0.1:1521:XE jdbc:mysql://127.0.0.1:3306/mysql JDBC 프로그래밍 (3/6) • Statement 생성 (Statement, PreparedStatement) – SQL문 수행 – Connection 클래스의 createStatement() 메소드 사용 형식 Statement stmt = conn.createStatement() – PreparedStatement • SQL문을 미리 만들어 변수를 입력하는 방식 • 유지보수 측면에서 유리함 • Statement 클래스에 해당하는 메소드를 모두 사용할 수 있음 JDBC 프로그래밍 (4/6) statement vs. prepareStement Statement prepareStatement 쿼리문과 인자를 컴파일 후 실행 쿼리문을 컴파일 해 저장 후 호출 시 인자 대입해 실행 쿼리문이 동적인 경우 적합 쿼리문이 정적인 경우 적합 try{ String sql = “insert into member(id, pw) values(‘”+id+ “’,’” +pw+ “’)”; stmt = conn.createStatement(); rs = stmt.exequteUpdate(sql); }catch(SQLException sql){ sql.toString(); } try{ String sql = “insert into member (id, pw) values(?,?)”; pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); pstmt.setString(2, pw); rs = pstmt.exequteUpdate(); }catch(SQLException sql){ sql.toString(); } JDBC 프로그래밍 (5/6) • SQL문 전송 (executeQuery) – SQL문 처리 – executeQuery() 메소드 : SELECT 문 처리 형식 예 stmt. executeQuery(String sql); stmt. executeQuery("SELECT * FROM tblMember"); – executeUpdate() 메소드 : INSERT, UPDATE, DELETE 문 처리 형식 예 stmt.stexecuteUpdate(String sql); stmt.stexecuteUpdate("INSERT INTO tblMember (id, pwd, name, phone) VALUES ('melon', '4444', '이수용', '019-999-9999')"); JDBC 프로그래밍 (6/6) • 처리 결과 리턴 (ResultSet) – 결과 확인 – ResultSet 클래스에서 제공하는 메소드 (Demo program 참고) • 연결 해제 (close) – 모든 처리를 끝낸 후 close() 메소드를 사용하여 연결 해제 30 JSP Programming with a Workbook JDBC SQL (1/6) • DML : select (prepareStatement) //SELECT field1, field2 FROM table_name WHERE field1=‘김’ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; conn = db.dbConn; String sql = "SELECT seq, userid, username,userpw FROM user WHERE sql=?“; pstmt = conn.prepareStatement(sql); pstmt.setInt (1, seqVal); 31 ResultSet rs = pstmt.executeQuery(); while (rs.next ()) { int seqVal = rs.getInt (“seq"); String idVal = rs.getString(“userid"); String nameVal = rs.getString(“username"); String pwVal = rs.getString(“userpw"); System.out.println(seqVal + ”,” + idVal + ”,” + nameVal + pwVal +”/n”); } 32 JDBC SQL (2/6) • DML : insert (prepareStatement) //INSERT INTO user(field1, field2) VALUES(‘val1’,’val2’) int insCnt = 0; Connection conn = null; PreparedStatement pstmt = null conn = db.dbConn; String sql = “INSERT INTO user (seq, userid, username, userpw) VALUES(user_seq.nextval, ?,?,?)”; pstmt = conn.prepareStatement(sql); pstmt.setString (1, userid); pstmt.setString (2, username); pstmt.setString (3, userpw); insCnt = pstmt.executeUpdate(); System.out.println (insCnt + " rows were inserted"); 33 JDBC SQL (3/6) • DML : insert (createStatement) //INSERT INTO member(field1, field2) VALUES(‘val1’,’val2’) int insCnt = 0; Connection conn = null; Statement stmt = null; conn = db.dbConn; String sql = “INSERT INTO user(userid, username, userpw) VALUES ( ‘khlee', ‘ 이경화’,‘1111‘)”; stmt = conn.createStatement(); insCnt = stmt.executeUpdate(sql); System.out.println (insCnt + " rows were inserted"); 34 JDBC SQL (4/6) • DML : update (prepareStatement) //UPDATE table_name SET field1='value‘, field2='value2' WHERE field3='010‘ int seqVal = Integer.parseInt(request.getParameter(“seq")); String useridVal = request.getParameter(“userid"); String usernameVal = request.getParameter(“username"); String userpwVal = request.getParameter(“userpw"); 35 int uptCnt = 0; Connection conn = null; PreparedStatement pstmt = null; conn = db.dbConn; String sql = “UPDATE member SET userid=?, username=?, userpw=? WHERE seq=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, useridVal); pstmt.setString(2,usernameVal); pstmt.setString(3,userpwVal); pstmt.setInt(4,seqVal); uptCnt = pstmt.executeUpdate(); System.out.println (uptCnt + " rows were updated"); 36 JDBC SQL (5/6) • DML : delete (prepareStatement) //DELETE FROM table_name WHERE field1='value‘ int seqVal = Integer.parseInt(request.getParameter(“seq")); int delCnt = 0; Connection conn = null; PreparedStatement pstmt = null; conn = db.dbConn; String sql = “DELETE FROM member WHERE seq=?”; pstmt = conn.prepareStatement(sql); pstmt.setInt(1,seqVal); uptCnt = pstmt.executeUpdate(); System.out.println (delCnt + " rows were deleted"); 37 Demo Program • #1 Database, Table, Record 생성 • #2 connTest #1. Database 접속 Mysql 접속명령 mysql –ulkh –p0000; use mydb; Oracle 접속명령 sqlplus lkh/0000; MySQL일 경우 #1. Database, Table, Record 생성 (1/3) • Create Database CREATE DATABASE mydb /* DEFAULT CHARACTER SET euckr */; • Create Table 이미 생성되어 있을 경우 생성하지 않음 Oracle일 경우 기본은 XE DROP TABLE IF EXISTS user; CREATE TABLE user ( seq int(11) NOT NULL auto_increment, userid varchar(20) not NULL, username varchar(20) default NULL, PRIMARY KEY (seq) ); • Insert Data insert into user values('1', 'myid', '홍길동'); insert into user values('2','misskim','김나나'); insert into user values('3','another','김나나'); select * from user; Oracle일 경우 #1. Database, Table, Record 생성 (2/3) • Create Table DROP TABLE user; CREATE TABLE user ( id number NOT NULL, userid varchar2(20) not NULL, name varchar2(20) default NULL, PRIMARY KEY (id) ); • Create Sequence (시퀀스) Create sequence member_seq increment by 1 -- 증가값(1씩증가) start with 1 -- 시작값(1부터 시작) nomaxvalue -- 최대값 제한 없음 nocycle nocache; Oracle일 경우 #1. Database, Table, Record 생성 (3/3) • Insert Data insert into user values(member_seq.nextval, 'myid', '홍길동‘,’1111’); insert into user values(member_seq.nextval,'misskim',‘아무개‘,’1111’); insert into user values(member_seq.nextval,'another','김나나‘,’1111’); select * from user; 1. 시퀀스 이용해서 데이터 삽입 insert into 테이블명(필드명..) values (시퀀스명.nextval, ..); 2. 현재 시퀀스 값 읽어 오기 select 시퀀스명.currval from 테이블명; 3. 시퀀스 삭제 drop sequence 시퀀스명; 42 package db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.PreparedStatement; db>DBManager.java public class DBManager { public Connection dbConn() { Connection conn = null; //protocol://[hostname]:[port number]/[DB name] String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; //String url= "jdbc:mysql://127.0.0.1:3306/mydb"; String uid = "lkh"; String upw = "0000"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); //Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url , uid, upw); } catch(Exception e) { e.printStackTrace(); } return conn; public void dbClose(Connection conn, PreparedStatement stmt, ResultSet rs) { try { if(rs != null ) { rs.close(); } if(stmt != null) {stmt.close(); } if(conn != null) {conn.close();} } catch (Exception e ) { e.printStackTrace(); } } public void dbClose(Connection conn, PreparedStatement stmt) { try { if(stmt != null) {stmt.close(); } if(conn != null) {conn.close();} } catch (Exception e ) { e.printStackTrace(); } } } #2. connTest (2/3) <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" import="db.DBManager, java.sql.*"%> <html> <head><title>JDBC connection tset</title></head> <body> <h3>Demo #3 : DB 연결 테스트 </h3><hr> <% DBManager db = new DBManager(); Connection conn = db.dbConn(); String result = ""; if(conn != null) { result = "success"; } else { result = "faild"; } %> DB 연결 결과 : <%=result%> </body> </html> db>conn_test.jsp #2. connTest (3/3) http://127.0.0.1/db/conn_test.jsp