Joslynn의 하루

MSA Full-Stack 개발자 양성 과정 -27일차 노트 필기_JDBC API_220829 본문

MSA Full-Stack 개발자 양성과정/Java

MSA Full-Stack 개발자 양성 과정 -27일차 노트 필기_JDBC API_220829

Joslynn 2022. 8. 30. 21:31

JDBC API

: java와 database를 연동해주는 api(이미 다 만들어서 lib형태로 제공)

: import java sql.*;

: JDBC는 SQLException 예외 처리가 필수이다. - 체크예외종류 

- 연동순서!!

1) 로드: 연결하려는 DB를 선택(이 때, 반드시 DB에 해당하는 드라이버 라이브러리가 필요하다. = ~.jar 파일)

              Class.forName(“연결하고자하는DB드라이버클래스이름”);

            : 만약, 드라이버명이 틀리거나 라이브러리가 없으면 ClassNotFoundException 발생

              Oracle : oracle.jdbc.driver.OracleDriver
              Ms_Sql : sun.jdbc.odbc.JdbcOdbcDriver
              My_Sql : org.git.mm.mysql.Driver

 

2) 연결: 로드된 DB에 접속하는 과정 = 계정 접속

              Connection con = DriverManager.getConnection(String JDBCurl, String user, String pass);

              Oracle : jdbc:oracle:thin:@localhost:1521:ORCL
              Ms_Sql : jdbc:odbc:odbc설정을통해만든db원본명
              My_Sql : jdbc:mysql://localhost:3306/db명

             

3) 실행: DDL, DML, DQL에 해당하는 쿼리를 실행하는 과정

              1) Statement 방식

                    Statement st = con.createStatement();

 

                      1.  DDL, DML 문장인 경우

                        int result = st.executeUpdate(String sql); 

                        : 인수로 전달된 쿼리의 결과가 성공여부인 int로 리턴된다.

                        : 인수로 전달된 쿼리문장에 오류가 있으면 SQLException 발생

                        : 결과가 0이면 적용된 레코드가 없다는 뜻이고, 1이상이면 적용된 레코드가 있다.

    //예시
    int result = st.executeUpdate("delete from copy_emp where deptno=20");

    //사용예시
    if (result==0) System.out.println("삭제되지 않았습니다.");
    else System.out.println("삭제되었습니다.");

 

                      2. DQL 문장인 경우

                        ResultSet rs = st.executeQuery(String sql);

                        : 인수로 전달된 쿼리의 결과가 결과집합으로 리턴

    //예시
    ResultSet rs = st.executeQuery("select empno, ename, job from emp");
    
    // 사용 예시
    while(rs.next()){ // next()는 앞으로 커서를 이동 (이동이 되면 true, 안되면 false 리턴)
    	// 열의 값을 조회
        int empno = rs.getInt(1); // 인수는 열의 순서(index)
        String ename = rs.getString(2);
        String job = rs.getString("job"); // 인수로 컬럼명도 사용 가능
        
        // 자바의 객체에 각 셀의 값을 저장해서 레코드를 자바의 객체로 만든다.
        Emp e = new Emp(empno, ename, job); // 미리 만들어진 emp 클래스
        // 만들어진 객체를 자료구조 list에 넣는다.
        list.add(e);
    }

              2) PreparedStatement 방식 (Statement 상속) - 사용 권장

                  : Statement 객체를 상속

                  : 미리 문장을 준비해놓고, 필요한 값만 별도로 setXxx() 설정

                  : sql Injection 공격을 방어할 수 있는 방식이다. 

 

 

4) 닫기: 사용한 객체를 반납

           : close()를 한다. (Connection, Statement(PreparedStatement), ResultSet 객체를 닫는다.)

           : SQLException 처리 필수

           : finally 블럭에서 한다. - try(){} 문법을 이용하면 try 블럭을 빠져나올때, 자동 close

           PreparedStatement ps = con.prepareStatement(String sql);

                 ex) PreparedStatement ps = con.prepareStatement();

//예시
String sql1 = "select ename from emp";
String sql2 = "insert into emp(empno, ename, job, sal, hiredate) values(?,?,?,?, sysdate)";

PreparedStatement ps = con.prepareStatement(sql);

//?가 있다면 ?의 순서대로 개수만큼 setXxx(순서, 값); 설정을 해야한다.
//* insert 문장을 예로 든다면,
 ps.setInt(1, emp.getEmpno());
 ps.setString(2, emp.getEname());
 ps.setString(3, emp.getJob());
 ps.setInt(4, emp.getSal());
 
 //DB에 쿼리를 전송
 int result = ps.excuteUpdate(); // DDL, DML 문장
 if(result ==0) System.out.println("실패");
 esle System.out.println("성공");
 
 ResultSet rs = ps.excuteQuery(); // DQL(select) 문장
 whiel(rs.next()){
 	// Statement와 동일
 }

 


어떻게 구조화해서 코딩할 것인가?

프로젝트를 세팅할 때, 반드시 오라클라이브러리 빌드패스

JDBC의 Connection은 기본 autocommit 설정되어있다.

  : setAutoCommit(boolean autocommit)를 이용해서 설정한다.

         - autoCommit을 false로 설정하면 반드시 쿼리 실행한 후 commit() or rollback()을 해주어야 DB에 반영된다.

         - 단일행 쿼리에서는 기본설정을 사용하지만 일괄처리 = transaction 처리를 할 때는 반드시 설정을 변경해야 한다.

            ex) 주문하기, 예약하기, 계좌이체....

 

 

**Transaction 처리

: 여러개의 문장을 하나의 단위(Connection)로 묶어서 한번에 일괄처리하는 것

   commit() or rollback() 처리

 

** batch 처리

: 방대한 쿼리를 한번에 실행할 수 있도록 해주는 것

  예를 들어 insert 문장을 100번 실행해야 한다면 결국, executeUpdate()를 DB를 왔다갔다하는 형태로 100번 수행함(느림)

  batch 처리를 하면 100개의 쿼리를 모았두었다가 한번에 접속해서 쿼리를 실행하고 결과를 받아오는 방법

 

 

Comments