Data Provisioning Services for mobile clients

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

10.ppt

쉽게 풀어쓴 C 프로그래밊

단계

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

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Spring Boot/JDBC JdbcTemplate/CRUD 예제

PowerPoint 프레젠테이션

DBMS & SQL Server Installation Database Laboratory

Microsoft PowerPoint - 10Àå.ppt

MySQL-.. 1

J2EE Concepts

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

5장 SQL 언어 Part II

개발문서 Oracle - Clob

슬라이드 1

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

FileMaker 15 ODBC 및 JDBC 설명서

윈도우시스템프로그래밍

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

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

PowerPoint 프레젠테이션

ALTIBASE 사용자가이드 Templete

FileMaker ODBC 및 JDBC 가이드

<4D F736F F F696E74202D203130C0E52EBFA1B7AF20C3B3B8AE205BC8A3C8AF20B8F0B5E55D>

TITLE

교육2 ? 그림

ALTIBASE 사용자가이드 Templete

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

문서 템플릿

웹의 뼈대, HTML

구축환경 OS : Windows 7 그외 OS 의경우교재 p26-40 참조 Windows 의다른버전은조금다르게나타날수있음 Browser : Google Chrome 다른브라우저를사용해도별차이없으나추후수업의모든과정은크롬사용 한

강의 개요

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

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

JUNIT 실습및발표

JDBC 소개및설치 Database Laboratory

歯JavaExceptionHandling.PDF

.

17장

Microsoft PowerPoint - 18-DataSource.ppt

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

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

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

Microsoft Word - src.doc

윈도우시스템프로그래밍

Microsoft PowerPoint Python-DB

Chap7.PDF

PowerPoint Presentation

Apache2 + Tomcat 5 + JK2 를 사용한 로드밸런싱과 세션 복제 클러스터링 사이트 구축

슬라이드 1

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

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

JVM 메모리구조

PowerPoint Template

FileMaker ODBC and JDBC Guide

쉽게

SQL

chap 5: Trees

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

PowerPoint 프레젠테이션

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

Data Provisioning Services for mobile clients

11_oh.hwp

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

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

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

rmi_박준용_final.PDF

슬라이드 제목 없음

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

어댑터뷰

Chapter 1

PowerPoint Presentation

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

Discrete Mathematics

Interstage5 SOAP서비스 설정 가이드

슬라이드 1

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

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

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES Meta 연동가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax Co

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

Microsoft PowerPoint 세션.ppt

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

PowerPoint Presentation

중간고사

Lec. 2: MySQL and RMySQL

Data Provisioning Services for mobile clients

PowerPoint 프레젠테이션

NoSQL

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

DocsPin_Korean.pages

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

Microsoft PowerPoint - 27.pptx

PowerPoint Presentation

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

MySQL-Ch10

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

Transcription:

13 장. 데이터베이스와 JSP

MySQL 설치 1. MySQL 설치및구성 MySQL Community Server 5.1 다운로드 URL: http://dev.mysql.com/downloads/mysql/5.1.html MySQL 5.1 설치시작화면설치유형선택화면설치완료화면 2/52

1. MySQL 설치및구성 MySQL 설치 MySQL 서버설정 (1/2) 서버설정시작화면서버설정의첫화면윈도우즈서비스등록및 PATH 환경변수설정 - MySQL 서버는윈도우즈 OS 의기본서버프로그램중하나로등록 - PATH 환경변수에 MySQL 실행파일이모여있는폴더를등록하여윈도우즈의커맨드창내의어느폴더에서나 MySQL 관련명령어들을실행할수있도록함 3/52

1. MySQL 설치및구성 MySQL 설치 MySQL 서버설정 (2/2) 관리자비밀번호설정 MySQL 설치및설정완료 - 비밀번호를입력하는창에자신만이관리할값을입력하면되지만본책에서는 "jspbook" 이라는비밀번호를입력 4/52

MySQL 접속및테스트 cmd 창을열어서다음명령어로접속 1. MySQL 설치및구성 c:\...>mysql -u root -p 관리자패스워드 ( 본책에서는 jspbook ) 을입력 오른쪽화면이보이면접속성공 현재등록된데이터베이스목록출력하기위해접속상태에서다음명령어입력 show databases; 5/52

새로운데이터베이스 jspbookdb 생성 접속상태에서다음명령어실행 1. MySQL 설치및구성 CREATE DATABASE jspbookdb default character set utf8 collate utf8_general_ci; 데이터베이스목록다시보기 show databases; 6/52

MySQL GUI Tools 설치 1. MySQL 설치및구성 다운로드 URL: http://dev.mysql.com/downloads/gui-tools/5.0.html MySQL Query Browser 의사용 7/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 JDBC 의정의및필요성 JDBC(Java DataBase Connectivity) Java 를이용한데이터베이스접속과 SQL 문장의실행, 그리고그결과로얻어진데이터의핸들링을제공하는방법과절차에대한규약 개발자는 MySQL, Oracle, MS-SQL Server 데이터베이스등에독립적으로표준화된하나의 API 사용방법만숙지하면된다. 8/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 MySQL JDBC 의설치및설정 MySQL 데이터베이스처리용 JDBC 인 "MySQL Connector/J" 다운로드 다운로드 URL: http://dev.mysql.com/downloads/connector/j 압축을풀면나오는폴더안에 mysql-connector-java-5.1.7-bin.jar 파일을 Tomcat 의설치폴더바로밑의 lib 폴더에복사 9/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 JNDI (Java Naming and Directory Interface) JSP 및 Servlet 으로부터 MySQL 을접근하기위하여 MySQL 을자원 (Resource) 으로간주하여이자원을 Tomcat 에등록하여사용하는최신방법 현재의 server.xml 내용 <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="userdatabase" auth="container" type="org.apache.catalina.userdatabase" description="user database that can be updated and saved" factory="org.apache.catalina.users.memoryuserdatabasefactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> 10/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 JNDI (Java Naming and Directory Interface) 설정 server.xml 에 mysql 을자원으로등록 <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="userdatabase" auth="container" type="org.apache.catalina.userdatabase" description="user database that can be updated and saved" factory="org.apache.catalina.users.memoryuserdatabasefactory" pathname="conf/tomcat-users.xml" /> <Resource name="jdbc/mysql" auth="container" type="javax.sql.datasource" username="root" password="jspbook" driverclassname="com.mysql.jdbc.driver" url="jdbc:mysql://localhost:3306/jspbookdb?characterencoding=utf-8" validationquery="select 1" autoreconnect="true" maxactive="100" maxidle="30" maxwait="3000" /> </GlobalNamingResources> 11/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 커넥션풀 (Connection Pool) 데이터베이스와연결된커넥션을미리만들어놓고풀 (Pool) 에저장해두었다가필요시에커넥션풀에서커넥션을가져다이용하고이용이완료되면다시풀에반환하는기법 좀더빠른시간내에데이터베이스작업을끝낼수있다는장점이있음 JNDI 를통한 DB 접속방법에는기본적으로커넥션풀기법이내장 Connection Pool 설명 12/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 커넥션풀 (Connection Pool) 관련속성설명 maxactive 사용이되고있는최대커넥션의개수를의미 maxactive="100" 으로설정하면총 100 개의커넥션까지는동시데이터베이스접속을허용하겠다는의미 (maxactive="-1": 제한없음 ) maxidle 사용되지않는커넥션을커넥션풀에저장해둘수있는최대수 maxidle="30" 으로설정하면사용되지않는커넥션이풀에최대 30 개까지만존재함 일반적으로커넥션풀이초기화되면 maxidle 에지정된수이상은생성되지않는다. (minactive="-1": 제한없음 ) maxwait ( 단위 : ms) 동시접속자수가많아져서사용가능한커넥션이없을때 maxwait 에지정된시간만큼기다린다. 이시간이지나도사용가능한커넥션이발견되지않을시에는 Exception 이발생된다. maxwait="3000" 는사용가능한커넥션이커넥션풀에없을때사용가능한것이나타날때까지 3 초간기다린다는의미 (maxwait="-1": 제한없음 ) 13/52

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 설정내용을포함한 server.xml, context.xml, web.xml 예제 [ 예제 13.1] Tomcat 설치폴더 \conf\server.xml <?xml version='1.0' encoding='utf-8'?>......... <Server port="8005" shutdown="shutdown"> <!--APR library loader. Documentation at /docs/apr.html --> <Listener classname="org.apache.catalina.core.aprlifecyclelistener" SSLEngine="on" /> <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> <Listener classname="org.apache.catalina.core.jasperlistener" /> <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> <Listener classname="org.apache.catalina.mbeans.serverlifecyclelistener" /> <Listener classname="org.apache.catalina.mbeans.globalresourceslifecyclelistener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> 14/52

39 2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 15/52 설정내용을포함한 server.xml, context.xml, web.xml 예제 19 <GlobalNamingResources> 20 <!-- Editable user database that can also be used by 21 UserDatabaseRealm to authenticate users 22 --> 23 <Resource name="userdatabase" auth="container" 24 type="org.apache.catalina.userdatabase" 25 description="user database that can be updated and saved" 26 factory="org.apache.catalina.users.memoryuserdatabasefactory" 27 pathname="conf/tomcat-users.xml" /> 28 29 <Resource name="jdbc/mysql" auth="container" 30 type="javax.sql.datasource" username="root" password="jspbook" 31 driverclassname="com.mysql.jdbc.driver" 32 url="jdbc:mysql://localhost:3306/jspbookdb?characterencoding=utf-8" 33 34 validationquery="select 1" 35 maxactive="100" maxidle="30" maxwait="3000" /> 36 37 </GlobalNamingResources> 38...... [ 예제 13.1] Tomcat 설치폴더 \conf\server.xml

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 16/52 22 설정내용을포함한 server.xml, context.xml, web.xml 예제 <?xml version='1.0' encoding='utf-8'?>......... <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- [ 예제 13.2] Tomcat 설치폴더 \conf\context.xml <Valve classname="org.apache.catalina.valves.cometconnectionmanagervalve" /> --> <ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.datasource" /> </Context> name 과 global 속성의값은 server.xml 의 <Resource> 태그의 name 속성값과동일하고 type 속성값도 <Resource> 태그의 type 속성값과동일하다.

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 설정내용을포함한 server.xml, context.xml, web.xml 예제 [ 예제 12.3] jspbook\web-inf\web.xml <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">......... <resource-ref> <description>mysql POOL</description> <res-ref-name>jdbc/mysql</res-ref-name> <res-type>javax.sql.datasource</res-type> <res-auth>container</res-auth> </resource-ref> </web-app> <res-ref-name> 태그의값으로적힌 "jdbc/mysql 은반드시 server.xml 및 context.xml 내의 <Resource> 태그및 <ResourceLink> 태그의 name 속성값과동일. 한편 <res-type> 태그의값도 server.xml 및 contex..xml 에서 type 속성에설정한값과동일. 17/52

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 18/52 MySQL 접속유틸리티인 ConnectionContext 작성하기 package thinkonweb.util; import java.sql.*; import javax.naming.*; import javax.sql.datasource; public class ConnectionContext { } private static String jndiname = "jdbc/mysql"; private static Connection conn = null; public static Connection getconnection() { } if (conn!= null) try { return conn; [ 예제 12.4] jspbook\web-inf\java_sources\connectioncontext.java Context initcontext = (Context)new InitialContext().lookup("java:comp/env/"); DataSource ds = (DataSource)initContext.lookup( jndiname); conn = ds.getconnection(); } catch(exception e) { } e.printstacktrace(); return conn; getconnection() 메소드 Tomcat 컨테이너설정정보 (server.xml) 및 jspbook 웹어플리케이션의설정정보 (web.xml) 의 MySQL 설정내용을참조하여 java.sql.connection 객체를새롭게생성하고메소드를호출한측으로그객체를리턴한다. 만약이미생성된 java.sql.connection 객체가있다면새롭게생성하지않고이미생성되어있는것을바로리턴한다.

2. JNDI 를활용한 DB 커넥션풀 (Connection Pool) 설정 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 JSP 에서 MySQL 접속테스트하기 <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %> <html> <body> <% String msg = null; String sql = "SELECT 'hello jspbookdb!' AS msg"; Connection conn = ConnectionContext.getConnection(); PreparedStatement pstmt = conn.preparestatement(sql); ResultSet rs = pstmt.executequery(); if (rs.next()) msg = rs.getstring("msg"); rs.close(); pstmt.close(); %> 쿼리문 : <%=sql%><br/> 쿼리결과 : <%=msg%><br/> </body> </html> [ 예제 13.5] jspbook\ch13\hellodb.jsp 19/52

데이터베이스란? 데이터베이스 (Database) 검색과변경이쉽도록조직화되어있는자료의집합 3. 데이터베이스와 SQL 관계형데이터베이스 (Relational Database) 일련의정형화된테이블로구성된데이터항목들의집합체로서그데이터들은다양한방법으로접근하거나조합될수있다. 관계형데이터베이스관리시스템 (Relational Database Management System, RDBMS) 관계형데이터베이스에자료를체계적으로정리하여모아두기위해서는데이터베이스를관리하여주는시스템 데이터를저장하고이데이터로부터유용한정보를얻어내기위한효율적이면서도편리한방법을사용자에게제공 예 상용 RDBMS: 오라클 (Oracle), 마이크로소프트사에서개발한 MS-SQL Server 무료 RDBMS: MySQL 20/52

3. 데이터베이스와 SQL RDBMS 에서사용되는주요용어 21/52 테이블 여러개의레코드를담고있는논리적인구조로서행과열로구성된데이터의모임 필드 ( 컬럼 ) 테이블의열에해당되는것으로데이터의자료형태, 데이터의길이등과같은특성을나타낸다. 위예에서 학번, 이름, 나이, 학과 는필드 ( 컬럼 ) 명이되고필드명에속하는자료가필드값이된다. 레코드 컬럼들의집합으로테이블의각행을레코드라고한다. 위예에서 200010001 김송이 20 컴퓨터학과 가하나의레코드가된다. 하나의테이블에동일한레코드가중복되어서는안된다. 기본키 (Primary Key) 단일레코드의식별자역할을하는필드를지칭한다. 그러므로두개이상의레코드가동일한기본키값을가질수없다. 위예에서 학번 필드가기본키역할을하며 김송이 이름을지닌레코드는제13장기본키값으로서 200910001을지닌다.

SQL 소개및문법 SQL(Structured Query Language) 3. 데이터베이스와 SQL 사용자가데이터베이스관리시스템에게어떤일을하라고지시하기위한언어 데이터베이스에저장된자료를조직, 관리, 검색하기위한언어 SQL 의주요기능 데이터정의기능 : 데이터베이스와테이블의생성, 소멸, 변경등을할수있게한다. 데이터검색기능 : 데이터베이스에저장된자료를검색하여보여줄수있게한다. 데이터조작기능 : 테이블에자료를삽입하거나수정, 삭제할수있게한다. SQL 작성시주의사항 SQL 문은대소문자구별을하지않는다 세미콜론 (;) 을명령문맨마지막에반드시붙인다. 22/52

SQL 의명령문과문법 데이터정의기능 SQL 데이터베이스및테이블생성 문법 JSP 내에서직접수행하는일은그리많지않다. 3. 데이터베이스와 SQL 대신에콘솔창이나 MySQL Query Browser" 내에서해당명령어를대부분수행한다. CREATE DATABASE database_name; 예 : CREATE DATABASE jspbookdb; 설명 : jspbookdb 라는이름의데이터베이스를만든다. CREATE TABLE table_name(column_name1 datat_type1,... ); 예 : CREATE TABLE Student(ID char(10) PRIMARY KEY, Name Char(10), Age int); 설명 : Student라는이름의테이블을만들고테이블을구성하는컬럼은학번 (ID), 이름, 나이가된다. 한편, 학번은주요키로서지정한다. 23/52

SQL 의명령문과문법 데이터정의기능 SQL 3. 데이터베이스와 SQL 이미 jspbookdb 가생성되어있다면다음명령어를통해사용할데이터베이스를변경 use jspbookdb; jspbookdb 가생성되어있지않다면다음명령어를통해생성 CREATE DATABASE jspbookdb; 24/52

SQL 의명령문과문법 데이터정의기능 SQL 다음명령문를통해 "Student" 테이블을생성 3. 데이터베이스와 SQL CREATE TABLE Student(ID char(10) PRIMARY KEY, Name char(10), Age int, Major char(30)); 25/52

SQL 의명령문과문법 데이터정의기능 SQL 이미만든데이터베이스및테이블을삭제하는명령문 문법 3. 데이터베이스와 SQL DROP DATABASE database_name; 예 : DROP DATABASE jspbookdb; 설명 : jspbookdb라는이름의데이터베이스를삭제한다. 관련된테이블등의자료가모두삭제된다. DROP TABLE table_name; 예 : DROP TABLE Student; 설명 : Student라는이름의테이블을삭제한다. 테이블에담긴자료가함께삭제된다. 26/52

SQL 의명령문과문법 데이터정의기능 SQL 3. 데이터베이스와 SQL 이미테이블을변경하는명령문 테이블에새로운컬럼을추가하거나삭제하는기능등을수행 문법 ALTER TABLE table_name ADD column_name datatype; 예 : ALTER TABLE Student ADD Grade char(2); 설명 : Student라는이름의테이블에두개의문자로구성된 char(2) 타입의 Grade 컬럼을추가한다. ALTER TABLE table_name DROP column_name; 예 : ALTER TABLE Student DROP Grade; 설명 : Student라는이름의테이블에존재하는 Grade 컬럼을삭제한다. 27/52

3. 데이터베이스와 SQL SQL 의명령문과문법 데이터검색기능 SQL SELECT column_list FROM table_name [WHERE condition...]; 예1: SELECT * FROM Student; 설명 : Student 테이블에저장되어있는모든자료를가져온다. 예 2: SELECT ID, Name FROM Student; 설명 : Student 테이블에서학번 (ID) 와이름컬럼에있는모든자료를가져온다. 예 3: SELECT ID FROM Student WHERE Age>=21 AND Age<= 23; 설명 : Student 테이블에서나이가 21 세에서 23 세사이에속하는학생들의학번만가져온다. 예 4: SELECT ID, Name FROM Student ORDER BY ID Asc; 설명 : Student 테이블에서학번과이름자료를가져오는데학번에의한오름차순으로정렬하여가져온다. Asc: 오름차순, Desc: 내림차순 28/52

3. 데이터베이스와 SQL SQL 의명령문과문법 데이터조작기능 SQL 테이블에새로운자료를삽입 INSERT INTO table_name [(column_list)] VALUES (column_values[,... ]); 예 : INSERT INTO Student (ID, Name, Age, Major) VALUES ('200910001', ' 김송이 ', 20, 'computer science'); 설명 : Student 테이블에학번 (ID) 은 200010001 이고이름이 김송이 이며나이가 20 살이고학과는컴퓨터학과인학생에대한정보를삽입한다. 테이블에있는레코드삭제 DELETE table_name [WHERE condition...]; 예1: DELETE Student; 설명 : Student 테이블에저장되어있는모든내용을삭제한다. 테이블의내용만삭제할뿐테이블자체까지삭제되지는않는다. 예 2: DELETE Student WHERE Name=' 김송이 '; 29/52 설명 : Student 테이블에서 ' 김송이 ' 라는이름을가진레코드를삭제한다.

SQL 의명령문과문법 데이터조작기능 SQL 3. 데이터베이스와 SQL 테이블에이미입력되어있는값을갱신 UPDATE table_name SET column_name=value [WHERE condition...]; 예 : UPDATE Student SET Age=25 WHERE ID='200910003'; 설명 : Student 테이블에서학번이 '200910003' 인학생의나이를 25살로갱신한다. 30/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 JSP 와 Servlet 에서데이터베이스접근프로그래밍순서 1) Connection 객체를생성한다. 2) Statement 객체를생성한다. 3) SQL 질의를수행한다. 4) 데이터를얻어오는것과관련된경우데이터를 ResultSet 으로부터가져온다. 만약 SQL 문이데이터추출과무관한경우는 ResultSet 에서의데이터추출은생략된다. 5) 생성되어있는 ResultSet 객체및 Statement 객체를닫는다. 31/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 Connection 객체얻어오기 13.2.5 절에서소개한 thinkonweb.util.connectioncontext 를활용하여커넥션풀에서 java.sql.connection 객체를받아오는방법을사용 <%@ page contenttype="text/html; charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %>... <% Connection conn = ConnectionContext.getConnection();... %> 32/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 Statement 객체생성및 SQL 질의수행 java.sql.statement 객체 SQL 구문을입력받아질의를수행하고결과값을가져올수있는작업을지원 Connection 객체의 createstatement() 메소드를이용해서얻는다. Statement 객체를얻으면이객체를활용하여직접 SQL 문을수행시킬수있다. <%@ page contenttype="text/html; charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %>... <% Connection conn = ConnectionContext.getConnection(); Statement stmt = conn.createstatement(); int rowcount = stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910001', ' 김송이 ', 20, 'computer science');"); ResultSet rs = stmt.executequery("select * FROM Student");... %> 33/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 Statement 객체생성및 SQL 질의수행 java.sql.statement 객체 이객체에게호출할수있는메소드종류 메소드 리턴타입 설명 SELECT 로시작되는 SQL 구문처럼데이 executequery(string sql) java.sql.resultset 터를추출하기위한 SQL 구문을실행시 키다. 수행결과로서추출데이터를간직 하고있는 ResultSet 을리턴한다. INSERT, UPDATE, DELETE 로 시작되는 executeupdate(string sql) int SQL 구문처럼데이터추출이없는 SQL 구문을실행시킨다. 수행결과로서 SQL 구문에의하여영향을받은레코드행개수를 int형으로리턴한다. 34/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 에서의데이터추출 java.sql. ResultSet 객체 ResultSet 객체에데이터를가져온후이객체로부터실제데이터를추출해내는작업수행 ResultSet 객체구조및커서이동 한번의 next() 메소드호출은레코드행을한행씩이동하게해준다. 35/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 에서의데이터추출 java.sql. ResultSet 객체 next() 메소드의반환값은 Boolean 형 java.sql. ResultSet 객체에호출할수있는메소드 getstring(string columnname) getint(string columnname) getdate(string columnname) getlong(string columnname) getdate(string columnname) 36/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 에서의데이터추출 java.sql. ResultSet 객체사용법 37/52 <%@ page contenttype="text/html; charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %>... <% Connection conn = ConnectionContext.getConnection(); Statement stmt = conn.createstatement(); int rowcount = stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910001', ' 김송이 ', 20, 'computer science');"); ResultSet rs = stmt.executequery("select * FROM Student"); String id, name, major; int age; while(rs.next()){ id = rs.getstring("id"); name = rs.getstring("name"); age = rs.getint("age"); major = rs.getstring("major"); out.println(id + ": " + name + ", " + age + ", " + major + "</br>"); }... %>

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 객체및 Statement 객체닫기 데이터베이스작업이끝나면자원을회수하고가용자원을늘리기위해서 ResultSet 객체및 Statement 객체를닫아주어야한다. 38/52 <%@ page contenttype="text/html; charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %>... <% while(rs.next()){ id = rs.getstring("id"); name = rs.getstring("name"); age = rs.getint("age"); major = rs.getstring("major"); out.println(id + ": " + name + ", " + age + ", " + major + "</br>"); } rs.close(); stmt.close(); %>

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 01 02 03 04 05 06 07 08 09 10-11 12 13 14-15 - 데이터베이스활용예제 [ 예제 13.6] jspbook\ch13\student-1.jsp <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %> <html> <head><title>jdbc 예제-1</title></head> <body> <% Connection conn = ConnectionContext.getConnection(); Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery("select count(*) AS recordcount FROM Student WHERE ID=200910 001"); // ID가 200910001인레코드존재확인 while(rs.next()){ int recordcount = rs.getint("recordcount"); if (recordcount!= 1) { // ID가 200910001인레코드가존재하지않으면 true stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910001', ' 김송이 ', 20, 'computer science');"); //executeupdate 질의의리턴값은일반적으로사용하지않음 stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910002', ' 김하늘 ', 20, 'computer science');"); 39/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 데이터베이스활용예제 [ 예제 13.6] jspbook\ch13\student-1.jsp 16 stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910003', - 17 18 19 ' 오청하 ', 21, 'computer science');"); } } 20 rs = stmt.executequery("select * FROM Student"); // SELECT 쿼리문수행 21 22 23 24 25 26 27 String id, name, major; int age; while(rs.next()){ id = rs.getstring("id"); name = rs.getstring("name"); age = rs.getint("age"); major = rs.getstring("major"); 28 out.println(id + ": " + name + ", " + age + ", " + major + "</br>"); 29 30 31 32 33 } out.println("</br>"); %> </body> </html> 40/52 제13장

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기 메타데이터 (metadata) 일반적으로 " 데이터에관한데이터 " 라고정의되며 SQL 질의수행이후에얻어온정보자원의속성을기술하는데이터 실제얻고자하는학생이름, 나이등의데이터는아니지만이데이터와직접적으로혹은간접적으로연관된정보를제공하는데이터 메타데이터사용이유 데이터를소유하고있는측면에서는관리의용이성을, 데이터를사용하고있는측면에서는검색의용이성 41/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기 메타데이터 (metadata) <% ResultSet 객체로부터 getmetadata() 라는메소드를통해서 ResultSetMetaData 객체를얻어올수있다.... ResultSetMetaData md = rs.getmetadata(); int numcolumns = md.getcolumncount(); for (int i=1; i<=numcolumns; i++) { }... %> out.println("column Number = " + i); out.println("column Label = " + md.getcolumnlabel(i)); out.println("column Name = " + md.getcolumnname(i)); out.println("column Type = " + md.getcolumntypename(i)); 42/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기 ResultSetMetaData 객체에호출할수있는메소드 메소드리턴타입설명 getcolumncount() getcolumnlabel(int column) getcolumnname(int column) getcolumntypename(int column) int String String String ResultSet 객체에있는데이터레코드에대한컬럼 ( 필드 ) 개수를리턴한다. 인자로주어진 column 인덱스에대한필드레이블을리턴한다. 주의할점은첫번째 column 인덱스는 1부터시작한다. 인자로주어진 column 인덱스에대한필드이름을리턴한다. 주의할점은첫번째 column 인덱스는 1부터시작한다. 인자로주어진 column 인덱스에대한필드형이름을리턴한다. 주의할점은첫번째 column 인덱스는 1부터시작한다. 43/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기 getcolumnlabel(int column) 과 getcolumnname(int column) 의차이 SELECT count(*) AS recordcount FROM Student 위예와같이 AS 절을사용하면 getcolumnlabel(int column) 이돌려주는값은 AS 절이후에지정한단어가리턴된다. AS 절을사용하지않으면 getcolumnlabel(int column) 과 getcolumnname(int column) 가리턴하는값에차이가없다. 주로 ResultSetMetaData 객체와함께사용하면서 ResultSet 객체에호출할수있는메소드 getstring(int columnindex) getint(int columnindex) getdate(int columnindex) getlong(int columnindex) getdate(int columnindex) 44/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기 ResultSetMetaData 객체와함께사용하면서 ResultSet 객체를활용하는방법 45/52 <%... ResultSetMetaData md = rs.getmetadata(); int numcolumns = md.getcolumncount(); while (rs.next()) { String rowbuffer = ""; for (int i=1; i<=numcolumns; i++) { if (i == 3) rowbuffer += rowbuffer + " " + rs.getint(i); else rowbuffer += rowbuffer + " " + rs.getstring(i); } out.println(rowbuffer); }... %>

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 01 02 03 04 05 06 07 08 09 10-11 12 13 14 15 16 17 18 19 20 21 22 ResultSet 메타데이터활용하기예제 [ 예제 13.7] jspbook\ch13\student-2.jsp <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %> <html> <head><title>jdbc 예제 </title></head> <body> <% Connection conn = ConnectionContext.getConnection(); Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery("select count(*) AS recordcount FROM Student WHERE ID=200910001"); // ID가 200910004인레코드존재확인 while(rs.next()){ int recordcount = rs.getint("recordcount"); if (recordcount!= 1) { // ID가 200910004인레코드존재하지않으면 true, executeupdate 질의의리턴값은필요없음 stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910001', ' 김송이 ', 20, 'computer science');"); stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910002', ' 김하늘 ', 20, 'computer science');"); stmt.executeupdate("insert INTO Student (ID, Name, Age, Major) VALUES ('200910003', ' 오청하 ', 21, 'computer science');"); } } rs = stmt.executequery("select ID AS S_ID, Name AS S_Name, Age AS S_Age, Major AS S_Major FROM Student"); // SELECT 쿼리수행 ResultSetMetaData md = rs.getmetadata(); // 결과데이터에대한메타데이터생성 int numcolumns = md.getcolumncount(); 46/52 제13장

46 47/52 47 4. JSP 및 Servlet 에서 SQL 처리프로그래밍 ResultSet 메타데이터활용하기예제 23 for (int i=1; i<=numcolumns; i++) { 24 out.println("column Number = " + i + "</br>"); 25 out.println("column Label = " + md.getcolumnlabel(i) + "</br>"); // 컬럼의메타정보출력 26 out.println("column Name = " + md.getcolumnname(i) + "</br>"); 27 out.println("column Type = " + md.getcolumntypename(i) + "</br></br>"); 28 } 29 rs = stmt.executequery("select * FROM Student WHERE age=20"); 30 md = rs.getmetadata(); // age가 20인레코드들을얻어온다. 31 numcolumns = md.getcolumncount(); 32 while (rs.next()) { 33 String rowbuffer = ""; 34 for (int i=1; i<=numcolumns; i++) { 35 if (i == 3) 36 rowbuffer += rs.getint(i) + " "; 37 else 38 rowbuffer += rs.getstring(i) + " "; 39 } 40 out.println(rowbuffer + "</br>"); 41 } 42 43 rs.close(); 44 stmt.close(); 45 %> </body> </html> [ 예제 13.7] jspbook\ch13\student-2.jsp

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 PreparedStatement 활용하기 java.sql.preparedstatement 클래스 java.sql.statement 클래스를확장한것으로서 SQL 문을미리컴파일하여기존의 java.sql.statement 객체보다더욱효율적으로 SQL 질의문을처리하도록지원 PreparedStatement 객체 Connection 객체의 preparestatement() 메소드를통해서얻을수있다. <%... Connection conn = ConnectionContext.getConnection(); PreparedStatement pstmt = conn.preparestatement("select * FROM Student WHERE Age=? AND Major=?");... %> 추가적으로입력파라미터의위치를지정할수있도록 preparestatement() 메소드에넣어주는 SQL 문에물음표 (?) 를사용할수다. 48/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 PreparedStatement 활용하기 PreparedStatement 객체 PreparedStatement 객체에게 setstring(), setint(), setdate() 등의메소드를다음과같이호출하여물음표 (?) 가있는위치에실제파라미터값을넣어줄수있다. 파라미터값을모두셋팅하면바로 pstmt 객체에게 executequery() 메소드를호출하여 ResultSet 객체를얻어올수있다. <%... Connection conn = ConnectionContext.getConnection(); PreparedStatement pstmt = conn.preparestatement("select * FROM Student WHERE Age=? AND Major=?"); pstmt.setint(1, 20); pstmt.setstring(2, "computer science"); ResultSet rs = pstmt.executequery();... %> rs.close(); pstmt.close(); 49/52

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 PreparedStatement 활용하기 PreparedStatement 객체 INSERT 구문을처리하는 PreparedStatement 객체활용법 <%... Connection conn = ConnectionContext.getConnection(); PreparedStatement pstmt = conn.preparestatement("insert INTO Student (ID, Name, Age, Major) VALUES (?,?,?,?);"); pstmt.setstring(1, "200910004"); pstmt.setstring(2, " 김철수 "); pstmt.setint(3, 23); pstmt.setstring(4, "Electronic Engineering"); pstmt.executeupdate(); pstmt.close(); %> 50/52

22 51/52 23 4. JSP 및 Servlet 에서 SQL 처리프로그래밍 PreparedStatement 활용하기예제 01 02 03 04 05 06 07 08 09 10 11-12 13 14 <%@ page contenttype="text/html;charset=utf-8" %> <%@ page import="thinkonweb.util.connectioncontext" %> <%@ page import="java.sql.*" %> <html> <head><title>jdbc 예제 </title></head> <body> <h3>preparedstatement 활용하기 </h3> <% Connection conn = ConnectionContext.getConnection(); Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery("select count(*) AS recordcount FROM Student WHERE ID=200910004"); 200910001인레코드존재확인 while(rs.next()){ int recordcount = rs.getint("recordcount"); if (recordcount!= 1) { // ID가 200910001인레코드가존재하지않으면 true // ID가 15 PreparedStatement pstmt = conn.preparestatement("insert INTO Student (ID, Name, Age, Major) - 16 VALUES (?,?,?,?);"); // INSERT 질의지닌 PreparedStatement 객체생성 pstmt.setstring(1, "200910004"); 17 pstmt.setstring(2, " 김철수 "); 18 pstmt.setint(3, 23); // PreparedStatement 객체의질의내용채움 19 20 21 pstmt.setstring(4, "Electronic Engineering"); pstmt.executeupdate(); // PreparedStatement 객체의질의수행 pstmt.close(); } } [ 예제 13.8] jspbook\ch13\student-3.jsp

4. JSP 및 Servlet 에서 SQL 처리프로그래밍 24 25-26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 PreparedStatement 활용하기예제 [ 예제 13.8] jspbook\ch13\student-3.jsp PreparedStatement pstmt = conn.preparestatement("select * FROM Student WHERE Age=? AND Major=?"); // SELECT 질의를지닌 PreparedStatement 객체생성 pstmt.setint(1, 23); // PreparedStatement 객체의질의내용채움 pstmt.setstring(2, "Electronic Engineering"); rs = pstmt.executequery(); // PreparedStatement 객체의질의수행 String id, name, major; int age; while(rs.next()){ id = rs.getstring("id"); name = rs.getstring("name"); age = rs.getint("age"); major = rs.getstring("major"); out.println(id + ": " + name + ", " + age + ", " + major + "</br>"); } rs.close(); pstmt.close(); stmt.close(); %> </body> </html> 52/52