코코무의 코딩캔버스

[JDBC] JDBC 사용을 위한 코드 작성 방법 본문

JDBC

[JDBC] JDBC 사용을 위한 코드 작성 방법

코코무 2024. 1. 16. 12:59

자바와 데이터베이스 또는 JSP와 데이터베이스가 연동되기 위해서는 단계를 거쳐 접속과 해제를 진행해야 한다.

일반적으로 JDBC를 이용하는 프로그램을 작성하려면 5단계의 과정으로 작성한다.

java 파일과 jsp 파일에서 사용 가능하다. 하지만 jsp에서 사용하는 것은 공부할 때 배우고 넘어가는 MVC1 모델 방식이다.

 

1단계: JDBC 드라이버 로드

프로그램에서 데이터베이스에 연결하기 위해서는 데이터베이스별 제조사(Vendor)가 제공하는 드라이버가 필요하다.

드라이버를 설정하는 방법은 다음과 같다.

Class.forName("드라이버명");

데이터베이스 종류별로 드라이버명이 다르다.

드라이버 소환술이다.

 

- 드라이버 종류

종류 사용 방법
Access(ODBC) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
MS-SQL Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")
Oracle Class.forName("oracle.jdbc.driver.OracleDriver");
MySQL Class.forName("com.mysql.jdbc.Driver")

 

 

2단계: 데이터베이스 연결 객체 생성

1단계에서 사용할 드라이버를 설정했다면 2단계에서는 Connection 클래스로 연결 객체를 생성해야 한다.

작성 방법은 다음과 같다.

Connection 객체

Connection conn = null;
try {
	Class.forName("드라이버명");
    conn = DriverManager.getConnection("URL", "USER명", "패스워드");
    // 쿼리문 관련 코드 삽입
} catch (ClassNotFoundException e) {
	e.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
}

url, user, password는 DB 관리 도구에서 DBMS와 연결할 때 설정되는 정보를 사용한다.

 

-  데이터베이스별 URL

종류 사용 방법
Access(ODBC) jdbc:odbc:ODBC명
MS-SQL jdbc:mysql://localhost:3306/DB명
Oracle jdbc:oracle://localhost:1521:SID
MySQL jdbc:Microsoft:sqlserver://localhost:1433:databasename=DB명

 

 

3단계: SQL문 실행

프로그램에서 데이터베이스에 쿼리문을 전송하고 결괏값을 반환하는 단계이다.

Statement 객체 또는 PreparedStatement 객체를 이용하여 SQL 구문을 전송할 수 있다.

선택문 executeQuery(); : ResultSet → select
변환문 executeUpdate(); : int → insert, update, delete, create

DB 관리 도구의 실행(alt+x)같은 것이라고 여기면 된다.

 

1. Statement 객체의 작성 방법

Statement 객체

Statement stmt = null;
stmt = conn.createStatement();
String sql = "SQL구문 작성";
int n = stmt.executeUpdate(sql);

 1) stmt = conn.createStatement()는 데이터베이스로 SQL문을 보내기 위한 연결 객체를 만든다.

 2) 연결 객체가 완성되었으면 stmt.executeUpdate(sql)를 이용해서 데이터베이스에 쿼리문을 전송한다.

 3) 처리에 따른 결괏값을 반환 받는다(이때 반환받을 객체(또는 변수)는 ResultSet 또는 int).

 4) Statement는 쿼리문 사이사이에 데이터를 연결해서 작성한다. Statement는 보안에 취약하다는 단점을 가지고 있다.

 

2. Statement의 SQL구문 작성 방법

String sql = 
"insert into book(isbn, title, author, price) values(101, 'HTML5', '강둘리', 25000)";

String sql =
"insert into book(isbn, title, author, price) values("+ a +",'"+ b +"','"+ c + "'," + d + ")";

 

3. PreparedStatement 객체의 작성 방법

PreparedStatement 객체

PreparedStatement pstmt = null;
String sql = "SQL구문 작성";
pstmt = conn.preparedStatement(sql);
pstmt.setString(index번호, 데이터);
pstmt.setString(index번호, 데이터);
pstmt.setString(index번호, 데이터);
int n = pstmt.executeUpdate();

 

4. PreparedStatement의 SQL구문 작성 방법

String sql =
"insert into book(isbn, title, author, price) values(101, 'HTML5', '강둘리', 25000");

String sql = 
"insert into book(isbn, title, author, price) values(?,?,?,?)";

pstmt.setInt(1,a); // a = 101
pstmt.setString(2,b); // b = "HTML5"
pstmt.setString(3,c); // c = "강둘리"
pstmt.setInt(4,d); // d = 25000

a는 ISBN, b는 TITLE, c는 AUTHOR, d는 PRICE

 

4단계: 결과 반환

ResultSet 객체와 int

ResultSet rs = stmt.executeQuery();
int n = stmt.executeUpdate();

ResultSet rs = executeQuery()는 select 쿼리문의 결과 집합(테이블)을 가져온다. Cursor의 위치를 이동해서 행(Row)을 가리킨다.

데이터는 getter 메서드를 이용해서 가져온다.

int n = executeUpdate()는 처리된 결과의 개수를 반환한다(입력된 결과의 개수, 수정된 결과의 개수, 삭제된 결과의 개수).

따라서, executeUpdate()는 쿼리문 중 insert, update, delete, create에 적용하는 메서드(select문 제외)이다.

 

5단계: 데이터베이스와 연결 해제

프로그램에서 데이터베이스와 모든 작업이 끝나면 연결을 해제한다.

가장 최근에 열었던 연결부터 순서대로 닫아준다.

rs.close();
stmt.close();
conn.close();

 이렇게 함으로써 리소스 누수를 방지하고, 데이터베이스 성능을 최적화하며, 보안 문제를 최소화한다.


쿼리문 예시

 

1. SELECT

SELECT문을 사용할 때는 ResultSet 객체를 사용한다.

사용할 쿼리문을 담은 PreparedStatement 객체를 실행하기 위해 executeQuery() 메서드를 호출하여 ResultSet 객체에 담는다.

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

public class JDBCSelectExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
        String username = "root"; // 데이터베이스 사용자명
        String password = "password"; // 데이터베이스 비밀번호

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 1. JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 데이터베이스 연결
            conn = DriverManager.getConnection(url, username, password);

            // 3. SQL 쿼리 실행
            String sql = "SELECT id, name, email FROM users WHERE id = ?";
            pstmt = connection.prepareStatement(sql);
            pstmt.setInt(1, 1); // 첫 번째 파라미터로 id 값을 설정 (예: 1)

            rs = preparedStatement.executeQuery();

            // 4. 결과 처리
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");

                System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 5. 리소스 해제
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

결과 처리 부분을 유의깊게 봐야 한다.

 

2. INSERT문

여기서부터는 쿼리문 실행 시 executeQuery() 메서드가 아닌 executeUpdate() 메서드를 사용한다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
        String username = "root"; // 데이터베이스 사용자명
        String password = "password"; // 데이터베이스 비밀번호

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 1. JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 데이터베이스 연결
            connection = DriverManager.getConnection(url, username, password);

            // 3. SQL 쿼리 준비
            String sql = "INSERT INTO PRODUCT (PRODUCT_CD, PRODUCT_NM, PRICE) VALUES (?, ?, ?)";
            preparedStatement = connection.prepareStatement(sql);

            // 4. 파라미터 설정
            preparedStatement.setString(1, "P001"); // 제품 코드
            preparedStatement.setString(2, "Product Name"); // 제품 이름
            preparedStatement.setDouble(3, 100.0); // 제품 가격

            // 5. SQL 쿼리 실행
            int rowsAffected = preparedStatement.executeUpdate();
            System.out.println("Rows affected: " + rowsAffected);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 리소스 해제
            try {
                if (preparedStatement != null) preparedStatement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

3. UPDATE문

UPDATE문에서는 특히 콤마(,) 실수가 많았다. 주의하도록 하자!

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUpdateExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
        String username = "root"; // 데이터베이스 사용자명
        String password = "password"; // 데이터베이스 비밀번호

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 1. JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 데이터베이스 연결
            connection = DriverManager.getConnection(url, username, password);

            // 3. SQL 쿼리 준비
            String sql = "UPDATE PRODUCT SET PRODUCT_NM = ?, PRICE = ? WHERE PRODUCT_CD = ?";
            preparedStatement = connection.prepareStatement(sql);

            // 4. 파라미터 설정
            preparedStatement.setString(1, "Updated Product Name"); // 변경할 제품 이름
            preparedStatement.setDouble(2, 150.0); // 변경할 제품 가격
            preparedStatement.setString(3, "P001"); // 대상 제품 코드

            // 5. SQL 쿼리 실행
            int rowsAffected = preparedStatement.executeUpdate();
            System.out.println("Rows affected: " + rowsAffected);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 리소스 해제
            try {
                if (preparedStatement != null) preparedStatement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

4. DELETE문

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCDeleteExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
        String username = "root"; // 데이터베이스 사용자명
        String password = "password"; // 데이터베이스 비밀번호

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 1. JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 데이터베이스 연결
            connection = DriverManager.getConnection(url, username, password);

            // 3. SQL 쿼리 준비
            String sql = "DELETE FROM PRODUCT WHERE PRODUCT_CD = ?";
            preparedStatement = connection.prepareStatement(sql);

            // 4. 파라미터 설정
            preparedStatement.setString(1, "P001"); // 삭제할 제품 코드

            // 5. SQL 쿼리 실행
            int rowsAffected = preparedStatement.executeUpdate();
            System.out.println("Rows affected: " + rowsAffected);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 리소스 해제
            try {
                if (preparedStatement != null) preparedStatement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}