[신세계I&C KDT][Java 프로그래밍] #16 JDBC (0403)

박현아·2024년 4월 3일
0

신세계아이앤씨 KDT

목록 보기
20/42

1. JDBC (Java Database Connectivity)

1) 개요

  • 자바와 DB를 연동하는 자바 기술

2) 특징

  • JDBC는 DBMS 종
  • DBMS 종류와 독립적이다 (단 DBMS 벤더가 JDBC를 지원해야됨)
  • DBMS 벤더는 사용자가 만든 자바 어플리케이션과 DBMS의 연동을 위해 클래스파일 (*.jar 압축)을 제공한다
  • jar 파일을 '드라이버 (driver)라고 부른다

3) MySQL 연동 위한 환경설정

(1) MySQL 드라이버 다운로드
https://dev.mysql.com/downloads/connector/j/ > platform independent > zip 다운 > mysql-connector-j-8.3.0 (mysql 드라이버)
(2) Eclipse에서 jar 파일 인식하도록 설정

  • build path 한다고 한다
  • 프로젝트 선택 > build path > configure build path > libraries > classpath > add external jars > mysql-connector-j-8.3.0.jar 선택

2. JDBC 자바 코드

  • compile checked exception 계열 (비런타임 계열)
    -> 무조건 예외 처리 해줘야됨 (try~catch 필수)
  • java.sql 패키지 사용됨

1) mysql 접속 정보

String driver ="com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/testdb";
String userid = "root";
String passwd = "1234";

cf) Oracle 접속 정보
String driver ="oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:3306:서비스명";
String userid = "system | sys";
String passwd = "1234";

2) 드라이버 로딩

: com.mysql.cj.jdbc.Driver 클래스를 객체 생성한다는 의미
: new 사용 안 함
Class.forName(driver);

3) Connecion 연결

Connection con = DriverManager.getConnection(url, userid, passwd);

4) sql 작성

String sql = "select deptno as no, dname, loc from dept";

5) PreparedStatement 얻기

: sql문 전송 담당 객체
PreparedStatement pstmt = con.prepareStatement(String sql);

6) sql문 전송

  • select문
    -> 결과를 테이블 형태로 받음
    테이블 객체화 한 것이 ResultSet
    ResultSet rs = pstmt.executeQuery();

  • DML (insert, delete, update)
    -> 결과를 정수형(영향받은 행 개수)으로 받음
    int n = pstmt.executeUpdate(); // insert, delete, update

7) ResultSet에서 컬럼값 얻기

while (rs.next()) { } // 행 선택
// 열 선택
int deptno = rs.getInt("no"); // 컬럼헤더 | 위치 (1부터)
int deptno = rs.getInt(1);

String dname = rs.getString("dname"); // 위치 2
String loc = rs.getString("loc"); // 위치 3

8) close()

DBMS는 외부자원이기 때문에 항상 close() 해줘야 한다

  • 사용 순서
    Connection con
    PreparedStatement pstmt
    ResutlSet rs

  • close()는 사용 역순
    rs.close();
    pstmt.close();
    con.close();

3. sql 문에 실제 데이터 설정하는 방법

1) 용도

  • INSERT
  • DELETE
  • UPDATE
  • SELECT

2) select 문에서 설정 예

select *
from
where deptno = 실제값;

String sql = "select deptno as no, dname, loc from dept
where deptno = ? or dname = ?";

PreparedStatement pstmt = con.prepareStatement(sql);

// ? 대신에 실제값을지정 (?을 바인딩 변수라고 부른다)
// pstmt.setXXX (? 순서, 값);

pstmt.setInt(1, 10);
pstmt.setString(2, "개발");

ResultSet rs = pstmt.executeQuery();
rs.getXXX();

4. JDBC 기능 분리하기

  • DeptDAO에서 얻은 결과값을 DeptMain에 전달하는 작업을 추가하자
    하나의 행을 저장하는 클래스를 작성한다
    ==> DeptDTO.java

1) 패턴
(1) DAO 패턴

  • Data Access Object 패턴
  • 데이터 (DB,파일등)에 접근시 전담하는 클래스

(2) DTO 패턴

  • Data Transfer Object 패턴
  • 일반적으로 테이블당 하나씩 작성해서 테이블의 하나의 레코드를 저장하는 용도로 사용됨
    예> dept테이블 : DeptDTO.java
    emp테이블 : EmpDTO.java

5. 트랜잭션 처리

: DeptServiceImpl 클래스에서 처리한다 (Connection이 필요하기 때문)

@Override
public int insertDelete(DeptDTO dto, int deptno) throws DuplicatedDeptnoException{
				
				int n =0;
				Connection con = null;

				try {
					con = DriverManager.getConnection(url, userid, passwd);
				
					// DeptDAO  연동
					DeptDAO dao = new DeptDAO();
					
                    // 트랜잭션 처리
					con.setAutoCommit(false);
					dao.insert(con, dto);
					dao.delete(con, deptno);
					con.commit();
					
				} catch (SQLException e) {
					try {
						con.rollback();
					} catch (SQLException e1) {
						e1.printStackTrace();
					}
				} finally {
					try {
						if(con!=null) con.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
			}
				
				return n;

			}
            ```

0개의 댓글