JDBC(Java Database Connectivity)

개굴이·2023년 9월 12일
0

SQL/JDBC

목록 보기
2/4
post-thumbnail

환경설정

mysql-connector 다운로드
다운로드 링크
jar파일 추가

JDBC 드라이버

JDBC 의 경우 대부분의 API 가 인터페이스이다.
Connection, Statement, ResultSet, PreparedStatement

대부분의 JDBC 프로그램에서는 위의 API 들에서 제공되는 메서드를 호출해야 한다.
Connection : createStatement(), getMetaData()
Statement : executeQuery(), executeUpdate()
ResultSet : next(), getXXX()

이 API 들의 객체를 생성하기 위해서는 이 API 들을 상속하여 구현하고 있는 자식 클래스가 필요한데 그 자식 클래스들을 JDBC 드라이버가 제공한다. JDBC 드라이버라는 것은 JDBC 에서 인터페이스로 설계되어 있는 API들의 자식 클래스들을 제공하는 프로그램이라고 할 수 있다.

JDBC

Java 프로그램에서 DB 서버를 접속하여 데이터를 처리하는 기능을 구현하고자 할 때 사용되는 Java 기술

JDBC 기술의 구성
JDBC API (java.sql, javax.sql) -> 공통적(모든 DB 서버에 대해)
JDBC Driver -> DB 서버마다 달라진다

주요 JDBC API

인터페이스
Connection, Statement, PreparedStatement, ResultSet, DatabaseMetaData, ResultSetMetaData

클래스
DriverManager, Date, Time, Timestamp

jdbc 이미지

데이터 읽기

데이터 읽기 이미지

ex)

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

public class JDBCDemo {
    public static void main(String[] args) {
        Connection connection = null;

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

            // 데이터베이스 연결 설정
            String url = "jdbc:mysql://localhost:3306/mydb";
            String username = "username";
            String password = "password";
            connection = DriverManager.getConnection(url, username, password);

            // SQL 쿼리 실행
            Statement statement = connection.createStatement();
            String sql = "SELECT * FROM employees";
            ResultSet resultSet = statement.executeQuery(sql);

            // 결과 집합 처리
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                double salary = resultSet.getDouble("salary");
                System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {// 리소스 정리
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connection != null) connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
  1. Driver 로드
    DriverManager로 어떤 DB를 사용할 것인지 드라이버를 로드한다.
Class.forName("com.mysql.cj.jdbc.Driver");

각 DB마다 고유의 드라이버 이름이 있다.

  1. Connection 얻기
    DB를 결정 후, 연결을 위해 연결 정보(DB 서버 url, ID, PW등)를 입력한다.
String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=UTC";
String username = "username";
String password = "password";
connection = DriverManager.getConnection(url, username, password);

*jdbc url
jdbc:mysql://[hostname][:port]/dbname[?param1=value1][&param2=value2]...

  1. Statement 객체 생성
    DB 서버에 SQL 명령을 전달하여 실행시키기 위한 객체를 생성한다.
Statement statement = conn.createStatement();
  1. SELECT 명령을 실행하고 실행 결과를 ResultSet에 담기
    SELECT 명령을 실행한 결과는 JDBC 드라이버가 ResultSet이라는 객체로 반환한다.
ResultSet resultSet = statement .excuteQuery("SELECT * FROM employees");

executeQuery()

SELECT 쿼리를 실행할 때 사용된다. executeQuery() 메서드는 ResultSet 객체를 반환한다. 이 ResultSet 객체에는 쿼리 결과 집합이 포함되며, SQL 쿼리의 실행 결과가 빈 결과 집합인 경우 ResultSet 객체가 생성되지만 데이터가 없으므로 next() 메서드 호출 시에 false를 반환한다. 이것은 ResultSet가 비어 있다는 것을 나타낸다.

executeUpdate()

SELECT가 아닌 INSERT, UPDATE, DELETE 등의 데이터 변경 쿼리를 실행할 때 사용된다. executeUpdate() 메서드는 실행된 쿼리로 영향을 받은 레코드 수(int)를 반환한다.

쿼리RETURN값
INSERT1
DELETE삭제된 행의 갯수
UPDATE수정된 행의 갯수
DDL0
  1. ResultSet 객체에서 데이터 꺼내오기
while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                double salary = resultSet.getDouble("salary");
                System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
}

ResultSet은 Query의 실행 결과를 담는 객체로서 최초에는 결과 집합에서 0번째 줄을 가리키고 있다. 때문에 다음 줄을 가리키기 위해서는 next() 메서드를 수행한다.

  1. 커넥션 반환하기
    반환 작업은 사용했던 객체를 역순으로 닫는다.
resultSet.close();
statement.close();
connection.close();

getXXX() 메서드

ResultSet resultSet = statement.executeQuery("SELECT id, name, age FROM employees");

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    int age = resultSet.getInt("age");
    //또는 아래와 같이 인덱스를 사용할 수 있다.
    int id = resultSet.getInt(1); // 첫 번째 컬럼의 데이터 (id)
    String name = resultSet.getString(2); // 두 번째 컬럼의 데이터 (name)
    int age = resultSet.getInt(3); // 세 번째 컬럼의 데이터 (age)
}

getXXX() 메서드 이미지

x는 사용할 수 있다, x는 최적을 의미

테이블 생성 (CREATE TABLE)

데이터베이스에서 테이블을 생성하려면 SQL CREATE TABLE 문을 사용해야 한다.

  1. JDBC 드라이버를 로드한다.
  2. 데이터베이스 연결을 설정한다.
  3. Statement 객체를 생성한다.
  4. SQL CREATE TABLE 문을 작성한다.
  5. executeUpdate 메서드를 사용하여 SQL 문을 실행한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class CreateTableExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String username = "username";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(rl, username, password);
             Statement statement = connection.createStatement()) {

            String createTableSQL = "CREATE TABLE employees ("
                    + "id INT AUTO_INCREMENT PRIMARY KEY,"
                    + "first_name VARCHAR(255) NOT NULL,"
                    + "last_name VARCHAR(255) NOT NULL,"
                    + "age INT)";

            statement.executeUpdate(createTableSQL);
            System.out.println("Table 'employees' created successfully.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

테이블 삭제 (DROP TABLE)

테이블을 삭제하려면 SQL DROP TABLE 문을 사용한다.

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

public class DropTableExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String username = "username";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement()) {

            String dropTableSQL = "DROP TABLE employees";

            statement.executeUpdate(dropTableSQL);
            System.out.println("Table 'employees' dropped successfully.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

INSERT

INSERT 문은 데이터베이스 테이블에 새로운 레코드를 삽입하기 위해 사용된다.
INSERT INTO 테이블명 (열1, 열2, ...) VALUES (값1, 값2, ...);

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

public class InsertDataExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String username = "username";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            String insertSql = "INSERT INTO employees (first_name, last_name, age) VALUES (?, ?, ?)";
            
            // PreparedStatement를 사용하여 SQL 인젝션을 방지합니다.
            PreparedStatement preparedStatement = connection.prepareStatement(insertSql);
            
            // 삽입할 데이터 값 지정
            preparedStatement.setString(1, "John");
            preparedStatement.setString(2, "Doe");
            preparedStatement.setInt(3, 30);
            
            // SQL 문 실행
            preparedStatement.executeUpdate();
            
            System.out.println("데이터 삽입 완료.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Prepared Statement(준비된 문장)

SQL 쿼리를 미리 컴파일하여 재사용 가능한 형태로 저장하는 방법

String sql = "SQL 쿼리 문장";
PreparedStatement preparedStatement = connection.prepareStatement(sql);

preparedStatement.setString(1, "값1");
preparedStatement.setInt(2, 42);

// SQL 실행
int result = preparedStatement.executeUpdate();

prepared statement 이미지

DELETE/UPDATE

DELETE문은 데이터베이스 테이블에서 특정 레코드를 삭제할 때 사용된다. DELETE 문은 테이블의 특정 조건을 만족하는 행을 삭제한다.
DELETE FROM 테이블명 WHERE 조건;
UPDATE 문은 데이터베이스 테이블에서 특정 레코드의 값을 수정할 때 사용된다. UPDATE 문은 테이블의 특정 조건을 만족하는 행의 값을 업데이트한다.
UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2,... WHERE 조건;

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

public class DeleteAndUpdateExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb"; // 데이터베이스 URL
        String username = "username"; // 사용자 이름
        String password = "password"; // 암호

        try (Connection connection = DriverManager.getConnection(url, username, password);
             Statement statement = connection.createStatement()) {
            
            // DELETE 문
            String deleteSql = "DELETE FROM employees WHERE employee_id = 101";
            int rowsDeleted = statement.executeUpdate(deleteSql);
            
            if (rowsDeleted > 0) {
                System.out.println(rowsDeleted + " 행이 삭제되었습니다.");
            } else {
                System.out.println("삭제할 행을 찾을 수 없습니다.");
            }
            
            // UPDATE 문
            String updateSql = "UPDATE employees SET age = 31 WHERE employee_id = 102";
            int rowsUpdated = statement.executeUpdate(updateSql);
            
            if (rowsUpdated > 0) {
                System.out.println(rowsUpdated + " 행이 업데이트되었습니다.");
            } else {
                System.out.println("업데이트할 행을 찾을 수 없습니다.");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

0개의 댓글