국비지원학원/Java

55~57일차

초코맛 2019. 1. 20. 02:40
반응형
*JDBC

-PreparedStatement의 사용
*Bind 변수
  • ?=>값과 묶여지는 변수
  • 테이블명과 컬럼명은 bind 변수로 처리할수 없다.
    • .append() 로 변수의 값을 직접할당하여 사용하게 됨.
    • StringBuilder sb=new StringBuilder();
    • sb.append("select 컬럼명,").append(변수명/*컬럼명을 가진 변수명*/).append(" ^from...");
    • pstmt=con.prepareStatement(sb.toString()) ;
*Procedure
  • 쿼리문을 제어구조(언어적인 요소:상황마다 다른코드 /동적코드)를 가지면서 저장성있게 사용할 때.
  • //자바의 thin드라이버에서는 만들 수 없다.
  • create or replace procedure 프로시저명(변수명 [in] 데이터형 /*inparamenter*/,,, 변수명 out 데이터형/*out parameter*/)
    •    실행시 변수명 out 데이터형/*out parameter*/을 저장하기 위한 변수로 bind 변수를 선언하고 사용하게 되는데
    • //실행 
    • var a number;//bind 변수
    • exec aa('안녕', :a);
    • //자바에서는  이렇게 실행할 수 없어서 대신에 사용하는 것이 있다...!
  • is
  •  //변수
  • begin
  •  //코드,쿼리
  • end;
  • /
  • <retrun은 오직 하나만 반환하는데, 프로시저는 여러개가 들어가면 여러개가 나올수 있다.

    <<<<<<<<<<<<<<<<프로시져 예시>>>>>>>>>>>>>>>>>>> 


-CallableStatement (bind변수 사용 유무2가지) 
  • Procedure를 사용하기 위해 제공되는 객체 
  • 자바코드에서 SQL 문이 제거되므로 코드가 간단해 진다. 언어의 코드와 쿼리문을 분리하여 작성할 수 있다. 
  • preparedStatement-statement 와 상속관계라 부모의것 다 사용가능
  • 사용법)
    • //3. 프로시저 호출 객체 얻기
    • CallableStatement cstmt=con.prepareCall(" { call 프로시저명 (?,?,?)}");//?,?,?=>in,in,out 바인드변수
    • <만드는걸 알면더 좋은데 호출해서  쓰는건 꼬옥 알아야.
    • //4.bind 변수의 값 할당
    • //1,2는 inparameter의 설정
    • cstmt.setInt(1,2019);
    • cstmt.setString(2,"이름들");
    • //3번째는 outparameter로 Out paramter 설정  var 변수명 데이터 로 할수 없음으로 
    • //outparameter를 등록해서 설정
    • cstmt.registerOutParameter(3,값을 지정할 데이터형/*Types*/); 
      • 값을 지정할 데이터형 : 자바라는 언어는 DB벤더사가 만든 Driver 때문에 모든 DBMS와 연동 가능한데, 자바에서 제공하는 클래스는 특정DBMS에만 속해지는 객체를 만들지 않고, 범용적인 객체만 만들어 제공한다

        따라서 Types에서 Numeric또는 varchar2를 사용하고, 커서를 사용할때에는 OracleTypes를 사용한다.

    • //5.실행  : 부모 제공
    • 없어서 부모가 제공하는 method인 excute를 사용하게 된다.
    • //6.등록된 OutParameter의 값을 얻기
    • cstmt.getInt(3);//bind변수는 순서 주의~!~!
    • cstmt.getString(3);
    • //커서는 또 쓰는 방법이 다르다 .일반 형이 들어있을때 이렇게 사용.

 

<<<숙제>>>

이름을 넣어 버튼을 누르면 해당하는 쿼리문이 T.A 에 출력되고, 완성된 쿼리문으로 테이블생성버튼을 누르면 테이블이 생성된다.

테이블명 컬럼명 크기 데이터타입 제약사항 제약사항명까지 설정하고, 테이블이 만들어지면 성공인것!

단 컬럼은 테이블명을 출력했을 때 출력되고 PK는 하나만 가능, 겹치는 이름들도 피해야 잘 만들어 질것이다.....

 


*Procedure 가 cursor를 out parameter로 내보낼때
  • create or replace Procedure 프로시저명 (커서명 out sys_refcursor)
  •  
  • 호출
    • CallableStatement cstmt = con.propareCall("{ call 프로시저명(?) }"); 
  • 바인드변수의 값 설정 :
    • Types에서 제공하는 REF_CURSOR로는 특정DBMS에서 반환하는 cursor를 저장하고 사용할 수 없다. Types는 자바에서 제공 하여 저장은되는데 RS로 돌리지 못한다.
    • 따라서 Sun사의 types를 쓴느게 아니라 DBMS에서 제공하는 cursor 객체를 사용해야 한다.
    • oracle.jdbc.OracleTypes 를 사용(java의 type의 자식이라 들어갈 수 있는것)
    • cstmt.registerOutParameter(바인드 변수 번호, OracleTypes.CURSOR);
  • 실행
    • cstmt.execute();
  • 커서 받아오기=>cursor=>ResultSet 인데 없다!
    • ResultSet rs= (ResultSet)cstmt.getObject(인덱스);  //참조형데이터에서 강제형변환이 훠얼씬더 많이 발생한다.
    • 있을때 까지 뽑아내면 되더라는게 같음..

*외부 DB와 연동
  • 오라클이 설치된 파일의 dbhome_1/NETWORK/ADMIN/listener.ora 파일의 HOST부분을 수정(localhost->ip또는 컴퓨터명)

  •  방화멱의 인바운드 아웃바운드 규칙에 새규칙을 추가하여 1521포트를 여는것을 허용해 준다.
  •  인,아웃 oracle 포트 1521로 열기 
  •  그리고 사용하면 될것!



오라클 외부 접속 
1.D:\app\owner\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora 수정!
<<메모장을 관리자 권한으로 실행하여 파일을 열어보면
2.listener.ora의 내용중 아래의 내용을 붙이고 HOST를 "ip" 또는 "컴퓨터 이름(윈도우+PauseBreak)"으로 변경
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 211.63.89.150)(PORT = 1521))
    )
  )
<<로컬호스트부분을 지우면 적었던 코드들은 안될수 있다!복붙!!
3.서비스를 재가동 한다.
제어판-관리도구-서비스-xxxxtnslistener 서비스를 재가동
4.방화벽 1521 PORT열기



*Transaction 처리
  • Transaction : DB작업의 단위
  • <자바는 auto commit이기때문에 무조건 하나의 트랜젝션으로 끝나게 된다.
  • java는 auto commit이 되기 때문에 쿼리문 하나로 Transaction이 완료된다.
  • <여러개로 묶일수가 없다.
  • ACID라는 트랜젝션을 보장받기위한 동작 :원자성(하나의 단위처럼 동작)/일관성(언제나 같은상태)/고립성(lock)/지속성(영원히반영)
  • <자바에서 Transaction을 관리하는게 connection
  • Connection 객체를 사용하여 autocommit을 해제하고 commit과 rollback을 조건을 부여하여 실행하도록 만든다.
  • 주의 :
    • close가 되면 commit이된다.
    • Connection의 종료를 method 외부에서 수행해야 한다. 
  • 사용법)
    • 1.auto commit을 해제
      • Connection.setAutoCommit(false);
    • 2.쿼리를 수행하고 수행된 횟수를 저장.
      • transaction 대상쿼리 : insert,update,delete 
      • statement나 preparedStatement를 쓸때 .executeUpdate() =>int가 반환되었다.
      • insert
      • executeUpdate() =>int cnt
      • insert
      • execute.update() =>int cnt1
    • 3.목표 하는 행수가 실행되었다면 commit,rollback을 수행한다.
      • int cnt==1&&cnt1==1{
      • }else{
      •  con.rollback;
      • }//end else

기존의 코드 작성 방식으로 수행시 커밋과 롤백이 되지않는다 ! commit과 rollback을 method 밖에서하면 가능해 질지도..

 

 

문제1=>JButton 배열을 이용해 간단히 만들어라


문제2=>JTable에 다양한 형태의 객체들 넣기 (이미지)
JTable ImageIcon///getColumnClass
문제3=>입력한 값들을 JTable과 DB에 넣는데, 이미지를 선택하는 Diagram을 띄우고 이미지의 경로를 DB에 저장..(파일을 DB에 넣지 않는다!무겁)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'국비지원학원 > Java' 카테고리의 다른 글

59일차~63일차  (0) 2019.01.22
58일차  (0) 2019.01.21
54일차  (0) 2019.01.19
53일차  (0) 2019.01.17
51~52일차  (0) 2019.01.16