17장

Similar documents
쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint - aj-lecture5.ppt [호환 모드]

10.ppt

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드]

Spring Boot/JDBC JdbcTemplate/CRUD 예제

DBMS & SQL Server Installation Database Laboratory

PowerPoint 프레젠테이션

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Microsoft PowerPoint - 10Àå.ppt

PowerPoint Presentation

윈도우시스템프로그래밍

JDBC 소개및설치 Database Laboratory

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint 프레젠테이션

Windows 8에서 BioStar 1 설치하기

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

歯JavaExceptionHandling.PDF

JAVA PROGRAMMING 실습 09. 예외처리

웹연동 } 웹 (Web) 환경에서데이터베이스시스템을연동하는방법은다음과같다 } Server Client 구조의통신 (2-Tier) } Server Middleware Client 구조의통신 (3-Tier) 2

- 다음은 Statement 객체를사용해서삽입 (insert) 작업의예 String sql = "insert into member(code, name, id, pwd, age) values ("; int id = 10; sql = sql + id +, ;// 항목사이에

윈도우시스템프로그래밍

Microsoft PowerPoint Python-DB

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Presentation

준비사항 } 실습조건 } MS-SQL Server 에연결가능한컴퓨터 } 실습용서버혹은별도의 MS-SQL 서버 } Northwind 데이터베이스 } MS-SQL 2000 에제공되는예제데이터베이스 } MS-SQL 2008 에는 Northwind 가기본으로제공되지않기때문에실

PowerPoint Presentation

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

MySQL-.. 1

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

FileMaker ODBC 및 JDBC 가이드

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint - 03-TCP Programming.ppt

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

제11장 프로세스와 쓰레드

강의 개요

FileMaker 15 ODBC 및 JDBC 설명서

JAVA PROGRAMMING 실습 08.다형성

5장 SQL 언어 Part II

gnu-lee-oop-kor-lec06-3-chap7

문서 템플릿

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Presentation

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

슬라이드 제목 없음

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

Design Issues

PowerPoint Presentation

Microsoft Word - src.doc

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

개발문서 Oracle - Clob

FileMaker ODBC and JDBC Guide

PowerPoint Presentation

JTable과 MVC(Model-View-Controller) 구조 - 모델-뷰-컨트롤러구조는데이터의저장과접근에대한제공은모델이담당하고, 화면표시는뷰, 이벤트의처리는컨트롤러가하도록각역할을구분한구조이다. 즉, 역할의분담을통하여상호간의영향을최소화하고각요소의독립성을보장하여독자

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

[ 목차 ] 5.1 데이터베이스프로그래밍개념 5.2 T-SQL T-SQL 문법 5.3 JAVA 프로그래밍 2

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

뇌를 자극하는 JSP & Servlet 슬라이드

chap 5: Trees

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

슬라이드 1

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

쉽게

JVM 메모리구조

슬라이드 1

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

빅데이터분산컴퓨팅-5-수정

슬라이드 1

슬라이드 1

rmi_박준용_final.PDF

JUNIT 실습및발표

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

Java ...

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint 프레젠테이션

Spring Boot

TEST BANK & SOLUTION

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

FileMaker ODBC and JDBC Guide

Spring Data JPA Many To Many 양방향 관계 예제

NoSQL

PowerPoint Presentation

Transcription:

17 JDBC 프로그래밍 O b j e c t i v e s 데이터베이스개념을이해한다. JDBC 구조를이해한다. MySQL을간단히설치하고활용할줄안다. 데이터베이스생성 접속, 테이블생성, 레코드추가 삭제, 데이터검색 수정등을위한 SQL 문을이해한다. JDBC를이용한데이터베이스프로그래밍을작성해본다.

C H A P T E R JAVA PROGRAMMING JDBC 프로그래밍 17.1 데이터베이스 데이터베이스란? 데이터베이스 데이터베이스 (database) 는여러응용시스템들의통합된정보들을저장하여운영할수있는공용데이터들의집합이다. 데이터베이스는대규모의데이터를효율적으로저장, 검색, 갱신할수있도록데이터를고도로조직화하여저장한다. 급여관리 시스템 근태관리 시스템 복리후생관리 시스템 DB 서버 급여 정보인사 정보근태 정보복리후생 정보 데이터베이스 [ 그림 17-1] 데이터베이스를사용하는기업내의여러소프트웨어시스템

제 17 장 JDBC 프로그래밍 823 17CHAPTER 예를들어, 회사의직원을관리하는시스템을생각해보자. [ 그림 17-1] 과같이각직원에대한인사정보, 근태정보, 급여정보, 복리후생정보들이있을수있다. 이정보들은서로연관되어있어만약한직원이퇴사를하면모든정보에영향을미친다. 또한회사내의각부서에서사용하는서로다른다수의프로그램이동시에접속하여이러한정보들을사용할수있으므로데이터베이스는정보들을고도로조직화하여데이터의무결성이유지될수있도록관리하여야한다. DBMS 그러면 [ 그림 17-1] 과같이데이터베이스에대해서로다른여러소프트웨어시스템이동시에접근할때이를잘관리할수있는방법은무엇인가? 데이터베이스를관리하는소프트웨어시스템을 DBMS(DataBase Management System) 라고한다. DBMS는다수의사용자들이동시에데이터베이스를사용할수있도록관리한다. 대표적인 DBMS로는오라클 (Oracle), 마이크로소프트의 SQL Server, MySQL, IBM의 DB2 등이있다. 데이터베이스를이용하는모든자바응용프로그램역시반드시 DBMS에게데이터처리를요청하며, 이작업은 DBMS에의해일관성있게처리된다. DBMS 데이터베이스의종류 데이터베이스의종류에는크게관계형데이터베이스 (relational database), 객체지향데이터베이스 (object oriented database) 가있다. 관계형데이터베이스객체지향데이터베이스 관계형데이터베이스관계형데이터베이스는 [ 그림 17-2] 와같이데이터들이다수의테이블로구성된다. [ 그림 17-2] 에서첫번째테이블은두개의열 (column) 로구성되며, 두번째테이블은 3 개의열로구성된다. 첫번째테이블은사원 ID(employee_id) 와이름 (name) 으로구성되고, 두번째테이블은사원 ID(employee_id) 와급여대상 ID(payroll_id), 급여 (amount) 로구성된다. 테이블의각행 (row) 은하나의레코드 (record) 이며각테이블은키 (key) 와값 (value) 들의관계로표현된다. 키는테이블의열이름이며, 키중에서특정레코드를검색하거나레코드들을정렬할때우선적으로참조되는키를일차키 (primary key) 라고한다. 여러테이블간에는 [ 그림 17-2] 의 employee_id와같이공통된이름의열을포함할수있으며, 이런경우서로다른테이블간에관계 (relation) 가성립된다. 현재사용되는대부분의데이터베이스는관계형데이터베이스이며 JDBC API도관계형데이터베이스에대한 API이다. 테이블열행레코드키값일차키관계

824 JAVA 자바프로그래밍 JAVA PROGRAMMING 키 값 employee_id 00001 00002 name 김철수 최고봉 테이블 A 두 테이블이 동일한키를 가지고 있음 : 관계 00003 이기자 payroll_id amount employee_id 테이블 B 00000001 1000000 00002 00000002 2000000 00010 00000003 3000000 00021 [ 그림 17-2] 관계형데이터베이스구조 오브젝트데이터베이스 객체지향데이터베이스객체지향데이터베이스는객체지향프로그래밍에쓰이는것으로, 정보를객체의형태로표현하는데이터베이스이며오브젝트데이터베이스 (object database) 라고도부른다. 장점은객체모델이그대로데이터베이스에도적용되므로응용프로그램의객체모델과데이터베이스의모델이부합하는데있다. 그러나현재관계형데이터베이스로된 DBMS와그에따른응용프로그램들이주류를이루고있어객체지향데이터베이스는틈새시장을차지하고있다. SQL SQL SQL(Structured Query Language) 은관계형데이터베이스관리시스템 (DBMS) 에서데이터베이스스키마생성, 자료의검색 관리 수정, 그리고데이터베이스객체접근관리등을위해고안된언어이다. 이언어는다수의데이터베이스관련프로그램들이표준으로채택하고있다. 자바응용프로그램에서도 SQL로작성된간단한데이터베이스처리명령어를 DBMS에게보내어데이터베이스처리를지시한다. JDBC JDBC JDBC는관계형데이터베이스에저장된데이터를접근및조작할수있게하는자바 API이다. JDBC는자바응용프로그램이다양한 DBMS에대해일관된 API로데이터베이스연결, 검색, 수정, 관리등을할수있게한다. 그러므로자바응용프로그램개발자는 DBMS의종류에관계없이 JDBC API만을이용하면된다.

제 17 장 JDBC 프로그래밍 825 17CHAPTER [ 그림 17-3] 과같이일반적으로 DBMS를제공하는회사에서 JDBC 드라이버를제공하며자바응용프로그램에서는 JDBC 드라이버를 JDBC 매니저를통해로드하여사용한다. 따라서사용하는 DBMS가바뀌어도이에따른 JDBC 드라이버만로드하면되므로자바프로그램에서는 DBMS 변경에따른프로그램수정이필요없다. JDBC 드라이버매니저는자바 API에서지원하는클래스이다. 이해를돕기위해이들용어를다시한번정리한다. JDBC 드라이버매니저 : 자바 API에서지원하며 DBMS를접근할수있는JDBC 드라이버로드 JDBC 드라이버 : DBMS마다고유한 JDBC 드라이버를제공하며, JDBC 드라이버와 DBMS는전용프로토콜을이용하여데이터베이스처리 DBMS : 데이터베이스관리시스템으로데이터베이스생성 삭제, 데이터생성 검색 삭제등을전담하는소프트웨어시스템 클라이언트 자바 응용프로그램 JDBC 드라이버 매니저 DBMS 가 바뀌어도자바 응용프로그램은변하지 않음 자바 응용프로그램 JDBC 드라이버 매니저 클라이언트 JDBC 드라이버매니저를이용하는자바응용프로그램은 DBMS가 A사의것이든 B사의것이든상관없이작동됩니다. 그것은각 DBMS 회사에서제공하는 JDBC 드라이버를설치하면해결되기때문이며, 이드라이버를로딩하는것은 JDBC 드라이버매니저이기때문입니다. A 사 JDBC 드라이버 B 사 JDBC 드라이버 A 사 DMBS 전용 프로토콜 B 사 DMBS 전용 프로토콜 A 사 DBMS DB 서버 B 사 DBMS DB 서버 [ 그림 17-3] JDBC 구조 오라클, SQL Server, MySQL 등을무엇이라고부르는가? 다수의테이블로구성되고테이블의관계를통해데이터를관리하는데이터베이스종류는무엇인가? CHECK TIME 자바로작성된데이터베이스관리프로그램이다양한종류의 DBMS 에관계없이작성될수있는이유는무엇인가?

826 JAVA 자바프로그래밍 JAVA PROGRAMMING 17.2 MySQL MySQL은무료로다운로드받아설치하여간편하게사용할수있는관계형 DBMS 중의하나이다. 현재 MySQL은데이터베이스시스템으로많이사용되고있다. 이장에서는 MySQL을이용하여데이터베이스응용프로그램개발을실습해보기로한다. 다운로드 MySQL은 [ 그림 17-4] 와같이http://www.mysql.com/downloads/ 에서다운로드받을수있다. 여기서다운로드를선택하고 [ 그림 17-5] 와같이마이크로소프트윈도우플랫폼을선택하여다운로드를시작한다. 클릭! [ 그림 17-4] MySQL 다운로드사이트에서다운로드선택

제 17 장 JDBC 프로그래밍 827 17CHAPTER 플랫폼 선택 다운로드 [ 그림 17-5] 마이크로소프트윈도우플랫폼선택후다운로드 설치 설치를시작한후에는 [ 그림 17-6] 과같이 Typical 설치를선택하여설치를진행한다. Typical 이면실습용으로는충분하다.

828 JAVA 자바프로그래밍 JAVA PROGRAMMING 실습용으로는 typical 이면 충분 [ 그림 17-6] 설치타입을 Typical 로선택 설치가완료된후에는 [ 그림 17-7] 과같이MySQL을 DBMS로사용하기위해 MySQL Server 설정을선택하여바로설정을시작한다. 서버 설정 선택 [ 그림 17-7] 설치후서버설정선택

제 17 장 JDBC 프로그래밍 829 17CHAPTER DBMS 서버설정 실습용으로는표준설정이면충분하므로 [ 그림 17-8] 과같이표준설정 (Standard Configuration) 을선택한다. 표준 설정 선택 [ 그림 17-8] 표준설정선택 표준설정선택후 Next 버튼을누르면 [ 그림 17-9] 와같은화면이나타난다. 여기서 SQL 서버가윈도우서비스 (windows service) 로동작하도록선택하고 MySQL 서버를항상사용할것이아니라면서버자동시작은선택을해제한다. 그리고 MySQL 명령행 (command line) 도구사용을위해경로가윈도우의환경변수에포함되도록옵션을선택한다.

830 JAVA 자바프로그래밍 JAVA PROGRAMMING MySQL 서버가 윈도우 서비스로 동작 수동으로 서버 동작시킴 환경 변수에 경로 포함 [ 그림 17-9] 표준설정화면 다시 Next 버튼을누르면보안관련선택을위한 [ 그림 17-10] 의화면이나타난다. 여기의서버인스턴스설정화면에서의보안및계정관련옵션은실습용으로사용할것이므로디폴트를선택한다. 실습용으로 익명 계정 생성 [ 그림 17-10] 서버인스턴스설정 이제 MySQL 서버의다운로드및설치가완료되었다. 지금부터 MySQL 데이터베이스관리시스템의작동이가능하다. 그러면 MySQL 서버와접속하여자바응용프로그램의

제 17 장 JDBC 프로그래밍 831 17CHAPTER 대변자역할을수행할 MySQL 용 JDBC 드라이버를설치해보자. JDBC 드라이버다운로드 일반적으로 JDBC 드라이버는 DBMS 회사가제공한다. MySQL용 JDBC 드라이버도 [ 그림 17-11] 과같이MySQL 사이트에서다운로드받도록한다. ZIP 파일형태로다운로드받는다. MySQL Connectors 페이지에서 Connector/J 선택 ZIP 파일 다운로드 [ 그림 17-11] MySQL 용 JDBC 드라이버다운로드사이트 JDBC 드라이버설치 JDBC 드라이버는따로설치과정이필요없고, 다운로드받은 ZIP 파일을풀어서생긴 JAR 파일을 [ 그림 17-12] 와같이JDK 설치디렉터리밑의 JRE\LIB\EXT 디렉터리에복사 하면된다. 만약 JDK는없고JRE만설치한경우에는 JRE 설치디렉터리밑의 LIB\EXT 디렉터리에복사하도록한다. 이디렉터리에설치하면 JDK나이클립스에서특별히 JDBC 드라이버경로를지정하지않아도자동으로참조한다.

832 JAVA 자바프로그래밍 JAVA PROGRAMMING [ 그림 17-12] JDBC 드라이버설치 17.3 콘솔에서 MySQL 데이터베이스활용 우선자바로 MySQL 을이용하는데이터베이스프로그래밍을해보기전에콘솔창에서 MySQL의명령을직접활용하여데이터베이스와테이블을만들고, 레코드를쓰고, 검색하는등의 MySQL 활용을직접해보자. MySQL 서버실행 MySQL 서버는설정시윈도우서비스로동작하도록설정하였으므로 MySQL 서버를실행시키기위해윈도우의제어판에서다음메뉴를이용한다. 제어판 \ 시스템및보안 \ 관리도구 에서 서비스 실행 서비스관리자를실행하면 [ 그림 17-13] 과같이MySQL 서버의실행상태를확인할수있다. MySQL 서버는서비스관리자에서수동으로실행시작및중지할수있으며, MySQL 서버를사용하지않을때는불필요한리소스를사용하지않도록서버를중지시킨다.

제 17 장 JDBC 프로그래밍 833 17CHAPTER [ 그림 17-13] MySQL 서버실행상태를확인하고실행시작및중지지시 데이터베이스생성 자바에서 JDBC를이용하여데이터베이스에접근하여데이터를조작하려면먼저데이터베이스가만들어져있어야한다. MySQL 설치디렉터리밑의 bin 디렉터리에설치된명령행도구인 mysqladmin.exe를이용하여다음과같이데이터베이스를생성해보자. mysqladmin -u root create sampledb mysqladmin 명령에서 -u root 옵션은 root 계정으로명령을수행하는것을의미하며 create 옵션은데이터베이스를생성하도록하는명령이다. sampledb는생성할데이터베이스의이름이다. 이명령의실행결과비어있는 sampledb가생성된다. [ 그림 17-14] 는이명령의실제실행모습이다. [ 그림 17-14] sampledb 데이터베이스생성

834 JAVA 자바프로그래밍 JAVA PROGRAMMING 데이터베이스접속 데이터베이스에접속할때는다음과같이 mysql 명령을이용한다. mysql.exe 는 MySQL 설치디렉터리밑의 bin 디렉터리에설치된명령행도구이다. mysql -u root mysql에서 -u root는 root 계정으로접속함을의미한다. 접속후에는 mysql 프롬프트가나타나는데여기서다양한명령을입력하여데이터베이스를조작할수있다. [ 그림 17-15] 는 mysql을실행한화면이다. use 명령은지정한데이터베이스를사용하는명령으로서 mysql> 프롬프트에서사용한다음의 use 명령은 sampledb를사용하겠다는명령이다. use sampledb [ 그림 17-15] mysql 명령을이용하여데이터베이스를접속하고 sampledb 를사용하도록지정 테이블생성관계형데이터베이스에서는행과열로구성된테이블단위로데이터가저장되므로데이터를저장하기위해서는먼저테이블을만들어야한다. 본예제에서는 < 표 17-1> 과같은구조를갖는 student라는이름의테이블을생성해보자. 각행은다음과같은의미를가진다. 첫번째행은열의이름 두번째행은테이터타입과크기를표시. char, varchar 등의타입은자바의타입이아닌MySQL에서사용되는타입임에주의

제 17 장 JDBC 프로그래밍 835 17CHAPTER id name dept char(7) varchar(10) varchar(20) < 표 17-1> student 테이블구조 MySQL의자세한데이터타입은사이트에서문서를참조하기바란다. 이제테이블을생성해보자. 테이블생성은 MySQL 프롬프트상에서다음과같은 create 명령을이용하여생성한다. create table student (name varchar(10) not null, dept varchar(20) not null, id char(7) not null, primary key(id)); create table 다음에테이블이름지정 열이름데이터타입 ( 데이터크기 ) 을콤마로분리하여나열 "not null" 은해당열의값이null이될수없음을의미 "primary key" 는일차키를지정하는옵션이며 id를일차키로지정 모든명령은 ; 으로끝나며 ; 을입력하지않고 <Enter> 키를누르면아직명령이종료되지않은것으로간주하여 ; 이입력될때까지기다림 [ 그림 17-16] 은 MySQL 프롬프트에서 create 명령으로 student 테이블을생성한후, desc 명령으로테이블의구조를재출력한그림이다. [ 그림 17-16] 테이블생성

836 JAVA 자바프로그래밍 JAVA PROGRAMMING 레코드추가 테이블이생성되었으면데이터를기록할수있다. 테이블에는레코드단위로데이터를추가하는데, 레코드추가는다음과같이 insert 명령을사용한다. insert into student (name, dept, id) values (' 김철수 ',' 컴퓨터시스템 ','1091011'); insert into 다음에테이블이름지정 테이블이름다음괄호안에열이름을콤마로구분하여나열 values 다음괄호안에열의값들을콤마로구분하여나열 문자타입의데이터는단일인용부호로묶어서표시함에유의 이명령은 student 테이블에한레코드를추가하는데, name, dept, id 필드의값을 김철수, 컴퓨터시스템, 1091011 로각각입력한다. [ 그림 17-17] 은 insert 명령을이용하여 3개의레코드를추가하는명령을실행하는모습이다. [ 그림 17-17] 레코드추가 [ 그림 17-17] 과같이 3 개의레코드를추가한후의 student 테이블구조는 < 표 17-2> 와같다. < 표 17-2> 3 개의레코드가추가된 student 테이블 id name dept 1091011 김철수컴퓨터시스템 0792012 최고봉멀티미디어 0494013 이기자컴퓨터공학

제 17 장 JDBC 프로그래밍 837 17CHAPTER 데이터검색 데이터베이스로부터데이터검색은다음과같은 select 명령을이용한다. select name, dept, id from student where dept=' 컴퓨터공학 '; select 다음에는데이터를추출할열이름을콤마로분리하여나열 모든열에대해데이터를추출할때는 * 를열이름대신사용 from 다음에테이블이름을지정 where 다음에검색조건지정. 위의예에서 dept 값이 컴퓨터공학 인레코드검색 where는생략가능 이 select 명령은 student 테이블에서 dept 필드의값이 컴퓨터공학 인레코드를찾아 name, dept, id 필드의값을출력할것을지시하는명령이다. student 테이블의모든레코드를검색하여출력하도록지시하는명령은다음과같다. select * from student; [ 그림 17-18] 은 select 명령을실제입력하여데이터를검색하는화면이다. [ 그림 17-18] select 명령을이용한데이터검색

838 JAVA 자바프로그래밍 JAVA PROGRAMMING 데이터수정 데이터수정은다음과같은 update 명령을이용한다. update student set dept=' 컴퓨터공학 ' where name=' 최고봉 '; update 다음에는테이블이름지정 set 다음에수정할열의이름과값을콤마로분리하여나열 where 다음에는검색조건을지정. 위의예에서는 name 값이 최고봉 인레코드의데이터수정 where는생략가능 이 update 명령은 student 테이블의 name 필드의값이 최고봉 인레코드를찾아서 dept 필드의값을 컴퓨터공학 으로변경하도록지시하는명령이다. [ 그림 17-19] 는 update 명령을이용하여데이터를수정하는화면이다. [ 그림 17-19] update 명령을이용한데이터수정 레코드삭제 테이블에들어있는레코드의삭제는다음과같은 delete 명령을이용한다. delete from student where name=' 최고봉 '; delete from 다음에는테이블이름지정

제 17 장 JDBC 프로그래밍 839 17CHAPTER where 다음에는검색조건지정. 앞의예에서는 name 값이 최고봉 인레코드삭제 where는생략가능 이 delete 명령은 student 테이블에서 name 필드의값이 최고봉 인레코드를찾아삭제하도록지시하는명령이다. [ 그림 17-20] 은 delete 명령을이용하여레코드를삭제하는화면이다. [ 그림 17-20] 레코드삭제 본문에서만든 student 테이블에서 dept 가 컴퓨터시스템 인레코드를찾아레코드를모두삭제하라. 다음표와같은테이블 University 를만들고 5 개의레코드를추가하라. CHECK TIME id name location char(7) varchar(20) varchar(100)

840 JAVA 자바프로그래밍 JAVA PROGRAMMING 17.4 JDBC 프로그래밍 앞절에서 MySQL의명령행도구를이용하여콘솔에서데이터베이스를생성하고, 데이터의추가 검색 수정 삭제등을실행하였다. 이제자바로데이터베이스를조작하는응용프로그램을작성하는방법을설명해보자. JDBC 프로그래밍이란 JDBC API를이용하여데이터의추가, 삭제, 수정, 검색등을할수있는자바응용프로그램을작성하는것이다. 이절의설명은 MySQL이설치되어있고 sampledb가만들어진상황에서계속된다. 데이터베이스연결설정 JDBC 프로그래밍의가장첫번째단계는데이터베이스와의연결이다. 데이터베이스와의연결을위해서는우선데이터베이스의 JDBC 드라이버의로드가이루어져야한다. JDBC 드라이버 MySQL 서버의 JDBC 드라이버로드 JDBC 드라이버를로드하기위해드라이버클래스파일을로드한다. 다음과같이자바의 Class 클래스의 forname() 메소드를이용하면특정클래스파일을읽어들일수있다. try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printstacktrace(); } 위의코드는 MySQL의 JDBC 드라이버인 com.mysql.jdbc.driver 클래스를로드하여드라이버인스턴스를생성하고 DriverManager에등록한다. DriverManager 클래스는 [ 그림 17-3] 에서의 JDBC 드라이버매니저역할을하는클래스이다. JDBC 드라이버의클래스이름은사용하는 DBMS에따라다를수있으므로해당 DBMS의 JDBC 드라이버문서를참조해야한다. 만일로드중에 JDBC 드라이버가없으면 ClassNotFoundException 이발생하므로반드시 try-catch 문을사용한다. Connection 객체 자바응용프로그램과 JDBC의연결 DriverManager는자바응용프로그램을 JDBC 드라이버에연결시켜주는클래스이다. 다음코드와같이 DriverManager.getConnection() 메소드를호출하여데이터베이스에연결하고 Connection 객체를반환한다.

제 17 장 JDBC 프로그래밍 841 17CHAPTER try { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledb", "root",""); } catch (SQLException e) { e.printstacktrace(); } getconnection() 에서 jdbc: 이후에지정되는 URL 형식은 DBMS에따라다르므로 JDBC 문서참조 MySQL 서버가현재동일한컴퓨터에서동작하므로서버주소를 localhost로지정 MySQL의경우디폴트로 3306 포트를사용 sampledb는앞서생성한 DB의이름 root 는 DB에로그인할계정이름이며, 는 root의패스워드 sampledb 데이터베이스에연결하는 JDBC 프로그램작성 예제 17-1 JDBC를이용하여 sampledb 데이터베이스에연결하는자바응용프로그램을작성하라. 만약 MySQL 서버가실행중이지않으면다음과같은오류가발생한다. DB 연결오류 이경우는윈도우의서비스관리자에서 MySQL 서버를동작시키면된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import java.sql.*; public class JDBC_Ex1 { public static void main (String[] args) { try { Class.forName( com.mysql.jdbc.driver ); // MySQL 드라이버로드 Connection conn = DriverManager.getConnection( jdbc:mysql://localhost: 3306/sampledb, root, ); // JDBC 연결 System.out.println( DB 연결완료 ); } catch (ClassNotFoundException e) { System.out.println( JDBC 드라이버로드오류 ); } catch (SQLException e) { System.out.println( DB 연결오류 ); } } }

842 JAVA 자바프로그래밍 JAVA PROGRAMMING 실행 결과 DB 연결완료 데이터베이스사용 Statement 클래스 ResultSet 클래스 자바에서데이터베이스에연결한후에는 17.3절에서설명한 MySQL 명령행도구에서사용한 SQL 문을똑같이사용하여데이터베이스에접근한다. 자바에서 SQL 문을실행하기위해서는 Statement 클래스를이용하고, SQL 문실행결과를얻어오기위해서는 ResultSet 클래스를이용한다. Statement 클래스에서자주사용되는메소드는 < 표 17-3> 과같다. < 표 17-3> Statement 클래스메소드 메소드 ResultSet executequery(string sql) int executeupdate(string sql) void close() 설명주어진 sql 문을실행하고결과는 ResultSet 객체에반환 insert, update 또는 delete와같은sql 문을실행하고, sql 문실행으로영향을받은행의개수나 0을반환 Statement 객체의데이터베이스와 JDBC 리소스를즉시반환 executequery() executeupdate() 데이터를검색하기위해서는 executequery() 메소드를사용하고, 추가 수정 삭제와같은데이터변경은 executeupdate() 메소드를이용한다. ResultSet 객체는현재데이터의행 ( 레코드위치 ) 을가리키는커서 (cursor) 를관리한다. 초깃값은첫번째행이전을가리키도록되어있다. 따라서 ResultSet 클래스는주로커서의위치와관련된메소드와레코드를가져오는메소드를제공한다. ResultSet 클래스에서자주사용되는메소드는 < 표 17-4> 와같다. < 표 17-4> ResultSet 클래스메소드 메소드 boolean first() boolean last() boolean next() boolean previous() boolean absolute(int row) 설명커서를첫번째행으로이동커서를마지막행으로이동커서를다음행으로이동커서를이전행으로이동커서를지정된행 row로이동

제 17 장 JDBC 프로그래밍 843 17CHAPTER boolean isfirst() boolean islast() void close() Xxx getxxx(string columnlable) Xxx getxxx(int columnindex) 첫번째행이면 true 반환마지막행이면 true 반환 ResultSet 객체의데이터베이스와 JDBC 리소스를즉시반환 Xxx는해당데이터타입을나타내며현재행에서지정된열이름 (columnlable) 에해당하는데이터를반환한다. 예를들어, int형데이터를읽는메소드는 getint() 이다. Xxx는해당데이터타입을나타내며현재행에서지정된열인덱스 (columnindex) 에해당하는데이터를반환한다. 예를들어, int형데이터를읽는메소드는 getint() 이다. 데이터검색 테이블의모든데이터검색 student 테이블의모든데이터를검색하는코드는다음과같다. Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery("select * from student"); 검색된결과는 rs 에들어있다. 특정열만검색테이블에서특정열만검색하고싶은경우는 * 대신에검색할열의이름을콤마로분리하여나열한다. 다음은 student 테이블에서모든레코드에대해 name과 id 필드만을검색한다. ResultSet rs = stmt.executequery("select name, id from student"); 검색된결과는 rs 에들어있다. 조건검색특정조건에부합하는데이터를검색하고싶은경우는다음코드와같이 select 문의 where 절을이용하여조건에맞는데이터를검색한다. 다음은 student 테이블에서 id 필드의값이 0494013인레코드를검색한다. select 문 where 절

844 JAVA 자바프로그래밍 JAVA PROGRAMMING ResultSet rs = stmt.executequery("select name, id, dept from student where id='0494013'"); 검색된결과는 rs 에들어있다. 검색된데이터의사용검색의결과는 ResultSet 객체에저장된다. ResultSet 클래스의메소드를이용하여커서가가리키는현재행에대해열의값을읽어온다. 예를들어, ResultSet 클래스의객체 rs에저장된 name 필드의값과 id 필드의값을얻어내기위해서는각각다음과같이한다. String sname = rs.getstring("name"); // name 필드값읽기 String id = rs.getstring("id"); // id 필드값읽기 다음코드는 ResultSet 객체에저장된각행의모든열을순차적으로출력하는코드이다. while (rs.next()) { // rs에저장된다음행으로커서를옮긴다. System.out.println(rs.getString("name")); System.out.println(rs.getString("id")); System.out.println(rs.getString("dept")); } 열의값을읽기위해서는열의데이터타입을알고있어야하며, 그에맞는 ResultSet 클래스의메소드를호출해야한다. 또는모든데이터타입에대해 getstring() 메소드로읽을수있는데, 이경우는모든값이문자열로반환되므로프로그램내에서적절한데이터타입으로변환해서사용해야한다. ISO-8859-1 유니코드 문자열코드문제 MySQL은기본적으로문자집합으로 ISO-8859-1 표준을사용하지만자바는유니코드 (Unicode) 를사용한다. 그러므로자바에서 MySQL로부터한글데이터를읽어와서출력하면한글이깨져서출력된다. 따라서한글을제대로출력하기위해서는 ISO-8859-1 표준의문자코드를유니코드로변환하여야한다. 다음코드는 ResultSet에포함된데이터중에서 name 필드의문자열값을 ISO-8859-1 에서유니코드로변환하여출력하는코드이다.

제 17 장 JDBC 프로그래밍 845 17CHAPTER String ISO_8859_1String = rs.getstring("name"); // MySQL로부터읽은문자열은 ISO-8859-1 표준코드 byte [] UnicodeBytes = ISO_8859_1String.getBytes("ISO-8859-1"); // 유니코드로변환 String UnicodeString = new String(UnicodeBytes); System.out.print(UnicodeString); 반대로 SQL 문의조건검색같은문장에서한글을쓰면자바는유니코드로인코딩하므로 MySQL에서는한글이아닌다른문자로인식하여검색이제대로실행되지않는다. 따라서이경우는유니코드를 ISO-8859-1 로변환해야 MySQL에서제대로한글로인식하여처리한다. 다음코드는유니코드를 ISO-8859-1 로변환하여 SQL 문을 MySQL 로전달하여실행시키는코드이다. // " 홍길동 " 을유니코드의바이트배열로변환한다. byte [] UnicodeBytes = " 홍길동 ".getbytes(); // 유니코드바이트배열을 "ISO-8859-1" 표준의코드로변환하여문자열을구성한다. String ISO_8859_1String = new String(UnicodeBytes, "ISO-8859-1"); stmt.executequery("select name, id, dept from student where name='"+ ISO_8859_1String +"'"); 데이터검색과출력 예제 17-2 앞서생성한 sampledb의 student 테이블의모든데이터를출력하고, 특별히이름이 이기자 인학생의데이터를출력하는프로그램을작성하라. 1 2 3 4 5 6 7 8 9 10 11 import java.io.*; import java.sql.*; public class JDBC_Ex2 { public static void main (String[] args) { Connection conn; Statement stmt = null; try { Class.forName( com.mysql.jdbc.driver ); // MySQL 드라이버로드 conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/ sampledb, root, ); // JDBC 연결 System.out.println( DB 연결완료 );

846 JAVA 자바프로그래밍 JAVA PROGRAMMING 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 stmt = conn.createstatement(); // SQL문처리용 Statement 객체생성 ResultSet srs = stmt.executequery( select * from student ); // 테이블의모든데이터검색 printdata(srs, name, id, dept ); srs = stmt.executequery( select name, id, dept from student where name= + new String( 이기자.getBytes(), ISO-8859-1 ) + ); // name이 이기자 인레코드만검색 printdata(srs, name, id, dept ); 유니코드를 ISO-8859-1로 변환 } catch (ClassNotFoundException e) { System.out.println( JDBC 드라이버로드오류 ); } catch (SQLException e) { System.out.println( SQL 실행오류 ); } catch (UnsupportedEncodingException e) { System.out.println( 지원되지않는인코딩타입 ); } } // 레코드의각열의값화면에출력 private static void printdata(resultset srs, String col1, String col2, String col3) throws UnsupportedEncodingException, SQLException { while (srs.next()) { if (!col1.equals( )) System.out.print(new String(srs.getString( name ).getbytes( ISO- 8859-1 ))); // 한글코드변환 } } } if (!col2.equals( )) ISO-8859-1을 System.out.print( \t \t + srs.getstring( id )); 유니코드로 변환 if (!col3.equals( )) System.out.println( \t \t + new String(srs.getString( dept ). getbytes( ISO-8859-1 ))); // 한글코드변환 else System.out.println(); 실행 결과 DB 연결완료 이기자 0494013 컴퓨터공학 김철수 1091011 컴퓨터시스템 이기자 0494013 컴퓨터공학

제 17 장 JDBC 프로그래밍 847 17CHAPTER 데이터의변경 추가, 수정, 삭제와같이데이터에변경을가하는조작은 executeupdate() 메소드를이용한다. 레코드추가새로운레코드를추가하기위해서는 SQL의 insert 문을사용한다. 다음은 insert 문을이용하여데이터를추가하는코드이다. insert 문 stmt.executeupdate("insert into student (name, id, dept) values('" + new String(" 아무개 ".getbytes(), "ISO-8859-1") + "', '0893012', '" + new String(" 컴퓨터공학 ".getbytes(),"iso-8859-1") +"');"); SQL 문은 MySQL에서처리하므로한글을유니코드에서 ISO-8859-1 로변환한것에유의한다. 데이터수정기존열의값을수정하기위해서는 SQL의 update 문을사용한다. 다음은 update 문을이용하여조건에맞는테이블의열의값을수정하는코드이다. update 문 stmt.executeupdate("update student set id='0189011' where name='"+ new String(" 아무개 ".getbytes(), "ISO-8859-1") +"'"); 레코드삭제레코드를삭제하기위해서는 SQL의 delete 문을사용한다. 다음은 delete 문을이용하여조건에맞는테이블의행을삭제하는코드이다. delete 문 stmt.executeupdate("delete from student where name='"+ new String(" 아무개 ".getbytes(), "ISO-8859-1") +"'");

848 JAVA 자바프로그래밍 JAVA PROGRAMMING 예제 17-3 데이터의변경 앞서생성한 sampledb의 student 테이블에새로운학생정보를추가하고, 새로생성된학생의정보를수정한후에다시삭제하는코드를작성하라. 데이터가변경될때마다모든테이블의내용을출력하라. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import java.io.*; import java.sql.*; public class JDBC_Ex3 { public static void main (String[] args) { Connection conn; Statement stmt = null; try { Class.forName( com.mysql.jdbc.driver ); // MySQL 드라이버로드 conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/ sampledb, root, ); // JDBC 연결 System.out.println( DB 연결완료 ); stmt = conn.createstatement(); // SQL 문처리용 Statement 객체생성 stmt.executeupdate( insert into student (name, id, dept) values( + new String( 아무개.getBytes(), ISO-8859-1 ) +, 0893012, + new String ( 컴퓨터공학.getBytes(), ISO-8859-1 ) + ); ); // 레코드추가 printtable(stmt); stmt.executeupdate( update student set id= 0189011 where name= + new String( 아무개.getBytes(), ISO-8859-1 ) + ); // 데이터수정 printtable(stmt); stmt.executeupdate( delete from student where name= + new String( 아무개.getBytes(), ISO-8859-1 ) + ); // 레코드삭제 printtable(stmt); } catch (ClassNotFoundException e) { System.out.println( JDBC 드라이버로드오류 ); } catch (SQLException e) { System.out.println( SQL 실행오류 ); } catch (UnsupportedEncodingException e) { System.out.println( 지원되지않는인코딩타입 ); } } // 레코드의각열의값화면에출력 private static void printtable(statement stmt) throws SQLException, UnsupportedEncodingException { ResultSet srs = stmt.executequery( select * from student ); while (srs.next()) { System.out.print(new String(srs.getString( name ).getbytes( ISO-8859-1 )));

제 17 장 JDBC 프로그래밍 849 17CHAPTER 33 34 35 36 37 } } } System.out.print( \t \t + srs.getstring( id )); System.out.println( \t \t + new String(srs.getString( dept ).getbytes ( ISO-8859-1 ))); 실행 결과 DB 연결완료 이기자 0494013 컴퓨터공학 아무개 0893012 컴퓨터공학 김철수 1091011 컴퓨터시스템 아무개 0189011 컴퓨터공학 이기자 0494013 컴퓨터공학 김철수 1091011 컴퓨터시스템 이기자 0494013 컴퓨터공학 김철수 1091011 컴퓨터시스템 다음과같은구조를갖는 cdinfo 라는테이블을생성하는 SQL 문을작성하라. 일차키는 cd_id 로한다. cd_id title publisher artist price CHECK TIME char(5) varchar(50) varchar(30) varchar(20) int 위에서생성된 cdinfo 테이블에다음과같은레코드를추가하는자바코드를작성하라. cd_id title publisher artist price a0001 홍길동 1 집오늘레코드홍길동 8000 cdinfo 테이블에서 price 가 10000 원인 CD 의타이틀을모두출력하는자바코드를작성하라.

850 JAVA 자바프로그래밍 JAVA PROGRAMMING 요약 데이터베이스는여러응용시스템들의통합된정보들을저장하여운영할수있는공용데이터들의집합이다. SUMMARY 데이터베이스를관리하는시스템을 DBMS라고한다. 현재사용되는대부분의데이터베이스는관계형데이터베이스이며 JDBC API도관계형데이터베이스에대한 API이다. SQL은관계형데이터베이스관리시스템에서데이터베이스스키마생성, 자료의검색 관리 수정, 데이터베이스객체접근관리등을위해고안된언어이다. JDBC는자바에서관계형데이터베이스에저장된데이터를접근및조작할수있게하는 API로서다양한 DBMS에대해일관된 API로데이터베이스연결, 검색, 수정, 관리등을할수있게한다. JDBC 드라이버는 DBMS 회사에서제공한다. JDBC 프로그래밍순서는 JDBC 드라이버로드, 데이터베이스연결, SQL 문장실행및실행결과사용, 연결해제의순으로구성된다. JDBC 프로그래밍에서데이터베이스연결, SQL 실행, 결과사용을위해각각 Connection 클래스, Statement 클래스, ResultSet 클래스를이용한다.

제 17 장 JDBC 프로그래밍 851 17CHAPTER Open Challenge 데이터베이스로사진저장및추출하기 문자열이나정수등과같은단순한데이터가아닌사진과같은바이너리데이터를저장해보자. 바이너리데이터를데이터베이스에저장하기위해서는 BLOB(Binary Large OBject) 라는데이터타입을사용한다. MySQL에서 16MB 이하의데이터를저장할수있는데이터타입은 mediumblob이다. 테이블구조는다음과같다. ID FILENAME FILE int(11) varchar(50) mediumblob mediumblob 타입은 16MB까지지원하나큰사진을저장하려면 MySQL의설정도변경하여야하므로여기서는편의상 1MB 이하의사진만저장하도록하자. 메뉴는사진저장과모든사진보기, 그리고프로그램종료가있으며버튼을만들어버튼을누를때마다다음사진이보이도록한다. 실행예시화면은아래와같다. 콘솔에 이런 메시지가 나타나고실행이 종료되면 MySQL 용 JDBC 드라이버가 설치되어 있지 않은것이므로 드라이버를 설치 후다시 실행한다.

852 JAVA 자바프로그래밍 JAVA PROGRAMMING 연습문제 EXERCISE 이론문제 1. JDBC에대한설명으로잘못된것은? 1 자바에서데이터베이스를사용할수있게하는 API 2 JDBC 드라이버는 JDBC 매니저를통해로드한다. 3 DBMS가바뀌어도이에따른 JDBC 드라이버만로드하면되므로프로그램수정이필요없다. 4 관계형및객체지향데이터베이스용 API를각각제공한다. 2. 데이터베이스의테이블, 행, 열에대해설명하라. 3. 관계형데이터베이스관리시스템에서데이터베이스스키마생성, 자료의검색 관리 수정, 데이터베이스객체접근관리등을위해고안된언어를무엇이라하는가? 4. Statement 클래스와 ResultSet 클래스에대해설명하라. 5. 다음표와같은구조의테이블이있다. id int name varchar(20) 데이터베이스에서 id 필드의값을읽으려고한다. 빈칸을채워라. ResultSet rs;... int id =rs. ; 실습문제 1. 윈도우 PC에서 MySQL의명령행도구를이용하여 bookdb라는데이터베이스를생성하라.

제 17 장 JDBC 프로그래밍 853 17CHAPTER 2. bookdb 데이터베이스에다음과같은테이블구조를갖는 book 테이블을생성하는 SQL 문을작성하고 MySQL 명령도구를이용하여실제테이블을생성하라. Primay key 는 id 로하라. id title publisher author int varchar(50) varchar(30) varchar(30) 3. 위에서생성한테이블에다음과같은레코드를추가하는 SQL 문을작성하고 MySQL 명령도구를이용하여실제레코드를추가하라. id title publisher author 0 엄마를부탁해 창비 신경숙 1 덕혜옹주 다산책방 권비영 2 1Q84 문학동네 무라카미하루키 4. MySQL 명령도구를이용하여 3 번에서추가한레코드를모두삭제하라. 5. 3 번의레코드를자바프로그램에서추가하도록프로그램을작성하라. 6. 책의 title이 1Q84 인레코드의레코드를찾아 title을 IQ84 로, author를 김아무개 로수정하는자바프로그램을작성하라. 7. 6 번에서수정한레코드를찾아서삭제하는자바프로그램을작성하라. 8. 다음과같은기능을수행하는프로그램을작성하라. 프로그램이시작되면데이터베이스의모든데이터를출력하고데이터베이스관리메뉴를출력하라. 관리메뉴는추가, 삭제, 수정, 끝내기가있다. 추가메뉴에서는사용자에게 id, 책제목, 출판사, 저자정보를입력받아데이터베이스에레코드를추가하라. 삭제메뉴에서는사용자에게 id 값을입력받아레코드를삭제하라. 수정메뉴에서는사용자에게수정할속성의이름을입력받고, 속성의현재값과새로운값을입력받아레코드를수정하라.