2024.02.28

김무영·2024년 2월 29일
post-thumbnail

인덱스 생성

  • 인덱스가 설정된 컬럼을 조회하는 DD : user_ind_columns
  • unique index
    • 컬럼의 값이 유일할 때 사용하는 인덱스
    • 테이블 생성 시 primary key나 unique 제약사항을 설정하면 자동 생성된다.
    • 개발자가 컬럼의 값이 유일할 때 수동 생성도 가능하다.
    • 문법 )
      • create unique index 인덱스명 on 테이블명 ( 컬럼명 asc(desc) );
  • non-unique index
    • 컬럼의 값이 중복될 때 사용하는 인덱스 (일반컬럼에 주로 적용한다.)
    • 개발자가 수동으로 생성하는 index
    • 문법 )
      • create index 인덱스명 on 테이블명 (컬럼명 asc);
  • bitmap index
    • 컬럼의 값이 중복이 되긴하나 독특한 코드 형태의 값일 때 사용하는 인덱스.
      • 독특한 코드 형택의 값
        • S_0001
        • ITEM_00002
    • 문법 )
      • create bitmap index 인덱스명 on 테이블명(컬럼명);
  • composite index
    • 여러 개의 컬럼으로 인덱스가 구성되어야 할 때.
    • unique index 계정.
    • 문법 )
      • create index 인덱스명 on 테이블명(컬럼명,,,,);
  • 인덱스를 사용한 정렬
    • order by절을 사용한 정렬은 레코드가 많을 수록 속도가 떨어진다.
      index가 설정된 컬럼은 order by 해도 괜찮다.
    • index를 생성하면 컬럼의 asc이 기본 인덱스로 생성된다.
    • index를 설정한 후 index hint를 사용하면 정렬을 수행 할 수 있다.
    • index hint )
      • 조회컬럼에 /* + */또는 --+로 인덱스 힌트를 사용
      • 인덱스를 사용한 오름차순 정렬
        • select /* + index(테이블명 인덱스명) */ 컬럼명,,,,
      • 인덱스를 사용한 내림차순 정렬
        • select /* + index_desc(테이블명 인덱스명) */ 컬럼명,,,,

JDBC(Java DataBase Connectivity)

  • Java에서 DBMS와 연동하기 위한 저수준API.
  • java.sql 패키지에서 관련 인터페이스, 클래스를 제공한다.
  • Driver loading방식. (Driver만 제공되면 모든 DBMS와 연동할 수 있다.)
    • Driver : DB Vendor사에서 제공하는 bytecode.
    • DB server에 접속하기위한 DB client를 bytecode로 제작한 것.
    • Drivers는 .jar로 배포된다.
    • Java에는 Window OS용 JDBC-ODBC Bridge Diver만 제공.
    • Driver 종류는 4가지 Type이 있다.
  • drive type
    • type 1 : JDBC-ODBC Bridge Diver
      • Windows에서만 사용할 수 있는 Driver.DBMS와의 연동은 Os에서 설정하고,
        Java에서 연결하여 사용하는 방식, 속도가 느리다.
      • Java는 Windws에서 서비스되는 일이 많지 않기 때문에 거의 사용하지 않는다.
    • type 2 : native diver
      • Driver를 제작한 언어가 Java와는 다른 언어로된 driver
      • Driver를 사용하기 위해서 별도의 프로그램을 설치해야 한다.
      • Middleware에서 주로 사용
    • type 3 : network protocol driver
      • applet에서 DBBMS와 연동하기 위한 driver.(빠른성능과 안정성을 제공)
      • driver를 제작한 언어가 java언어이므로, diver를 사용하는 자바프로그램에서는
        데이터를 주고 받을 때 문제가 거의 발생하지 않는 방식.
    • type 4 : native protocol driver
      • JDBC에서 가장 많이 사용하는 driver.(빠른 성능과 안정성을 제공)
      • driver를 제작한 언어가 java언어이므로, driver를 사용하는 자바프로그램에서는
        데이터를 주고 받을 때 문제가 거의 발생하지 않는 방식.

JDBC 코딩에 사용되는 객체

  • java.lang.Class : 배포된 jar내 특정 클래스를 객체화하여 JVM에 instance를 생성하는 일.
    • 특정 클래스 : 드라이버 -> DB Client
  • java.sql.DriverManager : 로딩된 드라이버를 사용하여 DB연결을 얻는 일.
  • java.sql.Connection : DBMS와 연결을 유지, transaction을 처리, 쿼리문 생성객체를 얻는 일.
  • java.sql.Statement : 쿼리문을 실행할 때 마다 생성하여 처리하는 객체.
  • java.sql.PreparedStatement : 쿼리문을 미리 생성하고, 값만 나중에 넣어서 처리하는 객체.
  • java.sql.CallableStatement : Procedure를 호출할 때 사용하는 객체
  • java.sql.ResultSet : SQL 쿼리의 실행 결과 또는 뷰(View)의 결과를 나타내는 객체.
  • java.sql.ResultSetMetaData : 실행된 조회 쿼리문에 사용된 테이블의 메타데이터를 얻는 일.
    • 메타데이터 : 컬럼정보 ( 컬럼명, 데이터형, 크기)
  • java.sql.Types : 데이터베이스의 데이터 유형을 정의하는 상수들을 제공하는 객체.
  • java.sql.Clob : clob데이터형을 저장하기 위한 객체.

JDBC 코딩 순서.

  1. 드라이버 로딩
  2. DB연결 얻기
  3. 쿼리문 생성객체
  4. 쿼리문 수행 후 결과 얻기
  5. 연결끊기

DBMS와 JVM 연결

  1. 드라이버(자바언어로 구현된 DB Client)로딩
    //Class.forName("드라이버 클래스");
    Class.forName(Oracle.jdbc.OracleDriver);
  • OracleDriver.class 드라이버 인식
    • 이클립스 : build path 설정
    • DOS : classpath 설정
  1. 로딩된 드라이버를 사용하여 커넥션 얻기.
    String url = "DBMS에 접속하기위한 URL";
    String id = "계정명";
    String pass = "비번";
    Connection con = DriverManager.getConnection(url,id,pass);

query문 생성객체

  • Statement, PreparedStatement, CallableStatement 객체를 제공.
    • CallableStatement :
    • Statement
      • Connection 객체의 createStatement()를 사용하여 객체를 얻는다.
        Statement stmt = con.createStatement();// 쿼리문의 정보가 없다.
      • 얻어진 객체는 SQL문을 알지 못한다.
      • 쿼리문을 실행할때 마다 새로 생성하고 실행한다
      • 동일 쿼리문이 여러 번 실행 될때에는 효율이 좋지 않다.
      • SQLinjection공격에 취약하다.
    • PreparedStatement
      • Connection 객체의 preparedStatement()를 사용하여 객체를 얻는다.
        PreparedStatement pstmt = con.PreparedStatement("select,,,,");
        // 쿼리문의 정보가 존재한다.
      • 얻어진 객체는 SQL문을 안다.
      • 쿼리문을 한번만 생성하고, 값은 bind변수(?)에 넣어 실행한다. pstmt.executeXxx();
        동일 쿼리문이 여러 번 실행 될 때 효율이 좋다.
      • Bind변수를 사용 (쿼리문의 특정위치에 값을 묶어주는 변수)
      • SQLinajection공격에 안전하다.
    • CallableStatement
      • Connection 객체의 prepareCall()를 사용하여 객체를 얻는다.
        CallableStatement cstmt = con.prepareCall()(String 프로시저명);
        - Procedure를 실행하기 위해 만들어진 객체.
      • bind변수를 사용할 수 있다.
      • SQL문은 DB 프로시저에 작성하고, 자바에서는 프로시저를 호출하여 사용하기 때문에 코드 와 SQL문이 분리 될 수 있다.

Statement 사용법

  • DBMS를 변경하는 쿼리문
    • boolean flag = stmt.execute(쿼리문);
      • create, drop, alter, grant, revoke, truncate
      • 잘 만들어지면 false // 그렇지 않으면 예외발생
    • int cnt = stmt.executeUpdate(쿼리문);
      • insert : 입력성공 or 에러
      • delete : 삭제되거나 하나도 삭제되지 않거나.
      • update : 변경되거나 하나도 변경되지 않거나.
  • DBMS를 변경하지 않는 쿼리문
    • ResultSet rs = stmt.executeQuery(쿼리문);
      • select
  1. 쿼리문 생성객체 얻기

    Statement stmt = con.createStatement();
  2. 쿼리문 실행 (값과 쿼리문이 하나로 합쳐진다. '처리가 불편하다.)

    String name = "김동섭";
    
    StringBuilder sb = new StringBuilder();
    sb.append("insert into 테이블명(컬럼명) values('").append(name).append("')")
    //' 붙이는거 주의!
    
    boolean flag = stmt.execute(쿼리문);
    int cnt = stmt.executeUpdate(쿼리문);
    ResultSet rs = stmt.executeQuery(쿼리문);
    • DAO (DAta Access Object)
      • DB작업을 구현하는 클래스
      • method명에 쿼리문을 넣어서 실행하는 쿼리문을 호출하는 곳에서 알 수 있도록 method 를 작성
    • Run 은 DAO를 사용하는 클래스
      • DB작업을 사용..
      • Method명은 업무로직의 이름으로 설정한다.
    • CRUD
      • C : CREATE
      • R : READ
      • U : UPDATE
      • D : DELETE

0개의 댓글