JDBC 프로그래밍
[ 단원 12 ]
단원 12 JDBC 프로그래밍
학습목표
❖ 데이터베이스를 이해하고 DBMS인 MySQL을 설치할 수 있다.
• 데이터베이스와 DBMS의 이해
• MySQL 설치파일을 내려 받아 설치
❖ 데이터베이스에서 사용하는 SQL을 이해하고 관련 문장을 사용할 수 있다.
• DML과 DDL의 이해
• 데이터베이스 생성, 테이블 생성, 테이블 조회 관련 문장
❖ JDBC 와 드라이버에 대해 이해하고 JDBC 프로그래밍 6단계를 구현할 수 있다.
• JDBC 의미와 드라이버의 필요성
• JDBC 프로그래밍 6단계 구현
• JDBC 관련 클래스의 이해
❖ JDBC 프로그래밍 방법을 이해하고 구현할 수 있다.
• JDBC 드라이버 로드와 데이터베이스 연결 방법
• 원하는 테이블 생성 및 레코드 삽입
• 테이블 내용 조회
2
단원 12 JDBC 프로그래밍 3
1. 데이터베이스와 MYSQL
단원 12 JDBC 프로그래밍
데이터베이스 개요
❖ 데이터베이스
▪
‘관련 있는 데이터의 저장소’•
여러 사람이나 응용시스템에 의해 참조 가능하도록 서로 논리적으로 연관되어 통합 관리 되는 데이터의 모임❖ 데이터베이스 관리시스템
▪
데이터와 응용 프로그램 사이에서 중재자•
모든 프로그램들이 데이터베이스를 유용하게 활용할 수 있도록 관리해 주는 소프트웨어4
Section 1 데이터베이스와 MySQL p544
단원 12 JDBC 프로그래밍
필드와 레코드, 파일과 데이터베이스
❖ 필드와 레코드
▪
필드: 특정한 종류의 데이터를 저장하기 위한 영역▪
레코드record : 필드가 여러 개 모이면 레코드❖ 파일과 데이터베이스
▪
파일 : 레코드가 여러 개 모이면 하나의 파일▪
데이터베이스: 서로 관련 있는 데이터들로 통합한 파일의 집합을5
Section 1 데이터베이스와 MySQL p544
단원 12 JDBC 프로그래밍
MySQL 개요
❖ MySQL 은 대표적인 오픈 소스 DBMS 제품
▪
초기에는 무료로 연구용▪
현재는 성능이 향상되어 상용 DBMS로도 널리 사용되는 제품6
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL Community Server 버전 내려받기
❖ MySQL 홈페이지
▪
[Download]를 누르고 왼쪽 메뉴 [MySQL Community Server]7
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL JDBC 드라이버 내려받기
❖ 홈페이지 [Download] 페이지 하부 [Connector/J]를 선택
▪
MySQL은 JDBC 드라이버를 [Connector/J]라고 부름8
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL 설치
❖ MySQL 설치 파일 [mysql-5.5.28-win32.msi]을 더블 클릭하여 설치
9
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
설정 마법사
❖ 설정 마법사를 시작하여 설정할 MySQL 버전을 선택
▪
[Standard Configuration]을 선택10
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL 워크벤치 설치
❖ MySQL 워크벤치
▪
MySQL의 윈도우 유틸리티▪
홈페이지에서 내려받은 설치파일•
[mysql-workbench-gpl-5.2.44-win32.msi]로 설치11
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL 설치 확인(1)
❖ 화면 왼쪽의 [Open Connection to Start Querying]
▪
[Local Instance MySQL55]를 더블 클릭하면 서버 접속 화면이 표시❖ 대화상자 [Connect to MySQL Server]
▪
설치 시 지정한 암호를 입력하여 서버에 접속12
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍
MySQL 설치 확인(2)
❖ MySQL 서버 실행의 다른 확인 방법
▪
[Ctrl+Alt+Del]을 눌러•
[Windows 작업 관리자]에서 [서비스]에서 서비스되는 MySQL55를 확인13
Section 1 데이터베이스와 MySQL
단원 12 JDBC 프로그래밍 14
2. SQL
단원 12 JDBC 프로그래밍
SQL 개요
❖ SQL(Structured Query Language)
▪ DBMS에서 사용되는 언어
•
데이터베이스를 구축하고, 새로운 자료를 입력하거나, 데이터를 수정, 또는 삭제, 검색하는데 이용되는 가장 기본적인 언어▪ 1970 년대에 IBM에서 개발
•
1980년대에 오라클에서 세계 최초로 상용 SQL 시스템을 발표▪ DDL(Data Definition Language)
•
데이터베이스와 테이블의 구조의 생성, 수정, 삭제에 이용▪ DML(Data Manipulation Language)
•
테이블 자료의 검색, 생성, 수정, 삭제에 이용15
Section 2 SQL p552
단원 12 JDBC 프로그래밍
필드 자료형
❖ 테이블을 구성하는 필드는 입력되는 자료에 따라 그 유형이 결정
▪
숫자형, 시간형, 문자형, 텍스 바이너리16
Section 2 SQL
단원 12 JDBC 프로그래밍
SQL 기본 문장
❖ use 문장
▪
질의에 대상을 지정하는 문장•
use databasename;❖ show 문장
▪
데이터베이스 시스템에 대한 여러 정보를 보여주는 문장▪
현재 생성된 데이터베이스를 모두 보여주는 문장•
show databases;▪
현재 연결된 데이터베이스의 모든 테이블을 보여주는 문장•
show tables;❖ desc 문장
▪
SQL 문 desc는 테이블의 구조 정보를 보여주는 문장•
desc tablename;17
Section 2 SQL
단원 12 JDBC 프로그래밍
create 문장
❖ 데이터베이스 생성 문장
▪
create database databasename;▪
create database univdb;▪
create database testdb;❖ create table: 테이블 생성 문장
▪
create table tablename (fieldname fieldtype, …);▪
create table department (▪
departid int NOT NULL auto_increment,▪
name varchar(30) NOT NULL,▪
numstudent int NULL,▪
homepage varchar(30) NULL,▪
PRIMARY KEY ( departid )▪
);18
Section 2 SQL
단원 12 JDBC 프로그래밍
drop 문장
❖ 데이터베이스, 케이블, 인덱스 또는 사용자 정의 함수를 영구적으로 삭제하는 SQL 문
▪
drop database: 데이터베이스를 전체를 삭제•
drop database databasename;▪
데이터베이스 univdb를 영구히 삭제•
drop database univdb;▪
SQL 문 drop table는 하나 또는 여러 개의 테이블 전체를 삭제•
drop table name[, name2, …];▪
테이블 user를 영구히 삭제•
drop table user;▪
테이블 student와 professor를 삭제•
drop table student, professor19
Section 2 SQL
단원 12 JDBC 프로그래밍
alter 문장
❖ 데이터베이스의 테이블 구조를 바꾸는 문장
▪
테이블에 칼럼을 추가•
alter table tablename add column create_clause;▪
테이블의 필드를 삭제•
alter table tablename drop columnname;▪
테이블의 이름을 새로운 newname으로 바꾸는 문장•
alter table tablename rename newname;▪
테이블 student에 새로운 칼럼 address2를 추가하는 문장•
alter table student add column address2 varchar(100);▪
테이블 student에서 칼럼 year를 제거•
alter table student drop year;▪
테이블 student의 이름을 stdt로 수정하는 문장•
alter table student rename stdt;20
Section 2 SQL
단원 12 JDBC 프로그래밍
insert 문장
❖ insert 는 테이블에 한 행인 레코드를 삽입하는 문장
▪
insert [into] table [ (column, …) ] values ( values ) [, ( values ) …];▪
테이블 student에 문장에서 기술된 값의 레코드를 삽입하는 문장•
insert into student (id, passwd, name, year, snum, depart, mobile1, mobile2, address, email)values ('javajsp', 'java8394', '김정수', 2010, '1077818', '컴퓨터공학과', '011', '7649-9875', '서울시', 'java2@gmail.com');
▪
만일 insert 문장에서 기술된 값의 순서가 테이블 student의 필드 생성 순서와 일치 한다면 필드 이름을 기술할 필요가 없음•
insert into student values ('jdbcmania', 'javajsp', '김수현', 2009, '2044187', '컴퓨터공학과', '011', '87654-4983', '인천시', 'java@hanmail.com');21
Section 2 SQL
단원 12 JDBC 프로그래밍
delete 문장
❖ 테이블의 행을 삭제하는 문장
▪
delete는 테이블 구조를 수정하지 않고 where 조건을 만족하는 행 자료를 모두 삭 제•
delete from tablename [where condition_clause];▪
테이블 student의 모든 자료를 삭제•
delete from student;▪
테이블 student에서 필드 year가 2008인 행을 모두 삭제•
delete from student where year == 2008;22
Section 2 SQL
단원 12 JDBC 프로그래밍
조회 select 문장
❖
테이블 또는 테이블의 조합에서 조건인 [where] 절을 만족하는 행을 선택하는 문장▪ select fieldname1 [, fieldname2 …] from tablename1 [, tablename2 …] [where fieldname <op> value];
▪ 테이블 student에서 모든 레코드의 모든 필드를 나타내는 문장
• select * from student;
▪ 테이블 student에서 모든 레코드의 필드 name, snum, depart만 나타내는 문장
• select name, snum, depart from student;
▪ 테이블 student에서 필드 name이 ‘홍길동’인 레코드를 선택하여 모든 필드를 표시
• select * from student where name = ‘홍길동’;
▪ 테이블 student에서 필드 name이 ‘홍’으로 시작하는 모든 레코드를 선택하여 모든 필드를 나 타내는 문장
• 즉 이름이 ‘홍’으로 시작하는 레코드를 추출하는 문장
• select * from student where name like ‘홍%’;
▪ 테이블 student에서 필드 name 중간에 ‘홍’이 있는 모든 레코드를 선택하여 모든 필드를 나타 내는 문장
• 즉 이름 중간에 ‘홍’이 존재하는 레코드를 추출하는 문장
• select * from student where name like ‘%홍%’;
23
Section 2 SQL
단원 12 JDBC 프로그래밍
update 문장
❖ 테이블의 구조를 바꾸지 않으면서 테이블 내용을 수정하는 문장
▪
update tablename set column1 = value1 [, column2 = value2 …] [wherecondition_clause];
•
여기서 condition_clause는 조건을 만족하는 구문▪
테이블 student에서 필드 depart가 ‘전산학과’인 것을 모두 선택하여 depart를 ‘컴 퓨터공학과’로 수정하는 문장•
update student set depart = ’컴퓨터공학과’ where depart == ‘전산학과’;▪
테이블 student에서 필드 id가 ‘javajsp’인 레코드를 선택하여 필드 year는 2010 으로, address는 “인천시’로 수정하는 문장•
update student set year = 2010, address = ‘인천시’ where id == ‘javajsp’;▪
테이블 student에서 평균평점을 표현하는 필드 gpa가 4.3 이상인 학생의 레코드 를 선택하여 필드 award에 ‘우등’으로 수정하는 문장•
update student set award = ‘우등’ where gpa >= 4.3;24
Section 2 SQL
단원 12 JDBC 프로그래밍 25
3. JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
JDBC 이해
❖ Java DataBase Connectivity 의 첫 자로 구성된 JDBC
▪
자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리▪
특정한 DBMS에 종속되지 않는 관련 API(Application Programming Interface) 를 제공26
Section 3 JDBC 프로그래밍 구현 p562
단원 12 JDBC 프로그래밍
JDBC API 클래스
❖ 패키지 java.sql와 javax.sql로 구성
▪ Driver, DriverMananager, Connection, Statement, PreparedStatement, CallableStatement, ResultSet, ResultSetMetaData, DatabaseMetaData, DataSource 등
❖ 데이터베이스 기능을 지원하기 위한 표준 API
▪ 데이터베이스를 연결하여 테이블 형태의 자료를 참조
▪ SQL 문을 질의
▪ SQL 문의 결과를 처리
27
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
JDBC 역할
❖ 다양한 DBMS에 독립적으로 데이터베이스 프로그래밍을 가능하도록 하는 API(application programming interfaces) 규격
▪
오라클(ORACLE), MySQL, SQLServer, DB2 등 어떤 DBMS를 사용하던지 소 스의 수정을 최소화하여 바로 실행▪
JDBC와 함께 JDBC 드라이버(JDBC Driver)도 필요28
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
JDBC 드라이버 설치
❖ 적당한 버전의 Connector/J 커넥터 설치
▪
[jre 설치폴더] 하부 [lib/ext]에 [mysql-connector-java-5.1.6-bin.jar]와 같은 JDBC 드라이버 파일을 복사•
이클립스의 [JRE System Library] 하부에서 확인 가능▪
다른 방법으로는 적당한 폴더에 복사한 후 classpath를 설정하는 방법29
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
JDBC 프로그래밍 과정 6단계
❖ select 문으로 간단한 질의를 수행하는 6단계
30
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
실습예제 12-1
▪
드라이버의 파일 이름이 [Driver]▪
패키지가 [org.gjt.mm.mysql]▪
문장 Class.forName()을 호출▪
DriverManager.getConnection()을 호출31
Section 3 JDBC 프로그래밍 구현
❖ JDBC 프로그래밍 6단계 중에서 1, 2 그리고 6단계를 실행
단원 12 JDBC 프로그래밍
다양한 JDBC 드라이버 로드
❖ 문장 Class.forName()
▪
동적으로 JDBC 드라이브 클래스를 로드•
드라이버 클래스가 객체화 되고 객체화와 동시에 자동적으로 DriverManager.registerDriver()를 호출•
DriverManager에서 관리하는 드라이버 리스트에 드라이버 등록▪
DBMS MySQL 경우•
JDBC 드라이버 이름을 [com.mysql.jdbc.Driver]로도 제공▪
다양한 JDBC 드라이버32
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
다양한 JDBC 관련 클래스
❖ 주요 클래스
❖ JDBC 의 인터페이스
▪
모든 데이터베이스에서 사용할 수 있는 공통적인 데이터베이스 참조 개념을 추상화▪
특정 제품의 JDBC드라이버에서 상속받아 구현됨33
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
데이터베이스 연결 URL 구조
❖ DriverManager.getConnection() 을 호출
▪
클래스 DriverManager의 static 메소드인 getConnection()•
등록된 드라이버 중에서 주어진 URL로 데이터베이스에 연결할 수 있는 드라이버를 찾 아서•
Driver 클래스의 메소드 connect()를 호출하고•
결과인 Connection 객체를 반환❖ 데이터베이스 URL 정보
▪
JDBC 프로토콜의 의미하는 jdbc로 시작하며•
다음에 <subprotocol>, <subname>을 기술– 세 부분을 콜론(:)으로 구분
34
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
다양한 DBMS 연결 방법
❖ MySQL 의 URL에서 <subname> 요소
❖ DBMS 에 따른 데이터베이스 URL
35
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
실습예제 12-2
▪
데이터베이스 이름을 myjavadb로 생 성하는 SQL 문장•
create database myjavadb▪
메소드 executeUpdate()•
create 또는 drop과 같은 DDL이나 insert, delete, update와 같이 테 이블의 내용을 변경하는 DML 문장에 사용•
질의 문장이 DML이면 변경된 행의 수 인 정수를 반환하며, DDL이면 0을 반 환36
Section 3 JDBC 프로그래밍 구현
❖ 데이터베이스 myjavadb 만들기
단원 12 JDBC 프로그래밍
테이블 생성과 레코드 삽입을 위한 SQL
❖ 테이블을 생성하는 SQL 문장 create
▪
테이블 student•
식별자, 이름, 학번, 학과 필드로 id, name, snum, dept▪
주 키는 id❖ 테이블에 3개의 레코드를 삽입하는 insert 문장
37
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
실습예제 12-3
❖ 테이블 생성과 레코드 삽입 예제
38
Section 3 JDBC 프로그래밍 구현
package database.mysql;
import java.sql.*;
public class CreateTable {
public static void main(String[] args) { try {
String driverName = "org.gjt.mm.mysql.Driver";
String DBName = "myjavadb";
String dbURL = "jdbc:mysql://localhost:3306/" + DBName;
//+ "?useUnicode=true&characterEncoding=euckr";
String sqlCT = "create table student (" + "id varchar(20) NOT NULL, " + "name varchar(20) NOT NULL, " + "snum int NOT NULL, " +
"dept varchar(20) NOT NULL, " + "PRIMARY KEY ( id ) " +
");";
//JDBC 드라이버 로드
Class.forName(driverName);
Connection con = DriverManager.getConnection(dbURL, "root",
"");
//질의를 할 Statement 만들기
Statement stmt = con.createStatement();
//데이터베이스 myjavadb에 테이블 student 만들기 stmt.executeUpdate(sqlCT);
System.out.println("테이블 student가 생성되었습니다.");
//데이터베이스 myjavadb의 테이블 student에 레코드 삽입
stmt.executeUpdate("insert into student values ('01', '홍길 동', 20125678, '전산과학과');");
stmt.executeUpdate("insert into student values ('02', '김제 동', 20121234, '미생물학과');");
stmt.executeUpdate("insert into student values ('03', '김지 숙', 20137892, '고고학과');");
System.out.println("테이블 student에 3개의 레코드가 삽입되었습니다.");
con.close();
}
catch (Exception e) {
System.out.println("MySql 데이터베이스에 문제가 있습니다.");
System.out.println(e.getMessage());
e.printStackTrace();
} } }
단원 12 JDBC 프로그래밍
메소드 executeQuery()와 인터페이스 ResultSet
❖
메소드 executeQuery()▪
테이블 형태의 결과를 인터페이스 ResultSet으로 반환▪
데이터베이스 구조와 테이블의 내용에 영향을 미치지 않는 select 문 질의에 적합❖
인터페이스 ResultSet▪
실질적으로 질의 결과의 자료가 있는 영역과 함께 BOF, EOF 제공•
첫 행 자료 이전(Before the First Row)에 BOF(Begin Of File)
•
마지막 행 자료 이후(After the Last Row)에 EOF(End Of File)
▪
각각의 행에서 각 칼럼은 칼럼이름 또는 번호 순으로 식별•
번호는 1번부터 시작39
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
인터페이스 ResultSet의 커서 이동 메소드
❖
인터페이스 ResultSet▪ 질의 결과의 현재 행(row)을 가리 키는 커서(cursor)라는 개념
▪ next()
• 커서를 다음 행으로 이동시키는 메소드
▪ 커서를 이동시키는 다양한 메소드 를 제공
▪ while 문장으로 ResultSet에서 자료가 있는 1행부터 마지막 행까 지 순회
• 커서는 처음에 BOF에 위치
– 메소드 next()는 커서를 다음 행 으로 이동
– 행이 자료가 있는 행이면 true 를 반환
– BOF나 EOF과 같이 자료가 없 는 행이면 false를 반환
40
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
ResutSet 의 메소드 getString()과 getInt()
❖ 행에서 컬럼 자료를 참조
▪
ResultSet의 메소드 getString()을 이용•
인자는 칼럼이름을 문자열로 직접 쓰거나 또는 칼럼 번호를 이용•
getInt(), getDouble(), getDate() 등 다양한 컬럼 반환 메소드를 제공41
Section 3 JDBC 프로그래밍 구현
단원 12 JDBC 프로그래밍
실습예제 12-4
❖
데이터베이스 myjavadb에 있는 테이블 student를 모두 조회하여 출력42
Section 3 JDBC 프로그래밍 구현
package database.mysql;
import java.sql.*;
public class SelectTable {
public static void main(String[] args) { try {
String driverName = "org.gjt.mm.mysql.Driver";
String DBName = "myjavadb";
String dbURL = "jdbc:mysql://localhost:3306/" + DBName;
String SQL = "select * from student;";
//JDBC 드라이버 로드
Class.forName(driverName);
Connection con =
DriverManager.getConnection(dbURL, "root", "");
//질의를 할 Statement 만들기
Statement stmt = con.createStatement();
//데이터베이스 myjavadb의 테이블 student에 레코드 조회
ResultSet result = stmt.executeQuery(SQL);
System.out.println(" --- 테이블 student 내용 조회 ---");
while (result.next()) {
System.out.print(result.getString(1) + "\t");
System.out.print(result.getString(2) + "\t");
System.out.print(result.getInt(3) + "\t");
System.out.println(result.getString(4));
}
con.close();
}
catch (Exception e) {
System.out.println("MySql 데이터베이스에 문제가 있습니 다.");
System.out.println(e.getMessage());
e.printStackTrace();
} } }