참조서적 : 뇌를 자극하는 jAVA 프로그래밍 (한빛 미디어)

21장 JDBC 프로그래밍 (P828 참조)


아래의 SQL문은 책에 있는 MYSQL이 아니라 오라클로 작성했다.


1. 테이블 만들기


DROP TABLE GOODSINFO;

-- 기존 테이블 삭제


CREATE TABLE GOODSINFO (

CODE CHAR(5) CONSTRAINT GOODSINFO_CODE_NN NOT NULL,

NAME VARCHAR2(30) CONSTRAINT GOODSINFO_NAME_NN NOT NULL,

PRICE NUMBER(8) CONSTRAINT GOODSINFO_PRICE_NN NOT NULL,

MAKER VARCHAR2(20),

PRIMARY KEY(CODE)

);

-- GOODSINFO라는 테이블을 만들고 CODE, NAME, PRICE, MAKER 컬럼 생성

-- 무결성 제약조건은 NOT NULL, PRIMARY KEY는 CODE로 지정


SELECT * FROM GOODSINFO;



2. 데이터 삽입


INSERT INTO GOODSINFO (CODE, NAME, PRICE, MAKER)

VALUES('10001', '디지털TV', 350000, 'LG');

-- INSERT문으로 하나씩 데이터를 넣기


INSERT INTO GOODSINFO (CODE, NAME, PRICE, MAKER)

SELECT '10002', 'DVD 플레이어', 250000, 'LG' FROM DUAL UNION ALL

SELECT '10003', '디지털 카메라', 210000, '삼성' FROM DUAL UNION ALL

SELECT '10004', '전자사전', 180000, '아이리버' FROM DUAL UNION ALL

SELECT '10005', '벽걸이 에어컨', 400000, '삼성' FROM DUAL;

-- 서브쿼리로 한번에 여러개의 데이터를 넣기


SELECT * FROM GOODSINFO;




문제) 테이블 생성하기와 데이터 저장 (P830 참조)


1) 테이블 생성 및 무결성 제약조건 설정

CREATE TABLE STOCKINFO (

CODE CHAR(5) CONSTRAINT STOCKINFO_CODE_NN NOT NULL,

NUM NUMBER(5) CONSTRAINT STOCKINFO_NUM_NN NOT NULL,

PRIMARY KEY(CODE)

);


2) 서브쿼리를 이용한 데이터 일괄 삽입

INSERT INTO STOCKINFO (CODE, NUM)

SELECT '10001', 100 FROM DUAL UNION ALL

SELECT '10002', 200 FROM DUAL UNION ALL

SELECT '10003', 50 FROM DUAL UNION ALL

SELECT '10004', 100 FROM DUAL UNION ALL

SELECT '10005', 150 FROM DUAL;




3. SELECT문 연습


SELECT * FROM GOODSINFO WHERE MAKER = 'LG';


MAKER 컬럼이 LG인 것만 검색하여 출력했다.



SELECT * FROM GOODSINFO WHERE NAME LIKE '디지털%';


NAME 컬럼 값이 디지털로 시작하는 데이터를 검색했다.

%는 뒤에 아무거나 와도 상관없다는 LIKE 연산자의 와일드 카드



SELECT * FROM GOODSINFO WHERE MAKER = '삼성' AND PRICE < 250000;


MAKER 컬럼 값이 삼성이고, PRICE 컬럼 값이 250000보다 작은 데이터를 검색




문제) GOODSINFO 테이블과 STOCKINFO 테이블의 관계를 맺어서 읽어오는 프로그램 작성


SELECT GOODSINFO.CODE, NAME, NUM 

FROM GOODSINFO, STOCKINFO 

WHERE GOODSINFO.CODE = STOCKINFO.CODE;


-- 조인을 이용하여 GOODSINFO와 STOCKINFO가 일치하는 CODE를 연결하여 2개의 테이블에서 GOODSINFO, CODE, NAME, NUM 4개의 데이터를 연결하여 출력할 수 있다.


Ex21-3) 위의 조인을 쓴 SELECT문을 JDBC로 구현하기


import java.sql.*;


public class JDBCExample1 {

public static void main(String[] arg) {

String driver = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@211.183.9.66:1521:xe";

String sql = "SELECT GOODSINFO.CODE, NAME, NUM FROM GOODSINFO, STOCKINFO 

   WHERE GOODSINFO.CODE = STOCKINFO.CODE";

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(url, "st02", "st02");

pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();


while (rs.next()) {

String code = rs.getString("CODE");

String name = rs.getString("NAME");

int num = rs.getInt("NUM");

System.out.printf("%8s %s \t%8d %n", code, name, num);

}

} catch (Exception e) {

System.out.println(e.getMessage());

} finally {

try {

conn.close();

} catch (Exception e) {

System.out.println(e.getMessage());

}

}

}

}


※ printf ("%8s %s \t%8d %n", code, name, num)에 대한 설명

- printf에서 출력할 code, name, num의 프리미티브 타입이 각각 String, String, int이므로 포맷명세자는 String에 쓰는 %s, %s, int에 쓰는 %d를 쓴다. 

- name과 num 사이에 간격을 두기 위해 num 앞에 탭을 두는 /t를 사용했고 맨 끝에는 줄바꿈을 위하여 %n을 썼다.

- 상품코드는 그냥 %s가 아니라 %8s, 재고수량은 그냥 %d가 아니라 %8d를 썼는데, 이는 해당 컬럼이 차지할 칸수이며 해당 칸에서 우측 정렬이 된다.


결과) 상품코드, 상품명, 재고수량이 정상적으로 출력된다.








Posted by netyhobby
,