[Day 13 | DB] JDBC - Statement 객체와 쿼리 실행

y♡ding·2024년 10월 30일
0

데브코스 TIL

목록 보기
84/163

SQL 쿼리 실행 준비 -Statement 객체 생성

Statement 클래스란?

  • Statement는 SQL 쿼리를 데이터베이스에 전달하고, 그 결과를 반환받는 객체입니다.
  • 데이터베이스와 연결된 Conneciton 객체를 사용하여 Statement 객체를 생성할 수 있습니다.
  • Statement는 데이터 조작(SQL 실행)과 데이터 정의(테이블 생성 등)를 수행하는 데 사용됩니다.
  • Connection.createStatement() 메서드를 통해 생성됩니다.
  • 주로 정적 SQL 쿼리에 사용되며, INSERT, UPDATE, DELETE, SELECT 등의 쿼리를 실행합니다.
  • 주요 메서드
    • executeQuery()- SELECT 쿼리를 실행하고 결과고 ResultSet을 반환합니다.
    • executeUpdate()- INSERT, UPDATE, DELETE 쿼리를 실행하고 영향을 받은 행 수를 반환합니다.

예제 1

package com.exam;

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

public class StatementEx01 {
    public static void main(String[] args) {
        System.out.println("시작");

        String url = "jdbc:mariadb://localhost:3306/sample";
        String user = "root";
        String password = "123456";

        Connection conn = null;
        Statement stmt = null;

        try {
        	// JDBC 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
            System.out.println("드라이버 로딩 성공");
			
            // 데이터베이스에 연결
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("데이터베이스 연결 성공");
            
            // Statement 생성
            stmt = conn.createStatement();
            
            // SQL 쿼리 작성 및 실행
            String deptno = "53";
            String dname = "인사부";
            String loc = "대잔";
            
            String sql = String.format("insert into dept2 values (%s, '%s', '%s');", deptno, dname, loc);
            int rowsAffected = stmt.executeUpdate(sql); // 쿼리 실행

            System.out.println("쿼리 실행 성공", 영향 받은 행 수: + rowsAffected);

        } catch (ClassNotFoundException e) {
            System.out.println("[에러] 드라이버 로딩 실패: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("[에러] SQL 실행 오류: " + e.getMessage());
        } finally {
            if (conn != null) { try { conn.close(); } catch (SQLException e) {}}
            if (stmt != null) { try { stmt.close(); } catch (SQLException e) {}}
        }

        System.out.println("끝");
    }
}
  1. 드라이버 로드와 데이터베이스 연결:
    앞에서 배운 내용과 동일하게 MariaDB 드라이버를 로드하고 데이터베이스에 연결합니다.
  2. Statement 객체 생성: stmt = conn.createStatement();
    1. 데이터베이스와 연결된 Connection 객체를 사용하여 Statement 객체를 생성합니다.
    2. 이 객체를 통해 SQL 쿼리를 데이터베이스로 전달할 수 있습니다.
  3. SQL 쿼리 작성 및 실행:
    1. String sql = "INSERT INTO dept2 VALUES (53, '연구부', '대전')";
      • 삽입할 데이터를 포함한 INSERT SQL 쿼리를 작성합니다.
      • 이 예제에서는 dept2 테이블에 새로운 부서 데이터를 추가하는 쿼리입니다.
    2. int rowsAffected = stmt.executeUpdate(sql);
      • executeUpdate() 메서드는 SQL 명령(삽입, 업데이트, 삭제)을 실행하고, 영향받은 행(row)의 개수를 반환합니다.
      • 데이터 조작 언어(DML) 명령어(INSERT, UPDATE, DELETE)는 executeUpdate() 메서드를 사용해 실행하며, 쿼리 실행이 성공하면 영향을 받은 행 수가 반환됩니다.
  4. Statement 객체 및 Connection 객체 닫기:
    1. 쿼리 실행 후, finally 블록에서 StatementConnection 객체를 닫아 리소스를 해제합니다.
    2. 메모리 누수를 방지하고, 데이터베이스 리소스를 효율적으로 사용할 수 있도록 도와줍니다.

예제 2

Statement 객체를 사용하여 데이터베이스의 데이터를 수정(UPDATE)하거나 삭제(DELETE) 합니다.

package com.exam;

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

public class StatementEx02 {
    public static void main(String[] args) {
        System.out.println("시작");

        String url = "jdbc:mariadb://localhost:3306/sample";
        String user = "root";
        String password = "!123456";

        Connection conn = null;
        Statement stmt = null;

        try {
            // MariaDB JDBC 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
            System.out.println("드라이버 로딩 성공");

            // 데이터베이스에 연결
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("데이터베이스 연결 성공");

            // Statement 객체 생성
            stmt = conn.createStatement();

            // SQL 쿼리 작성 - 데이터 업데이트 또는 삭제
            // String sql = String.format("update dept2 set loc='%s' where deptno=%s", "광주", 53); // 데이터 수정 쿼리 예시
            String sql = String.format("delete from dept2 where deptno=%s", 53); // 데이터 삭제 쿼리 예시

            // SQL 실행 - update / delete
            int result = stmt.executeUpdate(sql);

            System.out.println("쿼리 실행 성공 : " + result);

        } catch (ClassNotFoundException e) {
            System.out.println("[에러] 드라이버 로딩 실패: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("[에러] SQL 실행 오류: " + e.getMessage());
        } finally {
            if (stmt != null) { try { stmt.close(); } catch (SQLException e) {} }
            if (conn != null) { try { conn.close(); } catch (SQLException e) {} }
        }

        System.out.println("끝");
    }
}
  1. 드라이버 로드와 데이터베이스 연결:
  2. Statement 객체 생성:
  3. SQL 쿼리 작성:
    1. 업데이트 쿼리: String sql = String.format("update dept2 set loc='%s' where deptno=%s", "광주", 53);
      • 이 쿼리는 dept2 테이블의 deptno가 53인 행의 loc 값을 "광주"로 업데이트합니다.
      • String.format() 메서드를 사용해 파라미터(광주, 53)를 쿼리에 삽입했습니다.
      • 이 줄은 주석 처리되어 있으므로, 필요에 따라 주석을 해제하여 실행할 수 있습니다.
    2. 삭제 쿼리: String sql = String.format("delete from dept2 where deptno=%s", 53);
      • 이 쿼리는 dept2 테이블에서 deptno가 53인 행을 삭제합니다.
      • 역시 String.format()을 사용하여 동적으로 쿼리를 구성했습니다.
      • 현재는 이 쿼리가 실행되도록 설정되어 있습니다.
  4. SQL 실행:
    1. int result = stmt.executeUpdate(sql);
      • executeUpdate() 메서드는 데이터 변경(업데이트, 삭제 등) 작업에 사용되며, 영향을 받은 행(row)의 수를 반환합니다.
      • 쿼리가 성공적으로 실행되면 result 변수에 영향을 받은 행의 수가 저장됩니다. 예를 들어, 삭제가 성공하여 한 행이 영향을 받으면 result의 값은 1이 됩니다.
  5. 예외 처리 및 연결 해제

예제 3 : 테이블 구조 변경 - DDL (Data Definition Language) 사용

  • DDL을 실행할 때도 Statement 객체의 executeUpdate() 메서드를 사용하여 쿼리를 전달합니다.
// StringBuilder
package com.exam;

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

public class StatementEx03 {
    public static void main(String[] args) {
        System.out.println("시작");

        String url = "jdbc:mariadb://localhost:3306/sample";
        String user = "root";
        String password = "123456";

        Connection conn = null;
        Statement stmt = null;

        try {
	        // JDBC 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
            System.out.println("드라이버 로딩 성공");

			// 데이터베이스에 연결
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("데이터베이스 연결 성공");

			// Statement 객체 생성
            stmt = conn.createStatement();

            // DDL 쿼리 작성 - 테이블 생성
            StringBuilder sb = new StringBuilder();
            sb.append("create table dept4 (");
            sb.append("deptno int(2),");
            sb.append("dname varchar(14),");
            sb.append("loc varchar(13)");
            sb.append(")");

            int result = stmt.executeUpdate(sb.toString()); // 쿼리 실행

            System.out.println("쿼리 실행 성공, 반환 값: " + result);
        } catch (ClassNotFoundException e) {
            System.out.println("[에러] 드라이버 로딩 실패: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("[에러] SQL 실행 오류: " + e.getMessage());
        } finally {
            if (conn != null) { try { conn.close(); } catch (SQLException e) {}}
            if (stmt != null) { try { stmt.close(); } catch (SQLException e) {}}
        }

        System.out.println("끝");
    }
}
  1. DDL 쿼리 작성:

    1. String sql = "CREATE TABLE dept4 (deptno INT(2), dname VARCHAR(14), loc VARCHAR(13))";
    2. CREATE TABLE 명령을 통해 dept4라는 이름의 새로운 테이블을 생성합니다.
      • deptno: 부서 번호를 저장하는 정수형 필드.
      • dname: 부서 이름을 저장하는 가변 길이 문자열 필드.
      • loc: 부서 위치를 저장하는 가변 길이 문자열 필드.
    3. 이와 같은 DDL 명령은 데이터베이스 구조를 정의하고 설정하는 데 사용됩니다.

    2. SQL 실행:

    1. int result = stmt.executeUpdate(sql);
    2. executeUpdate() 메서드를 통해 CREATE TABLE 쿼리를 실행합니다.
    3. 일반적으로 DDL 명령은 영향을 받은 행의 개수가 없으므로 result 값은 보통 0이 반환됩니다. 반환 값은 테이블 생성이 성공했는지를 판단하는 데 큰 의미는 없습니다.

0개의 댓글

관련 채용 정보