ㅅㅇ

[JDBC] 개요 & Java - mysql 연동 절차 및 문법 본문

SW_STUDY/JDBC&JPA

[JDBC] 개요 & Java - mysql 연동 절차 및 문법

SO__OS 2022. 8. 10. 20:16

플레이데이터 빅데이터캠프 공부 내용 

[JDBC] 개요 & Java - mysql 연동 절차 및 문법

1. 개요

1. JDBC(Java Database Connectivity)란 ?

 

자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.

JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공

 

(1) db 연동 표준 API

 - 표준의 의미
      - 누군나가 어떤 제품이든 동일
      -  DB 제품과 무관하게 개발자가 누구든 DB 연동 코드는 같은 것. 이는 강제적이며 건들 수 없는 부분.

 

   =>  orcle 에서 API 를 제공 하여, 

         이 API 는 특정 벤더사에 종속적인 코드를 제시하지 않으며,

         오로지 스펙(주석)과 API 이름(상수, 메소드 선언구) 만 제시된 interface 구조로 제공한다.

         실제 구현은 벤더사에 위임하는 것이며, 이는 자바 개발자들에게 편의성을 제공한다.  

             - 상수 - 값 불변인 final 변수 - public static final

             - 미완성 메소드 - abstract 메소드, {} 자체가 없음. - public abstract

               (미완성 로직으로 생성자 자체가 없으므로 상속 관계의 하위 클래스에

                                                                                                              미완성 메소드를 재정의하여 객체 생성해 사용한다.)

            - 주석 (설명 즉 스펙) }

                

   = > db 벤더사가 db에 접속 가능하게 각 회사에 맞게 내부를 구현하는 것.

        친화적인 구조로 설계해서 driver 로 제공함.

 

   = > 자바 개발자가 driver 만 설치한 후 활용하기에 로직에만 집중해서 개발할 수 있다.

 

2. Java - mysql 연동 절차 및 문법

- 예외 처리 필수 !!

      - 연동 시 발생할 모든 에러에 대해 생각하여  

                try - catch 로 구현하여 e.printStackTrace() 받는다.  - > catch (Exception e)

 

      - 모든 예외 발생에서도 반드시 실행되어야 할 close() 접속 해제를 위해 이는 finally 로 작성한다.

           - close 에서 발생할 에러도 고려하여

                       이 또한 try-catch 로 구현하여 e.printStackTrace() 받는다.  - > catch (SQLException e)

 

0. 기본 셋팅

*** Maven mysql JDBC Drivers 사용 MySQL Connector/J

https://mvnrepository.com/artifact/mysql/mysql-connector-java

 

=> maven project 로 진행 할 것이기 때문에 pom.xml 에 해당 dependecy 꼭꼭 추가해주기

 

1. driver 로딩

 

2. Connection 객체 생성 : Connection API(ip,id, pw, database)

   - > 접속 성공

              => 3 ~ 6 단계로 


   - > 접속 실패 - 값들 수정해서 재접속 시도.

                => 예외 처리 필수.


3. Statement 객체 생성

   - 해당 db에 접속된 Connection 객체로부터 sql 문장 실행객체 생성

stmt = conn.createStatement();


4. sql 문장 실행  .executeXxx() 


- DQL(Query(select))  : 검색 구조의 table가 출력
            ex) 실행 문장  -  실행객체.executeQuery("select"){}  

                                 => ResultSet 반환

import java.sql.ResultSet;
ResultSet rset = stmt.executeQuery(sql);

 

- DML(insert/update/delete) : 존재하는 table 내용 수정한 행 수 가 출력
            ex) 실행 문장  -  실행객체.executeUpdate("dml"){}

                                 => int 반환

int i = stmt.executeUpdate(sql);


5. 결과 사용

     -  sql 문장 실행 결과가 무엇인지(몇 개의 row 인지 등,,,) 생각하여 적절하게 코드 작성하여야 한다.

     - 문장에 따라, int 또는 ResultSet 을 반환

     

  1)  DQL(Query(select))  : 검색 구조의 table가 출력 =>  ResultSet 반환

     - resultSet 객체 사용 

            import java.sql.ResultSet;

            ResultSet rset.getXxx(컬럼명 또는 컬럼index) Xxx: 해당 컬럼의 타입 

 

  2) DML(insert/update/delete) : 존재하는 table 내용 수정한 행 수 가 출력

            실행 결과로 실행이 적용된 행 수가 int 값으로 출력된다.

            이를 int 타입 으로 선언된 변수에 받아 내가 실행한 문장의 결과에 맞게 반환된 것을 확인할 수 있다.

// 연동 코드의 한 부분이며, 만약 연동 작업이 제대로 되지 않았다면 false를 반환할 것이다.
int i = pstmt.executeUpdate();
			
if(i == 1) {
	return true;
			}
return false;

 


6. 자원 반환 : 접속 해제  close()

    - (ResultSet) - > Statement - > Connection 순으로 close 하기

        sql 문장에 따라 ResultSet 이 필요없는 경우가 있다.

 

 

** 코드 예시 - 기본적인 문법 설명을 위한 코드이며, 현업에선 아래와 같은 코드를 사용하지 않는다. **

 

package step01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DeptDAO {

	public static void selectAll() {	
		// 가급적 def 값으로 초기화 해주기
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
       		// driver 로딩
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC", "-", "-");

			// 연결 됐는지 확인
			//System.out.println(conn);
			
			// Statement 객체 생성 
			stmt = conn.createStatement();
			
			// sql 문장 실행
			// rset이라는 객체 ResultSet 에 초기화
			// sql 문장 결과는 데이터가 있는 수만큼의 row 들로 이뤄져있다. 이 결과를 사용하기 위해 반복문으로 받으면 됨.
			rset = stmt.executeQuery("select * from dept"); // sql 문자 실행
			
			// 결과 사용 : 컬럼명 또는 컬럼 index 값으로 처리하여 값 받음.
			while(rset.next()) {// 검색된 table의 다음 row 이동하면서 존재 여부 확인 
				//System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
				System.out.println(rset.getInt(1) + " " + rset.getString(2) + " " + rset.getString(3));
			}

		} catch (Exception e) {
			e.printStackTrace();
			
		} finally {//자원 반환
			try {
				if(rset != null) {
				rset.close();
				rset = null;
				}
				if(stmt != null) {
					stmt.close();
					stmt = null;
				}
				if(conn != null) {
					conn.close();
					conn = null;	
				}
			}
			catch (SQLException e) { //close() throws SQLException{} 처리 문장 필수
				e.printStackTrace();
			}
		}
	}
			
	public static void main(String[] args) {
		selectAll();

	}

}

 

3. Java - mysql 연동 절차 - 현업에서는

             1) 중복 코드는 분리하여 Util.java 에 따로 작성되어야 하며,

                            -  driver loading, connection, close

                                         - close 의 경우 DQL 은 ResultSet close() 가 필요하지만, DML 의 경우 필요없기에 

                                            둘을 각각의 메소드로 만들어줌.

             2) db 의 설정 정보는 별도의 properties 파일에 작성되어야 한다.

                            -  db 의 설정 정보 수정으로 코드 재 컴파일, 서버에 재 배포단계를 생략한다.
                            - 보안의 이유로 코드 상에서 db 정보 분리
                            - spring boot & jpa framework들의 설정 정보들로도 사용

 

- DBUtil 예시 - 중복 코드 분리한 코드

/** 1 예시 코드 - 모든 db 연동 클래스의 각각의 메소드들의 공통된 코드를 분리한 코드**/

package Util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	
	/** driver loading **/
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/** connection 
	 * @throws SQLException **/
	public static Connection getConnection() throws SQLException {
		
		return DriverManager.getConnection("jdbc:mysql://localhost/-?characterEncoding=UTF-8&serverTimezone=UTC", "-", "-");		
	}
	
	/** close - DQL **/
	public static void close(Connection conn, Statement stmt, ResultSet rset) {
		try {
			if(rset != null) {
				rset.close();
				rset = null;
			}
			if(stmt != null) {
				stmt.close();
				stmt = null;
			}
			if(conn != null) {
				conn.close();
				conn = null;
			}
		}catch (SQLException e) {  
			e.printStackTrace();
		}
	}
	
	/** close - DML **/
	public static void close(Connection conn, Statement stmt) {
		try {			
			if(stmt != null) {
				stmt.close();
				stmt = null;
			}
			if(conn != null) {
				conn.close();
				conn = null;
			}
		}catch (SQLException e) {  
			e.printStackTrace();
		}
	}
	

}

 

https://github.com/cso6005/JavaReview/tree/master/step03_JDBC

 

GitHub - cso6005/JavaReview

Contribute to cso6005/JavaReview development by creating an account on GitHub.

github.com

 

'SW_STUDY > JDBC&JPA' 카테고리의 다른 글

[JPA] JPA 구현 및 예제  (0) 2022.08.18