본문 바로가기

programming/Gukbi

국비 교육 38일차 - 제약조건 & 자바연동

728x90
반응형

목요일엔 학원에 나가서 제약조건과 자바연동을 배웠다. 오라클에서 SQL문장만 연습해볼때는 사실 그렇게 어렵진 않았는데 자바랑 연동을 하면서 부터는 어려워 지고 있다. 

 

복습을 아주 철저하게 해야 또 따라갈 수 있을듯 하다...

여튼 레고

 

CREATE TABLE foodHouse (
    no NUMBER(100),
    cno NUMBER(100),
    poster VARCHAR2(1500),
    name VARCHAR2(300) CONSTRAINT foodHouse_store_nn NOT NULL,
    loc VARCHAR2(10) CONSTRAINT foodHouse_store_nn NOT NULL,
    score NUMBER(2,1) CONSTRAINT foodHouse_store_nn NOT NULL,
    addr VARCHAR2(260) CONSTRAINT foodHouse_store_nn NOT NULL,
    type VARCHAR2(20) CONSTRAINT foodHouse_store_nn NOT NULL,
    price VARCHAR2(20) DEFAULT '없음',
    tel VARCHAR2(20) CONSTRAINT foodHouse_store_nn NOT NULL,
    parking VARCHAR2(10)DEFAULT '없음',
    time VARCHAR2(15) DEFAULT '없음',
    menu VARCHAR(100) DEFAULT '없음',
    good NUMBER(10) DEFAULT '0',
    soso NUMBER(10) DEFAULT '0',
    bad VARCHAR2(10) DEFAULT '0',
    CONSTRAINT foodHouse_no_pk PRIMARY KEY(no),  
    CONSTRAINT fh_cno_fk FOREIGN KEY(cno)
    REFERENCES foodCategory(cno)
);



DROP TABLE foodCategory;
DROP TABLE foodHouse;

CREATE TABLE foodCategory(
   cno NUMBER,
   tno NUMBER CONSTRAINT fc_tno_nn NOT NULL,
   title VARCHAR2(300) CONSTRAINT fc_title_nn NOT NULL,
   subject VARCHAR2(300) CONSTRAINT fc_subject_nn NOT NULL,
   poster VARCHAR2(260) CONSTRAINT fc_poster_nn NOT NULL,
   link VARCHAR2(260) CONSTRAINT fc_link_nn NOT NULL,
   CONSTRAINT fc_cno_pk PRIMARY KEY(cno)
);

CREATE TABLE foodHouse(
    no NUMBER, -- Primary Key
    cno NUMBER,
    poster VARCHAR2(1500) CONSTRAINT fh_poster_nn NOT NULL,
    name VARCHAR2(300) CONSTRAINT fh_name_nn NOT NULL,
    score NUMBER(2,1) CONSTRAINT fh_score_nn NOT NULL,
    loc VARCHAR2(20) CONSTRAINT fh_loc_nn NOT NULL,
    addr VARCHAR2(260) CONSTRAINT fh_addr_nn NOT NULL, -- 지번,길
    tel VARCHAR2(20) CONSTRAINT fh_tel_nn NOT NULL,
    type VARCHAR2(20) CONSTRAINT fh_type_nn NOT NULL,
    price VARCHAR2(20) DEFAULT '없음',
    parking VARCHAR2(30) DEFAULT '없음',
    time VARCHAR2(30) DEFAULT '없음',
    menu VARCHAR2(4000) DEFAULT '없음',
    good NUMBER(4) DEFAULT 0,
    soso NUMBER(4) DEFAULT 0,
    bad NUMBER(4) DEFAULT 0,
    CONSTRAINT fh_no_pk PRIMARY KEY(no),
    CONSTRAINT fh_cno_fk FOREIGN KEY(cno)
    REFERENCES foodCategory(cno)
);

 위의 코드는 실제 웹사이트를 참고해서 직접 짜본 테이블이다. 어떤 값을 PRIMARY KEY로 할건지, DEFAULT값은 언제 설정할건지, FOREIGN KEY는 뭘로 설정할건지 잘 보고 짜줘야 한다. 

 그리고 데이터형도 처음부터 잘 맞춰줘야 나중에 수정을 덜 할 수 있다. 

 

-- 2021-02-16 DDL 데이터 정의 언어
/*
    SQL 
    = DML (웹프로그램)
        SELECT 
        INSERT 
            => INSERT INTO table_name VALUES(값1, 값2...) => 데이터베이스에 설정된 순서로 입력
            => INSERT INTO table_name (값1, 값2...)  VALUES(값1, 값2...) => 지정한 순서로 입력
        UPDATE
            => UPDATE table_name SET
                컬럼명=값, 컬럼명=값
                [WHERE 조건]
        DELETE
            => DELETE FROM table_name
            [WHERE 조건]
            ### 오라클 : INSERT, UPDATE, DELETE => 반드시 COMMIT, (COMMIT 전에 ROLLBAK 사용하면 원상복구 할 수 있음)
            ### 자바 : INSERT, UPDATE, DELETE => AUTOCommit() 
    = DDL (데이터 정의언어)
        = CREATE : 생성한다
                    TABLE : 데이터 저장공산 => 구분해서 저장 (관리가 편하다)
                    ===================================================
                    VIEW : 기존의 테이블을 참조해서 가상공간에 저장 (가상테이블 => 실제 메모리에 저장이 안된다)
                        SELECT문장 저장 되어 있다 (읽기전용 : read only)
                    => CREATE or REPLACE VIEW view_name
                    SEQUENCE : 자동증가번호 (PRIMARY KEY) 
                    PL/SQL : FUNCTION, PROCEDURE, TRIGGER 
                    INDEX : 자동 정렬, 최적화 (속도) 
        = DROP : 삭제 (완전히 삭제) => 복구하기가 어렵다 (ADMIN) 
                DROP TABLE table_name 
                DROP VIEW view_name, DROP SEQUENCE seq_name
        = ALTER : 수정 (단위 =COLUMN)
                = ADD (컬럼추가)
                  형식) ALTER TABLE table_name ADD 컬럼명 데이터형 [제약조건] 
                        => 데이터가 있는 상태 : 모든 제약조건사용이 가능
                        => 기존의 데이터가 첨부된 상태 : UNIQUE (NULL값을 허용)
                = MODIFY (컬럼변경)
                    형식) ALTER TABLE table_name MODIFY 컬럼명 데이터형 : 데이터형 크기
                = DROP (컬럼삭제)
                    형식) ALTER TABLE table_name DROP COLUMN 컬럼명
                = RENAME (컬럼이름 변경) => 알기쉬운 이름변경 (리팩토링)
                    형식) ALTER TABLE table_name RENAME COLUMN old TO new
        = TRUNCATE (데이터 전체 잘라내기)
            형식) TRUNCATE table_name
        = RENAME (테이블 이름 변경)
            형식) RENAME old TO new
    = TCL
        = COMMIT : 정상수행 => 저장 (INSERT, UPDATE, DELETE)
        = ROLLBACK : 비정상수행 => 명령어 취소 
        ** COMMIT을 하고 ROLLBACK을 하면 취소가 안된다 
    = DCL
        = VIEW, INDEX, PL/SQL => 사용자 계정으로는 사용 할 수가 없다 (hr: 사용자 계정)
                                SYSTEM / SYSDBA
        = GRANT : 권한 부여
        = REVOKE : 권한 해제
        
        DDL => TABLE 생성
        1) 데이터형
            문자형 : CHAR, VARCHAR2, CLOB
            숫자형 : NUMBER, NUMBER(4), NUMBER(7,2)
            날짜형 : DATE (TIMESTAMP)
        2) 제약조건 : 원하는 데이터만 저장 (이상현상을 제외: 수정, 삭제...) => 중복없다, 입력값이 필요...
            = NOT NULL : NULL값을 허용하지 않는다
            = UNIQUE : 중복허용방지 (NULL은 허용)
            = PRIMARY KEY : NOT NULL+UNIQUE => 기본키 (데이터 무결성 원칙)
                ** 테이블은 한개 이상의 PRIMARY KEY를 가지고 있다
            = FOREIGN KEY : 다른 테이블의 데이터를 참조 (반드시 => PRIMARY KEY를 참조한다)
                => 테이블이 한개가 아니라 여러개로 나눠서 만든다 (정규화)
            = CHECK : 저장할 데이터를 지정(부서명, 성별, 근무지)
            = DEFAULT : 제약조건이 아니다 (데이터 추가 => 자동으로 추가) : 데이터 초기회
        3) 생성 형식
            CREATE TABLE table_name 
            (
                컬럼명 데이터형 [제약조건], => NOT NULL, DEFAULT
                컬럼명 데이터형 [제약조건], 
                컬럼명 데이터형 [제약조건], 
                컬럼명 데이터형 [제약조건], 
                 [제약조건], => PRIMARY KEY, FOREIGN KEY, CHECK, DE
            )
        
        
*/

CREATE TABLE 판매전표(
    전표번호 VARCHAR2(12),
    판매일자 DATE,
    고객명 VARCHAR2(34),
    총액 NUMBER(10)
    CONSTRAINT 전표번호 PRIMARY KEY 
);

CREATE TABLE 제품 (
    제품번호 VARCHAR2(12),
    제품명 VARCHAR2(100),
    제품단가 NUMBER(10)
);

CREATE TABLE 전표상세 (
    전표번호  VARCHAR2(12),
    제품번호  VARCHAR2(12),
    수량  NUMBER(10),
    단가 NUMBER(10),
    금액 NUMBER(10)
);

DROP TABLE 판매전표;
DROP TABLE 제품;
DROP TABLE 전표상세;

CREATE TABLE 판매전표(
    전표번호 VARCHAR2(12),
    판매일자 DATE CONSTRAINT 판매전표_판매일자_nn NOT NULL,
    고객명 VARCHAR2(34)CONSTRAINT 판매전표_고객명_nn NOT NULL,
    총액 NUMBER(10),
    CONSTRAINT 판매전표_전표번호_pr PRIMARY KEY (전표번호),
    CONSTRAINT 판매전표_총액_ck CHECK(총액 >0)
);

CREATE TABLE 제품 (
    제품번호 VARCHAR2(12),
    제품명 VARCHAR2(100),
    제품단가 NUMBER(10),
    CONSTRAINT 제품_제품번호_pk PRIMARY KEY (제품번호),
    CONSTRAINT 제품_제품명_uk UNIQUE(제품명),
    CONSTRAINT 제품_제품단가_ck CHECK(제품단가 >0)
);

CREATE TABLE 전표상세 (
    전표번호  VARCHAR2(12),
    제품번호  VARCHAR2(12),
    수량  NUMBER(10) CONSTRAINT 전표상세_수량_nn NOT NULL,
    단가 NUMBER(10) CONSTRAINT 전표상세_단가_nn NOT NULL,
    금액 NUMBER(10) CONSTRAINT 전표상세_금액_nn NOT NULL,
    CONSTRAINT 전표상세_전표번호_pk PRIMARY KEY(전표번호),
    CONSTRAINT 전표상세_전표번호_fk FOREIGN KEY(전표번호)
    REFERENCES 판매전표(전표번호),
    CONSTRAINT 전표상세_제품번호_fk FOREIGN KEY(제품번호)
    REFERENCES 제품(제품번호),
    CONSTRAINT 전표상세_금액_ck CHECK(금액 >0)
);

-- ALTER를 이용해서 제약조건을 생성
/*
    ALTER (제약조건 첨부 (ADD), 수정(MODIFY), 삭제(DROP))
    NOT NULL => 컬럼을 수정 (MODIFY)
    PRIMARY KEY, FOREIGN KWY, UNIQUE, CHECK => 제약조건 추가 (ADD)
*/

-- 판매전표 => PRIMARY KEY 추가
ALTER TABLE 판매전표
ADD CONSTRAINT 판매전표_전표번호_pr PRIMARY KEY (전표번호);

-- NOT NULL 
ALTER TABLE 판매전표
MODIFY CONSTRAINT 판매전표_판매일자_nn NOT NULL;

-- CHECK
ALTER TABLE 판매전표
ADD CONSTRAINT 판매전표_총액_ck CHECK(총액 >0);

--
ALTER TABLE 제품
ADD CONSTRAINT 제품_제품번호_pk PRIMARY KEY (제품번호);

ALTER TABLE 제품
ADD CONSTRAINT 제품_제품명_uk UNIQUE(제품명);

ALTER TABLE 제품
ADD CONSTRAINT 제품_제품단가_ck CHECK(제품단가 >0);
/*
    수량  NUMBER(10) CONSTRAINT 전표상세_수량_nn NOT NULL,
    단가 NUMBER(10) CONSTRAINT 전표상세_단가_nn NOT NULL,
    금액 NUMBER(10) CONSTRAINT 전표상세_금액_nn NOT NULL,
    CONSTRAINT 전표상세_전표번호_pk PRIMARY KEY(전표번호),
    CONSTRAINT 전표상세_전표번호_fk FOREIGN KEY(전표번호)
    REFERENCES 판매전표(전표번호),
    CONSTRAINT 전표상세_제품번호_fk FOREIGN KEY(제품번호)
    REFERENCES 제품(제품번호),
    CONSTRAINT 전표상세_금액_ck CHECK(금액 >0)
*/
ALTER TABLE 전표상세
MODIFY 전표상세_수량_nn NOT NULL;

ALTER TABLE 전표상세
MODIFY 전표상세_단가_nn NOT NULL;

ALTER TABLE 전표상세
MODIFY 전표상세_금액_nn NOT NULL;





-- user_constraints는 오라클안에 들어가있는 테이블
SELECT * FROM user_constraints
WHERE table_name ='판매전표';

DESC 판매전표;

DML은 값 단위이고

DDL은 COLUMN단위 

 

그렇기 때문에 ALTER ADD를 하면 컬럼에 제약조건을 추가해줄 수도 있고, MODIFY를 통해 제약조건 자체를 변경해 줄 수도 있다. 

 

-- 2021-02-16 DDL
/*
    DDL 명령어 (DROP, CREATE, ALTER, RENAME, TRUNCATE)
*/
DROP TABLE replyBoard;
DROP TABLE reply;
CREATE TABLE replyBoard(
    no NUMBER,
    name VARCHAR2(34) CONSTRAINT re_name_nn NOT NULL,
    CONSTRAINT rb_no_pk PRIMARY KEY(no)
);
CREATE TABLE reply (
    no NUMBER,
    bno NUMBER,
    msg CLOB CONSTRAINT reply_msg_nn NOT NULL,
    CONSTRAINT reply_no_pk PRIMARY KEY(no),
    CONSTRAINT reply_bno_pk FOREIGN KEY(bno)
    REFERENCES replyBoard(no)
);

-- 데이터 추가
INSERT INTO replyBoard VALUES(1, '이제노');
INSERT INTO replyBoard VALUES(2, '황런쥔');
INSERT INTO replyBoard VALUES(3, '박지성');
COMMIT;

SELECT * FROM replyBoard;

-- 댓글 추가
INSERT INTO reply VALUES(1,1,'댓글 1');
INSERT INTO reply VALUES(2,1,'댓글 2');
INSERT INTO reply VALUES(3,2,'댓글 3');
INSERT INTO reply VALUES(4,3,'댓글 4');
INSERT INTO reply VALUES(5,4,'댓글 5');
COMMIT;


SELECT * FROM reply;


-- 삭제 
DELETE FROM reply
WHERE bno=1;
DELETE FROM replyBoard
WHERE no=1;

DROP TABLE reply;
CREATE TABLE reply (
    no NUMBER,
    bno NUMBER,
    msg CLOB CONSTRAINT reply_msg_nn NOT NULL,
    CONSTRAINT reply_no_pk PRIMARY KEY(no)
);
ALTER TABLE reply
ADD CONSTRAINT reply_bno_pk FOREIGN KEY(bno)
    REFERENCES replyBoard(no)
ON DELETE CASCADE; -- 참조대상이 지워지기 전에 따로 지울 수 있게 해주는 옵션 

INSERT INTO reply VALUES(1, 2, 'HI');
COMMIT;
SELECT  * FROM reply;

DELETE FROM replyBoard
WHERE no=2;

-- NOT NULL 
CREATE TABLE test_member(
    id VARCHAR2(20),
    name VARCHAR(34) CONSTRAINT tm_name_nn NOT NULL,
    email VARCHAR2(100) CONSTRAINT tm_email_nn NOT NULL,
    CONSTRAINT tm_name_id PRIMARY KEY(id)
);

INSERT INTO test_member VALUES('lee', 'jeno', '');
DELETE FROM test_member
WHERE id='lee';
commit;
ALTER TABLE test_member
DISABLE CONSTRAINT tm_email_nn;

SELECT * FROM test_member;

 DML에 해당하는 INSERT, DELETE, UPDATE로 값을 바꿔줬을 경우에는 위와 같이 반드시 COMMIT을 날려줘야 한다. 

 

또 아래와 같이 FOREIGN KEY를 사용할때 참조하고 있는 테이블의 값이 아직 있어서 지우지 못하는 경우에 사용해주는 CASCADE라는 옵션이 있다.

 

ALTER TABLE reply
ADD CONSTRAINT reply_bno_pk FOREIGN KEY(bno)
    REFERENCES replyBoard(no)
ON DELETE CASCADE; -- 참조대상이 지워지기 전에 따로 지울 수 있게 해주는 옵션 

 근데 보통은 잘 사용하지 않는 옵션이라고 한다. 사용하지 않는 값을 그냥 냅두고 있는 상태이기 때문에

 

그리고 이제 문제의 자바 연동..

사실 엄청나게 어려운건 아닌거 같은데 아무래도 또 새로운 부분이라서 조금 머리가 아프긴 하다. 

 

일단 기억해 둬야 할건, 어떤 프로그램이든간에 무조건 VO 파일, DAO 파일을 하나씩 만들어 둬야 한다는거다. 

일단 EMP로 연습 문제를 만들어서 풀어봤다. 

 

package com.sist.dao;
import java.util.*;
public class EmpVO {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Date hiredate;
	private int sal;
	private int comm;
	private int deptno;
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public int getMgr() {
		return mgr;
	}
	public void setMgr(int mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public int getComm() {
		return comm;
	}
	public void setComm(int comm) {
		this.comm = comm;
	}
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
}

그리고 이건 DAO

package com.sist.dao;
// 기능별로 만든다 
/*
 * 	게시판 (VO, DAO)
 * 	회원 (VO, DAO)
 * 	영화 (VO, DAO)
 * 	예매 (VO, DAO)
 * 	
 * 	
 */
/*
 * 	SELECT
 * 	INSERT
 * 	UPDATE
 * 	DELETE ==> JDBC
 */
import java.util.*;
import java.sql.*;
public class EmpDAO {
	// 1. 연결객체, 전송객체 생성
	// 1) 연결
	private Connection conn; // Socket => TCP
	// 2) SQL 문장 전송 => 결과값을 읽어오는 객체
	private PreparedStatement ps;
	// 3) 오라클 연결 주소
	private final String URL="jdbc:oracle:thin:@localhost:1521:XE";
	// 프로그램 시작 => 반드시 드라이버 설치 (클래스) => 클래스를 등록하면 드라이버설치가 인식
	public EmpDAO()
	{
		try
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}catch(Exception ex) {}
	}
	
	// 1. 연결
	public void getConnection ()
	{
		try
		{
			// => 오라클로 전송 
			conn=DriverManager.getConnection(URL, "hr", "happy");
		}catch(Exception ex) {}
	}
	
	// 2. 접속 해제 
	public void disConnection()
	{
		try
		{
			if(ps!=null) ps.close(); // 오라클에 연결된 상태라면 종료시켜라
			if(conn!=null) conn.close();
		}catch(Exception ex) {}
	}
	
	// 기능 설정 (SQL 문장 전송)
	// 1. EMP의 모든 데이터를 출력
	// SQL : SELECT * FROM emp
	public void empAllData()
	{
		try 
		{
			// 연결
			getConnection();
			// sql문장을 만들고
			String sql="SELECT * FROM emp";
			// sql문장 전송
			ps=conn.prepareStatement(sql);
			// 결과값을 받는다
			ResultSet rs=ps.executeQuery();
			// 화면에 출력 => 브라우저, 명령프롬프트
			/*
			 * 	문자형 : CHAR, VARCHAR2, CLOB => getString()
			 * 	날짜형 : DATE, TIMESTAMP => getDate()
			 * 	숫자형 : NUMBER => 소수점이 없는 경우 => getInt()
			 * 					 소수점이 있는 경우 => getDouble()
			 */
			while(rs.next())
			{
				System.out.println("사번:"+rs.getInt(1));
				System.out.println("이름:"+rs.getString(2));
				System.out.println("직위:"+rs.getString(3));
				System.out.println("사수:"+rs.getInt(4));
				System.out.println("입사일:"+rs.getDate(5));
				System.out.println("급여:"+rs.getInt(6));
				System.out.println("성과급:"+rs.getInt(7));
				System.out.println("부서번호:"+rs.getInt(8));
				System.out.println("===========================");
			}
			rs.close();
		}catch(Exception ex) 
		{
			ex.printStackTrace();
		}
		finally
		{
			disConnection();
		}
	}
	
	
	
	// 원하는 컬럼만 출력할 수 있게 ename, job, hiredate, sal
	
	 public void empListData()
	{
		try 
		{
			// 연결
			getConnection();
			// sql문장을 만들고
			String sql="SELECT ename, job, hiredate, sal " 
					+"FROM emp ";
			// sql문장 전송
			ps=conn.prepareStatement(sql);
			// 결과값을 받는다
			ResultSet rs=ps.executeQuery();
			// 화면에 출력 => 브라우저, 명령프롬프트
			
			while(rs.next())
			{
				System.out.println("이름:"+rs.getString(1));
				System.out.println("직위:"+rs.getString(2));
				System.out.println("입사일:"+rs.getDate(3));
				System.out.println("급여:"+rs.getInt(4));
				System.out.println("===========================");
			}
			rs.close();
		}catch(Exception ex) 
		{
			ex.printStackTrace();
		}
		finally
		{
			disConnection();
		}
	}
	
	 
	 public void empListData2()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename, sal, comm, sal+NVL(comm,0) " 
						+"FROM emp ";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("이름:"+rs.getString(1));
					System.out.println("급여:"+rs.getInt(2));
					System.out.println("성과급:"+rs.getInt(3));
					System.out.println("최종급여:"+rs.getInt(4));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	
	 // SUBSTR을 이용해서 81년에 입사한 사원의 이름, 입사일, 급여 출력
	 public void empListData3()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename ,hiredate, sal " 
						+"FROM emp "
						+"WHERE SUBSTR(hiredate, 1, 2)='81'";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("이름:"+rs.getString(1));
					System.out.println("입사일:"+rs.getDate(2));
					System.out.println("급여:"+rs.getInt(3));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	// emp에서 A로 시작하는 사원의 이름만 출력
	 public void empListData4()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT * " 
						+"FROM emp "
						+"WHERE SUBSTR(ename, 1, 1)='A'";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("사번:"+rs.getInt(1));
					System.out.println("이름:"+rs.getString(2));
					System.out.println("직위:"+rs.getString(3));
					System.out.println("사수:"+rs.getInt(4));
					System.out.println("입사일:"+rs.getDate(5));
					System.out.println("급여:"+rs.getInt(6));
					System.out.println("성과급:"+rs.getInt(7));
					System.out.println("부서번호:"+rs.getInt(8));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 // emp에서 급여가 1500이상 3000이하인 사원의 ename, sal, job
	 public void empListData5()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename, sal, job " 
						+"FROM emp "
						+"WHERE sal BETWEEN 1500 AND 3000";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					
					System.out.println("이름:"+rs.getString(1));
					System.out.println("급여:"+rs.getInt(2));
					System.out.println("직위:"+rs.getString(3));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 //emp 에서 10,20번 부서의 사원이름, 급여, 직위 출력
	 public void empListData6()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename, sal, job " 
						+"FROM emp "
						+"WHERE deptno IN(10,20)";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					
					System.out.println("이름:"+rs.getString(1));
					System.out.println("급여:"+rs.getInt(2));
					System.out.println("직위:"+rs.getString(3));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 // emp에서 성과급을 받는 사원의 사원이름, 급여, 성과급, 직위
	 public void empListData7()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename, sal, comm, job " 
						+"FROM emp "
						+"WHERE comm IS NOT NULL";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					
					System.out.println("이름:"+rs.getString(1));
					System.out.println("급여:"+rs.getInt(2));
					System.out.println("급여:"+rs.getInt(3));
					System.out.println("직위:"+rs.getString(3));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 // 각부서별 인원수, 최대급여, 최소급여, 급여합, 급여평균
	 public void empListData8()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT deptno, COUNT(*), MAX(sal), MIN(sal), SUM(sal), AVG(sal) " 
						+"FROM emp "
						+"GROUP BY deptno "
						+"ORDER BY deptno ASC";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("부서번호:"+rs.getString(1));
					System.out.println("사원수:"+rs.getString(2));
					System.out.println("최대급여:"+rs.getInt(3));
					System.out.println("최소급여:"+rs.getInt(4));
					System.out.println("급여합:"+rs.getInt(5));
					System.out.println("평균급여:"+rs.getInt(6));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 public void empGroupData()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT deptno, COUNT(*), MAX(sal), MIN(sal), SUM(sal), AVG(sal) " 
						+"FROM emp "
						+"GROUP BY deptno "
						+"ORDER BY deptno ASC";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("부서번호:"+rs.getString(1));
					System.out.println("사원수:"+rs.getString(2));
					System.out.println("최대급여:"+rs.getInt(3));
					System.out.println("최소급여:"+rs.getInt(4));
					System.out.println("급여합:"+rs.getInt(5));
					System.out.println("평균급여:"+rs.getInt(6));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 // 직위의 종류만 출력 => DISTINCT
	 public void empDistinctData()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT DISTINCT job " 
						+"FROM emp ";
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("직위:"+rs.getString(1));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	 // emp에서 이름, 직위, 입사일, 급여, 부서명, 근무지, 급여 등급 출력
	 public void empJoinData()
		{
			try 
			{
				// 연결
				getConnection();
				// sql문장을 만들고
				String sql="SELECT ename, job, hiredate, sal, dname, loc, grade " 
						+"FROM emp, dept, salgrade "
						+"WHERE emp.deptno=dept.deptno "
						+"AND sal BETWEEN losal AND hisal";
						
				// sql문장 전송
				ps=conn.prepareStatement(sql);
				// 결과값을 받는다
				ResultSet rs=ps.executeQuery();
				// 화면에 출력 => 브라우저, 명령프롬프트
				
				while(rs.next())
				{
					System.out.println("이름:"+rs.getString(1));
					System.out.println("직위:"+rs.getString(2));
					System.out.println("입사일:"+rs.getDate(3));
					System.out.println("급여:"+rs.getInt(4));
					System.out.println("부서명:"+rs.getString(5));
					System.out.println("지역:"+rs.getString(6));
					System.out.println("급여둥급:"+rs.getInt(7));
					System.out.println("===========================");
				}
				rs.close();
			}catch(Exception ex) 
			{
				ex.printStackTrace();
			}
			finally
			{
				disConnection();
			}
		}
	 
	public static void main(String[] args) {
		EmpDAO dao=new EmpDAO();
		// 1. 데이터 전체 출력 => SELECT * FROM table_name
		dao.empJoinData();
	}

}

 사실상 DAO의 형식은 매번같아서 이걸 잘 외우고 있는게 중요할 거 같다. 지금 다시 따로 써볼 예정이다.

 

package com.sist.dao;
import java.util.*;
import java.sql.*;
public class DAOForm {

	// 1. 연결객체, 전송객체 생성
	// 1) 연결
	private Connection conn;
	// 2) SQL 문장 전송 => 결과값을 읽어오는 객체
	private PreparedStatement ps;
	// 3) 오라클 연결 주소
	private final String URL ="jdbc:oracle:thin:@localhost:1521:XE";
	// 프로그램 시작 => 반드시 드라이버 설치
	public DAOForm() // 생성자로 만들어줌 -> 딱한번만 실행되어야 하기 때문에
	{
		try 
		{
			// 오라클로 접속하는 드라이버 설치
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}
		catch (Exception ex)
		{
			
		}
	}
	
	// 1. 연결
	public void getConnection()
	{
		try 
		{
			conn=DriverManager.getConnection(URL, "hr", "happy");
		} 
		catch (Exception ex) 
		{
			
		}
	}
	// 2. 접속 해제
	public void disConnection()
	{
		try 
		{
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
		} 
		catch (Exception ex) 
		{
			
		}
	}
	// 3. 기능 설정
	// 1. emp의 모든 데이터를 출력
	public void allData()
	{
		try 
		{
			// 연결
			getConnection();
			// sql 문장 만들기
			String sql="SELECT ename, job, hiredate, sal FROM emp";
			// sql 문장 전송
			ps=conn.prepareStatement(sql);
			// 결과값 받기
			ResultSet rs=ps.executeQuery();
			// 화면에 출력
			
			while(rs.next())
			{
				System.out.println("이름:"+rs.getString(1));
				System.out.println("직위:"+rs.getString(2));
				System.out.println("입사일:"+rs.getString(3));
				System.out.println("금여:"+rs.getString(4));
				System.out.println("========================");
			}
			rs.close();
		} 
		catch (Exception ex)
		{
			System.out.println(ex.getMessage());
		}
		finally
		{
			disConnection();
		}

	}
	public static void main(String[] args) {
		DAOForm df=new DAOForm();
		df.allData();
	}
}

 일단 형식은 알겠는데.. 코드가 실행이 안된다. 

왜일까? ㅎㅎ ,,,, ㅜ 

 

728x90
반응형