2025. 4. 6. 17:22ㆍHigh Level Programming Language/JDBC Database Access
테이블 설정
이 페이지에서는 JDBC 튜토리얼에서 사용되는 모든 테이블과 그 생성 방법에 대해 설명합니다:
- COFFEES 테이블
- SUPPLIERS 테이블
- COF_INVENTORY 테이블
- MERCH_INVENTORY 테이블
- COFFEE_HOUSES 테이블
- DATA_REPOSITORY 테이블
- 테이블 생성
- 테이블 데이터 삽입
COFFEES 테이블
COFFEES
테이블은 The Coffee Break에서 판매되는 커피에 대한 정보를 저장합니다:
COF_NAME | SUP_ID | PRICE | SALES | TOTAL |
---|---|---|---|---|
Colombian | 101 | 7.99 | 0 | 0 |
French_Roast | 49 | 8.99 | 0 | 0 |
Espresso | 150 | 9.99 | 0 | 0 |
Colombian_Decaf | 101 | 8.99 | 0 | 0 |
French_Roast_Decaf | 49 | 9.99 | 0 | 0 |
각 컬럼에 대한 설명은 다음과 같습니다:
COF_NAME
: 커피 이름을 저장합니다. 최대 32자의VARCHAR
타입이며, 각 커피의 이름이 고유하므로 기본 키로 사용됩니다.SUP_ID
: 커피 공급업체를 식별하는 숫자를 저장합니다.INTEGER
타입이며,SUPPLIERS
테이블의SUP_ID
를 참조하는 외래 키로 정의되어 있습니다.PRICE
: 파운드당 커피 가격을 저장합니다. 소수점을 포함한 값을 저장하기 위해FLOAT
타입을 사용합니다.SALES
: 금주에 판매된 커피의 파운드 수를 저장합니다.INTEGER
타입입니다.TOTAL
: 지금까지 판매된 커피의 총 파운드 수를 저장합니다.INTEGER
타입입니다.
SUPPLIERS 테이블
SUPPLIERS
테이블은 각 공급업체에 대한 정보를 저장합니다:
SUP_ID | SUP_NAME | STREET | CITY | STATE | ZIP |
---|---|---|---|---|---|
101 | Acme, Inc. | 99 Market Street | Groundsville | CA | 95199 |
49 | Superior Coffee | 1 Party Place | Mendocino | CA | 95460 |
150 | The High Ground | 100 Coffee Lane | Meadows | CA | 93966 |
각 컬럼에 대한 설명은 다음과 같습니다:
SUP_ID
: 커피 공급업체를 식별하는 숫자를 저장합니다.INTEGER
타입이며, 이 테이블의 기본 키입니다.SUP_NAME
: 커피 공급업체의 이름을 저장합니다.STREET
,CITY
,STATE
,ZIP
: 공급업체의 주소를 저장합니다.
COF_INVENTORY 테이블
COF_INVENTORY
테이블은 각 창고에 저장된 커피의 양에 대한 정보를 저장합니다:
WAREHOUSE_ID | COF_NAME | SUP_ID | QUAN | DATE_VAL |
---|---|---|---|---|
1234 | House_Blend | 49 | 0 | 2006-04-01 |
1234 | House_Blend_Decaf | 49 | 0 | 2006-04-01 |
1234 | Colombian | 101 | 0 | 2006-04-01 |
1234 | French_Roast | 49 | 0 | 2006-04-01 |
1234 | Espresso | 150 | 0 | 2006-04-01 |
1234 | Colombian_Decaf | 101 | 0 | 2006-04-01 |
각 열에 대한 설명은 다음과 같습니다:
WAREHOUSE_ID
: 창고를 식별하는 숫자를 저장합니다.COF_NAME
: 특정 종류의 커피 이름을 저장합니다.SUP_ID
: 공급업체를 식별하는 숫자를 저장합니다.QUAN
: 사용 가능한 상품의 수량을 저장합니다.DATE_VAL
: 해당 행이 마지막으로 업데이트된 시간을 나타내는 타임스탬프 값을 저장합니다.
MERCH_INVENTORY 테이블
MERCH_INVENTORY
테이블은 비(非)커피 상품의 재고 정보를 저장합니다:
ITEM_ID | ITEM_NAME | SUP_ID | QUAN | DATE |
---|---|---|---|---|
00001234 | Cup_Large | 00456 | 28 | 2006-04-01 |
00001235 | Cup_Small | 00456 | 36 | 2006-04-01 |
00001236 | Saucer | 00456 | 64 | 2006-04-01 |
00001287 | Carafe | 00456 | 12 | 2006-04-01 |
00006931 | Carafe | 00927 | 3 | 2006-04-01 |
00006935 | PotHolder | 00927 | 88 | 2006-04-01 |
00006977 | Napkin | 00927 | 108 | 2006-04-01 |
00006979 | Towel | 00927 | 24 | 2006-04-01 |
00004488 | CofMaker | 08732 | 5 | 2006-04-01 |
00004490 | CofGrinder | 08732 | 9 | 2006-04-01 |
00004495 | EspMaker | 08732 | 4 | 2006-04-01 |
00006914 | Cookbook | 00927 | 12 | 2006-04-01 |
각 컬럼에 대한 설명은 다음과 같습니다:
ITEM_ID
: 아이템을 식별하는 숫자를 저장합니다.ITEM_NAME
: 아이템의 이름을 저장합니다.SUP_ID
: 공급업체를 식별하는 숫자를 저장합니다.QUAN
: 해당 아이템의 사용 가능한 수량을 저장합니다.DATE
: 해당 행이 마지막으로 업데이트된 시간을 나타내는 타임스탬프 값을 저장합니다.
COFFEE_HOUSES 테이블
COFFEE_HOUSES
테이블은 커피 매장의 위치에 대한 정보를 저장합니다:
STORE_ID | CITY | COFFEE | MERCH | TOTAL |
---|---|---|---|---|
10023 | Mendocino | 3450 | 2005 | 5455 |
33002 | Seattle | 4699 | 3109 | 7808 |
10040 | SF | 5386 | 2841 | 8227 |
32001 | Portland | 3147 | 3579 | 6726 |
10042 | SF | 2863 | 1874 | 4710 |
10024 | Sacramento | 1987 | 2341 | 4328 |
10039 | Carmel | 2691 | 1121 | 3812 |
10041 | LA | 1533 | 1007 | 2540 |
33005 | Olympia | 2733 | 1550 | 4283 |
33010 | Seattle | 3210 | 2177 | 5387 |
10035 | SF | 1922 | 1056 | 2978 |
10037 | LA | 2143 | 1876 | 4019 |
10034 | San_Jose | 1234 | 1032 | 2266 |
32004 | Eugene | 1356 | 1112 | 2468 |
각 컬럼의 설명은 다음과 같습니다:
- STORE_ID: 커피 매장을 식별하는 숫자입니다. 이 값은 매장이 위치한 주를 나타내는 역할도 하며, 예를 들어 10으로 시작하면 캘리포니아, 32로 시작하면 오리건, 33은 워싱턴 주를 의미합니다.
- CITY: 커피 매장이 위치한 도시의 이름입니다.
- COFFEE: 판매된 커피 양을 나타냅니다.
- MERCH: 판매된 비커피 상품의 양입니다.
- TOTAL: 커피와 상품 판매량의 합입니다.
DATA_REPOSITORY 테이블
DATA_REPOSITORY
테이블은 The Coffee Break에서 사용하는 문서나 데이터의 URL을 저장합니다.
이 튜토리얼에서 사용하는 populate_tables.sql 스크립트는 이 테이블에 데이터를 추가하지 않습니다.
각 열 설명:
- DOCUMENT_NAME: URL을 식별하는 문자열입니다.
- URL: 문서를 참조하는 웹 주소입니다.
테이블 생성
Apache Ant나 JDBC API를 사용하여 테이블을 생성할 수 있습니다.
Apache Ant로 테이블 생성하기
튜토리얼 샘플 코드에서 사용되는 테이블을 생성하려면 <JDBC 튜토리얼 디렉토리>
에서 다음 명령어를 실행합니다:
ant setup
이 명령은 build.xml 파일에 정의된 여러 Ant 타겟 중 build-tables
를 실행합니다:
<target name="build-tables"
description="Create database tables">
<sql
driver="${DB.DRIVER}"
url="${DB.URL}"
userid="${DB.USER}"
password="${DB.PASSWORD}"
classpathref="CLASSPATH"
delimiter="${DB.DELIMITER}"
autocommit="false" onerror="abort">
<transaction src="./sql/${DB.VENDOR}/create-tables.sql"/>
</sql>
</target>
각 파라미터 설명:
파라미터 | 설명 |
---|---|
driver |
JDBC 드라이버의 전체 클래스 이름입니다. Java DB의 경우 org.apache.derby.jdbc.EmbeddedDriver , MySQL은 com.mysql.cj.jdbc.Driver 입니다. |
url |
DB 연결을 위한 JDBC URL입니다. |
userid |
DB 사용자 계정입니다. |
password |
사용자 비밀번호입니다. |
classpathref |
드라이버 클래스가 포함된 JAR의 전체 경로입니다. |
delimiter |
SQL 문을 구분하는 구분자입니다. 보통 ; 를 사용합니다. |
autocommit |
false로 설정하면 모든 SQL 문이 하나의 트랜잭션으로 실행됩니다. |
onerror |
SQL 실행 실패 시 동작 (continue , stop , abort ) |
SQL 파일 예시 (create-tables.sql
일부):
create table SUPPLIERS (
SUP_ID integer NOT NULL,
SUP_NAME varchar(40) NOT NULL,
STREET varchar(40) NOT NULL,
CITY varchar(20) NOT NULL,
STATE char(2) NOT NULL,
ZIP char(5),
PRIMARY KEY (SUP_ID)
);
create table COFFEES (
COF_NAME varchar(32) NOT NULL,
SUP_ID int NOT NULL,
PRICE numeric(10,2) NOT NULL,
SALES integer NOT NULL,
TOTAL integer NOT NULL,
PRIMARY KEY (COF_NAME),
FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID)
);
참고: build.xml
에는 drop-tables
타겟도 포함되어 있어 기존 테이블을 삭제한 후 다시 생성할 수 있습니다.
JDBC API로 테이블 생성하기
예시: SUPPLIERS
테이블 생성 메서드
public void createTable() throws SQLException {
String createString =
"create table SUPPLIERS (SUP_ID integer NOT NULL, " +
"SUP_NAME varchar(40) NOT NULL, STREET varchar(40) NOT NULL, " +
"CITY varchar(20) NOT NULL, STATE char(2) NOT NULL, ZIP char(5), " +
"PRIMARY KEY (SUP_ID))";
try (Statement stmt = con.createStatement()) {
stmt.executeUpdate(createString);
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
COFFEES
테이블도 유사한 방식으로 생성합니다:
public void createTable() throws SQLException {
String createString =
"create table COFFEES (COF_NAME varchar(32) NOT NULL, " +
"SUP_ID int NOT NULL, PRICE numeric(10,2) NOT NULL, " +
"SALES integer NOT NULL, TOTAL integer NOT NULL, " +
"PRIMARY KEY (COF_NAME), " +
"FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID))";
try (Statement stmt = con.createStatement()) {
stmt.executeUpdate(createString);
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
주의: COFFEES
는 SUPPLIERS
를 참조하므로 SUPPLIERS
테이블을 먼저 생성해야 합니다.
테이블 데이터 삽입
Apache Ant로 데이터 삽입하기
ant setup
명령은 테이블을 생성할 뿐 아니라, populate-tables.sql
스크립트를 실행해 데이터를 삽입합니다. 해당 SQL 파일의 예시는 다음과 같습니다:
insert into SUPPLIERS values(49, 'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', '95460');
insert into SUPPLIERS values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199');
insert into SUPPLIERS values(150, 'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', '93966');
insert into COFFEES values('Colombian', 00101, 7.99, 0, 0);
insert into COFFEES values('French_Roast', 00049, 8.99, 0, 0);
insert into COFFEES values('Espresso', 00150, 9.99, 0, 0);
insert into COFFEES values('Colombian_Decaf', 00101, 8.99, 0, 0);
insert into COFFEES values('French_Roast_Decaf', 00049, 9.99, 0, 0);
JDBC API로 데이터 삽입하기
SUPPLIERS
테이블 데이터 삽입:
public void populateTable() throws SQLException {
try (Statement stmt = con.createStatement()) {
stmt.executeUpdate("insert into SUPPLIERS values(49, 'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', '95460')");
stmt.executeUpdate("insert into SUPPLIERS values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199')");
stmt.executeUpdate("insert into SUPPLIERS values(150, 'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', '93966')");
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
COFFEES
테이블 데이터 삽입:
public void populateTable() throws SQLException {
try (Statement stmt = con.createStatement()) {
stmt.executeUpdate("insert into COFFEES values('Colombian', 00101, 7.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES values('French_Roast', 00049, 8.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES values('Espresso', 00150, 9.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES values('Colombian_Decaf', 00101, 8.99, 0, 0)");
stmt.executeUpdate("insert into COFFEES values('French_Roast_Decaf', 00049, 9.99, 0, 0)");
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
출처 : https://docs.oracle.com/javase/tutorial/jdbc/basics/tables.html
'High Level Programming Language > JDBC Database Access' 카테고리의 다른 글
Using Prepared Statements (0) | 2025.04.06 |
---|---|
Retrieving and Modifying Values from Result Sets (0) | 2025.04.06 |
Handling SQLExceptions (0) | 2025.04.06 |
Connecting with DataSource Objects (0) | 2025.04.06 |
Establishing a Connection (0) | 2025.04.06 |