1~2 교시
시험설명
3 교시
** DEPT 테이블에 대해서 삽입과 조회 작업
1. DEPT 테이블 구조
=> DEPTNO : 숫자 2자리
=> DNAME : 문자 14자리 - 한글 4자
=> LOC : 문자 13자리 - 한글 4자
2. Java Project 생성
3. 드라이버 설치
=> ojdbc.jar 파일을 프로젝트에 복사
=> 복사한 파일을 선택하고 마우스 우클릭 [build path] - [add to build path] 실행
4. main 메소드를 소유한 클래스를 만들고 데이터를 삽입하는 코드를 작성하고 실행
=> 에러 발생시 constraint 단어가 보이면 유일해야하는 데이터 중에 중복 데이터가 있거나 not null이 설정된 열에 데이터를 생략하고 입력하거나 foreign key로 설정된 열에 참조할 테이블에 없는 데이터 등을 삽입한 것인지 확인
=> table or view does not exist : 테이블이 없는 경우
=> SQL 메시지가 보이면 SQL을 잘못 작성한 경우
=> 자료형이맞지 않으면 Invalid 자료형으로 에러 메시지가 출력된다.
5. 확인 : 데이터베이스 접속 프로그램에서 실행
=> 삽입한 데이터가 있는지 확인
select *
from dept;
4 교시
6. select 작업
=> PreparedStatement 의 executeQuery 메소드로 수행
=> 결과는 ResultSet 타입
1) ResultSet의 next()
=> 다음 데이터가 있으면 그 데이터를 가리키는 곳으로 이동하고 true를 리턴
다음 데이터가 없으면 false를 리턴
if(Resultset.next() == true) {
조회된 데이터가 있는 것
}else{
조회된 데이터가 없는 것
}
=> 여러 행의 데이터라면 아래처럼 반복문을 이용해서 각각의 행에 접근하는 것이 가능
while(ResultSet.next(){
행 단위 작업
}
2) ResultSet의 get 메소드
=> 열의 값을 가져올 때 사용하는 메소드
get자료형(열이름이나 select 구문의 열 인덱스)로 사용
=> getInt, getDouble, getString, getDate 형태로 만들어져 있다.
=> 모든 열의 값은 getString으로 가져오는 것이 가능
getInt("deptno") : deptno열의 값을 정수로 리턴
getInt(1) : 첫번째 열의 값을 정수로 리턴
getString("dname") : dname 열의 값을 문자열로 리턴
3) main 메소드를 소유한 클래스를 만들고 main 메소드에 작성
=> DEPT 테이블
4) main 메소드를 만들고 작성
=> deptno(primary ket - not null 이고 unique)를 입력받아서 deptno에 해당하는 데이터를 조회 : 상세보기
select deptno, round(avg(sal))
from emp
group by deptno;
rs.getInt("deptno")
rs.getInt("round(avg(sal))") => rs.getInt("평균급여") => rs.getInt(2)
7. Transaction
=> 한 번에 처리되어야 하는 작업의 단위
1) 구현 방식
auto-commit : sql 문장이 성공적으로 수행되면 자동으로 commit - 자바의 기본
manual-commit : commit이나 rollback을 명시적으로 호출해야만 commit 되거나 rollback되는 방식
2) java에서의 활용
=> 기본적으로 AutoCommit인데 ManualCommit으로 변경하고자 하는 경우에는
Connection.setAutoCommit(false); 호출
=> Commit 이나 Rollback을 하고자 하는 경우에는 Connection.commit() 또는 rollback()을 호출
=> rollback은 작업을 취소하는 명령인데 대두분의 경우는 하나의 거래를 수행하는 도중 예외가 발생하면 rollback을 시킨다.
=> 작업이 정상적으로 완료되면 commit을 호출해서 원본에 작업 내용을 반영한다.
5 교시
1. PROCEDURE
=> 자주 사용하는 SQL문장을 하나의 이름으로 만들어두고 프로그래밍 언어의 메소드처럼 사용하는 것
=> 사용자에게 실제 테이블의 구조를 보여주지 않아도 되서 보안이 향상
=> SQL 문장은 보조기억장치에서 주기억장치로 불러와서 실행해야 하지만 프로시저는 한 번 컴파일되면 주기억장치에 상주한 상태에서 실행되기 때문에 실행 속도도 향상될 수 있다.
=> 프로시저를 만드는 문법은 데이터베이스 종류에 따라 서로 다르다.
Oracle에서 프로시저 만드는 문법은 PL/SLQ 이라고 한다.
=> DEPT 테이블에 데이터를 삽입하는 프로시저
Create or Replace procedure insert_dept_proc
(VDEPTNO IN DEPT.DEPTNO%TYPE,
VDNAME IN DEPT.DNAME%TYPE,
VLOC IN DEPT.LOC%TYPE)
is
begin
insert into dept(deptno, dname, loc)
values(VDEPTNO, VDNAME, VLOC);
end;
/
begin
insert_dept_proc(01, '기획', '서울');
end;
=> 프로시저는 SI 업체와 같은 대기업이나 공공기관 프로젝트를 받아서 하는 기억에 갈 때는 되도록이면 사용
=> Start up이나 중소기업처럼 역할이 분리되지 않은 곳에서는 잘 사용하지 않는다.
2. Java에서 프로시저 사용
=> PreparedStatement 대신 CallableStatement 생성
CallableStatement 실행객채변수 = Connection.prepareCall("{call 프로시저이름(?...)}");
실행객체변수.set자료형(물음표 번호, 실제 데이터)...
=> 실행은 executeUpdate() 또는 executeQuery
3. 앞에서 만든 insert_dept_
** 데이터베이스 연동 패턴
1. DTO(Date Trandfer Object - Variavle Object, Domain) 패턴
=> 여러 개의 속성을 묶어서 하나로 표현하기 위한 클래스를 DTO 또는 VO라고 한다.
=> 테이블과 매핑되는 클래스를 만들어서 사용하는 패턴 - 이 패턴의 확장이 ORM : SQL 없이 인스턴스만으로 데이터베이스 작업을 수행하도록 해주는 프레임워크
2. DAO(Date Access Object)
=> 데이터베이스 작업 만 수행하는 별도의 클래스를 만들어서 사용하는 패턴
=> 이 패턴을 서버에 적용할 대는 특별한 경우가 아니면 Singleton Pattern으로 디자인
3. Singleton
=> 객체를 하나만 만들 수 있도록 클래스를 디자인하는 패턴
4. Service : 사용자의 요구(Business Logic)를 처리하는 클래스
5. Controller : 사용자의 요청을 받아서 필요한 Service를 호출하는 클래스
6. View : 클라이언트가 보고 있는 화면
6 교시
** DTO & DAO 패턴을 이용한 CRUD(Create Read Update Delete) 작업
1. 작업에 필요한 샘플 데이터 생성
1) 샘플 테이블을 생성
- 상품 테이블
상품 코드 : 영문과 숫자로 이루어진 문자열 10자리 자주 변함, primary key
상품 이름 : 한글 포함한 20자리 문자열 - 변하지 않음, 필수
상품 원산지 : 한글 포함한 50자리 문자열 - 변하지 않음, 필수
상품 가격 : 정수 10 자리 이내 - 기본값 0
상품 입고일 : 날짜 - 기본값 오늘 날짜
2. 테이블의 데이터를 표현할 클래스를 자바 프로젝트에 생성
=> 자료형을 정확하게 설정하는 것이 중요하고 필드의 이름과 컬럼의 이름을 매칭을 잘 해주어야 한다.
public class GoodDAO {
// 싱글톤 패턴 디자인 - 객체를 1개만 생성할 수 있도록 만든 패턴
// 외부에서 생성할 수 없도록 생성자를 private으로
private GoodDAO() {} // 생성자
// 만들어진 객체의 참조를 저장하기 위한 변수
private static GoodDAO goodDAO = null;
// 객체가 없으면 만들어서 리턴하고 있으면 있는 것을 리턴하도록 객체 사용을 위한 메소드
public static GoodDAO sharedInstance() {
if(goodDAO == null) {
goodDAO = new GoodDAO();
}
return goodDAO;
}
// 전체 데이터를 가져오는 메소드
// select는 where절을 확인해서 매개변수를 생성
// select * from goods;
// List를 리턴할 때는 인스턴스를 만들고 데이터를 추가한 후 리턴
// 여러개의 데이터를 가져올 때는 데이터가 없는 경우 size가 0
public List<Good> allGood() {
List<Good> list = new ArrayList<Good>();
return list;
}
// code를 가지고 데이터를 찾아오는 메소드
// code는 기본키
// select * form goods where code = ?
// 하나의 행만 리턴하는 경우에는 데이터가 없으면 null 을 리턴
public Good getGood (String code){
Good good = null;
return good;
}
// 데이터를 삽입하는 메소드
// 삽입이나 수정은 매개변수가 DTO 아니면 Map
// -1이 리턴되면 실패, 0이 리턴되면 조건에 맞는 데이터가 없음, 양수가 리턴되면 작업을 수행한 것이다.
public int insertGood() {
int result = -1;
return result;
}
}
'Oracle' 카테고리의 다른 글
26일차 공부 DTO&DAO (0) | 2020.05.14 |
---|---|
24일차 공부 select, procedure, JDBC (0) | 2020.05.12 |
23일차 공부 Transaction (0) | 2020.05.11 |
22일차 공부 SELF JOIN, ANSI JOIN, SUB QUERY (0) | 2020.05.08 |
21일차 공부 select, like, NVL , GroupFunction, join (0) | 2020.05.07 |