** 별도로 공부할 내용



예외처리(exception)

쿼리문(인서트, 셀렉트) 실행하는 자바 구문.

executeUpdate

executeQuery -- > 결과집합인 ResultSet 을 리턴받는다.


테이블 불러와서 출력할때는

while (ResultSet의 변수명.next()) 를 사용하고 row단위로 먼저 접근하고

실행문에서는 컬럼 단위로 접근한다.



http://devyongsik.tistory.com/294

Class.forName() 내용 확인 url






문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력.

JDBC 프로그램 작성. 오라클 이용. 총점 기준 정렬 출력(내림차순 desc)


판정 기준은 

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상.

과락 -> 과목중 40점 미만이 있고, 평균이 60이상.

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인.

평균이 60점 이하 -> 불합격


정렬 기준은 총점 기준으로 내림차순 정렬.


실행 예)

성적 입력(이름 국어 영어 수학)?hong 100 100 100

성적 입력(이름 국어 영어 수학)?kim 80 90 80

성적 입력(이름 국어 영어 수학)?-1 -> 입력끝 지정 필요


------------------------------------------

    이름  국어  영어  수학  총점   평균   판정

------------------------------------------

1등 hong   100   100   100   300  100.0   합격

2등 kim     80    90    80    ..    ..    합격

------------------------------------------



** 오라클 별도작업

--오라클에 성적저장용 테이블 생성

CREATE TABLE score(

sid NUMBER --PK, 자동번호 기능 부여.

,name VARCHAR2(10)

,kor NUMBER(3) --CK (0~100)

,end NUMBER(3) --CK (0~100)

,mat NUMBER(3) --CK (0~100)

);



-- 제약조건 추가

ALTER TABLE score

ADD CONSTRAINT score_sid_pk PRIMARY KEY (sid)

ALTER TABLE score

ADD CONSTRAINT score_kor_ck CHECK (kor BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_eng_ck CHECK (eng BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_mat_ck CHECK (mat BETWEEN 0 AND 100);


--자동번호부여


CREATE SEQUENCE scoreSeq;



--INSERT 쿼리 샘플 (자바 소스에 복사할 목적으로 미리 만든 샘플이므로 구문 끝에 ; 표시를 제외함.)

INSERT INTO score (sid, name, kor, eng, mat) VALUES (scoreSeq.nextVal, 'hong', 100, 100, 100)


--SELECT 쿼리 샘플

  SELECT sid, name, kor, eng, mat

  , (kor+eng+mat) as tot

  , (kor+eng+mat)/3 as ave

  , case

           when ((kor+eng+mat)/3 >= 60) and (kor<40 or eng<40 or mat<40) then '과락'

   when ((kor+eng+mat)/3 >= 60) then '합격'

   else '불합격'

    end as "grade"

FROM score

ORDER BY (kor+eng+mat) DESC



------------------------------------------------------------

//DBconn.java



//Oracle07.java






문제) 이름과 전화번호를 저장하는 JDBC 프로그램 작성. 오라클 이용.

MemberDTO, MemberDAO, Oracle08 클래스 작성


실행 예)

이름 전화번호(1)?홍길동 010-123-1234

이름 전화번호(2)?김길동 010-222-3333

이름 전화번호(3)?-1


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------


-- 회원수 출력쿼리

SELECT COUNT(*) AS count FROM member 


-- 회원정보 출력

SELECT mid, name, tel FROM member ORDER BY mid


-- 회원정보 입력

INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')



//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.

CREATE TABLE member (

mid NUMBER --PK

,name VARCHAR2(10)

,tel VARCHAR2(20)

);


ALTER TABLE member

ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberSeq;



----

//DBconn.java -> 오라클 연결용 클래스

//연결 전용 클래스 작성

//DBConn.java

package com.test;


import java.sql.*;


public class DBConn {

//Singleton pattern

private static Connection dbConn;

public static Connection getConnection() throws SQLException, ClassNotFoundException {

if (dbConn == null) {  // 이미 getConnection 을 호출하여 성공한적이 있으면 dbConn 을 그냥 리턴.

   // Singleton pattern은 이것을 의미함.


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

String user = "scott";

String pw = "tiger";

Class.forName("oracle.jdbc.driver.OracleDriver");

dbConn = DriverManager.getConnection(url, user, pw);


}

return dbConn;

}

public static void close() throws SQLException {

if (dbConn != null) {

if (!dbConn.isClosed()) {

dbConn.close();

}

}

dbConn = null;

}

}




//MemberDTO.java -> 자료처리 전용 클래스. 멤버변수, getter, setter

package com.test;


public class MemberDTO {

private int mid;

private String name, tel;

public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}




//MemberDAO.java -> 데이터베이스 엑세스 담당 클래스. 입력, 출력, 연결용 메소드.

package com.test;


import java.util.*;

import java.sql.*;


public class MemberDAO {

private Connection conn;

//연결 전용 메소드

public void connect() throws SQLException, ClassNotFoundException{

conn  = DBConn.getConnection();

}

//연결 해제 전용 메소드

public void close() throws SQLException{

DBConn.close();

conn = null;

}

//입력 메소드 즉, INSERT 쿼리 실행

public int add(MemberDTO dto) throws SQLException{

int result = 0;

String sql = String.format("INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, '%s', '%s')", dto.getName(), dto.getTel());


//쿼리 실행

//Java에서 쿼리를 실행하면 

//내부적으로 COMMIT은 자동 실행됨.

//executeUpdate() 메소드는 DML문인 경우만 실행.

Statement stmt = conn.createStatement();

result = stmt.executeUpdate(sql);

return result;

}

//회원수 출력 전용 메소드

public int count() throws SQLException {

int result = 0;

String sql = String.format("SELECT COUNT(*) AS count FROM member");

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql); //결과집합

while(rs.next()) { //row 단위 접근

int count = rs.getInt("count"); //column 단위 접근

result = count;

}


rs.count();

return result;

}

//출력 메소드 즉, SELECT 쿼리 실행

public ArrayList<MemberDTO> lists() throws SQLException{

ArrayList<MemberDTO> arrayList = new ArrayList<MemberDTO>();

//SELECT 쿼리 준비

String sql = String.format("SELECT mid, name, tel FROM member ORDER BY mid");

//쿼리 실행

//executeQuery() 메소드는 DQL문인 경우만 실행.

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql); //결과집합

//결과 집합(ResultSet)을 리턴해야 된다.

//결과 집합은 특성상 이 메소드를 벗어날 수 없다. 왜냐하면 ResultSet은 메소드 빠져나가기 전에 반드시 클로즈하기 때문.

//결과 집합을 -> 결렉션 저장

//컬렉션을 리턴.

while(rs.next()) { //row 단위 접근

int mid = rs.getInt("mid"); //column 단위 접근

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

String tel = rs.getString("tel");

MemberDTO dto = new MemberDTO();

dto.setMid(mid);

dto.setName(name);

dto.setTel(tel);

arrayList.add(dto);

}

rs.close();

return arrayList;

}


}




//Oracle08.java -> main() 메소드. 인터페이스 담당.

package com.test;


import java.util.*;


public class Oracle08 {


public static void main(String[] args) {


MemberDAO dao = new MemberDAO();

Scanner sc = new Scanner(System.in);

try {

//연결

dao.connect();

//입력 - 무한실행

do {

System.out.printf("이름 전화번호(%d)?", (dao.count()+1));

String name = sc.next(); //이름

if (name.equals("-1")) {

break;

}

String tel = sc.next();  //전화번호

MemberDTO dto = new MemberDTO();

dto.setName(name);

dto.setTel(tel);

int rowCount = dao.add(dto);

System.out.printf("%d개의 행이 입력됨. %n", rowCount);

} while (true);

//출력

System.out.println("----------------------");

System.out.printf("전체 회원수 : %d명 %n", dao.count());

System.out.println("----------------------");

System.out.println("회원번호 이름  전화번호");

for(MemberDTO dto : dao.lists()) {

System.out.printf("%8d %4s %9s %n", dto.getMid(), dto.getName(), dto.getTel());

}

System.out.println("----------------------");

} catch (Exception e) {

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

}


}


}








문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력.

JDBC 프로그램 작성. 오라클 이용. 총점 기준 정렬 출력(내림차순 desc)

DBConn, ScoreDTO, ScoreDAO, Oracle09


판정 기준은 

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상.

과락 -> 과목중 40점 미만이 있고, 평균이 60이상.

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인.

평균이 60점 이하 -> 불합격


정렬 기준은 총점 기준으로 내림차순 정렬.


실행 예)

성적 입력(이름 국어 영어 수학)?hong 100 100 100

성적 입력(이름 국어 영어 수학)?kim 80 90 80

성적 입력(이름 국어 영어 수학)?-1 -> 입력끝 지정 필요


------------------------------------------

    이름  국어  영어  수학  총점   평균   판정

------------------------------------------

1등 hong   100   100   100   300  100.0   합격

2등 kim     80    90    80    ..    ..    합격

------------------------------------------



//DBConn.java 오라클 접속을 위한 클래스


//ScoreDTO.java 자료처리전용 클래스 - 멤버변수, getter, setter




//ScoreDAO.java 데이터베이스 엑세스 전용 클래스.




//Oracle09.java main() 메소드 구현. 인터페이스 출력 클래스.







문제) 성적 처리. 메뉴 구성 추가. 새 프로젝트에서 구성할 것.

DBConn.java, ScoreDTO, ScoreDAO, Process, Oralce10 클래스 이용.


여러명의 이름, 국어, 영어, 수학 입력 받아서 총점, 평균, 판정, 등수 계산해서 출력. 출력시 이름 오름차순 정렬해서 출력.


실행 예)

======== 성적 처리 ==============

1. 성적 입력

2. 성적 전체 출력

3. 이름 검색 출력

4. 성적 수정

5. 성적 삭제

선택(1~5, -1 종료)->1


성적 입력(이름 국어 영어 수학)?park 80 75 60

성적 입력(이름 국어 영어 수학)?hong 100 90 80

성적 입력(이름 국어 영어 수학)?kim 80 85 80

성적 입력(이름 국어 영어 수학)?-1


======== 성적 처리 ==============

1. 성적 입력

2. 성적 전체 출력

3. 이름 검색 출력

4. 성적 수정

5. 성적 삭제

선택(1~5, -1 종료)->2


 이름   국어  영어  수학  총점  평균   판정  등수

 hong    100   90    80    XXX  XXX.X  합격   1

 kim      80   85    80    XXX  XXX.X  합격   2

 park     80   75    60    XXX  XXX.X  합격   3



======== 성적 처리 ==============

1. 성적 입력

2. 성적 전체 출력

3. 이름 검색 출력

4. 성적 수정

5. 성적 삭제

선택(1~5, -1 종료)->3

검색하려는 이름?kim

 이름   국어  영어  수학  총점  평균   판정  등수

 kim      80   85    80    XXX  XXX.X  합격   2



======== 성적 처리 ==============

1. 성적 입력

2. 성적 전체 출력

3. 이름 검색 출력

4. 성적 수정

5. 성적 삭제

선택(1~5, -1 종료)->3

검색하려는 이름?choi

검색 결과가 없습니다.


======== 성적 처리 ==============

1. 성적 입력

2. 성적 전체 출력

3. 이름 검색 출력

4. 성적 수정

5. 성적 삭제

선택(1~5, -1 종료)->-1


프로그램이 종료되었습니다.


-------------------------------------------------------------

//새 프로젝트 생성(Score_Console)


//DBConn.java    -> 오라클 데이터베이스 접속 클래스.

//ScoreDTO.java  -> 멤버변수, getter, setter. 등수 관련 멤버 추가.

//ScoreDAO.java  -> 연결, 입력, 출력, 검색, 수정, 삭제 메소드.

//Process.java   -> 입력, 출력, 검색, 수정, 삭제 관련 인터페이스

//Oralce10.java  -> main() 메소드. 주메뉴 무한실행


WRITTEN BY
빨강꼬마

,