본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 43일차 (2023-07-21) 자바 프로그래밍_DBMS_JDBC Driver

by prometedor 2023. 7. 21.
- 자바 프로그래밍
  - JDBC 프로그래밍(com.eomcs.jdbc)
    - JDBC API와 Driver 개념
    - JDBC 드라이버 로딩 원리
    - select/insert/update/delete 프로그래밍

 

build.gradle

ㄴ build.gradle 스크립트 파일에 MariaDB, MySQL, Oracle, MSSQL 각각의 JDBC 드라이버를 추가

ㄴ gradle 재설정 해주기

ㄴ 프로젝트 Refresh 해주기

=>

ㄴ mysql-connector-j-8.0.33.jar 라이브러리가 추가되며 com.mysql 패키지 안의 jdbc 패키지 안에 Driver.class 가 추가됨

=>

ㄴ ojdbc11-21.7.0.0.jar 라이브러리가 추가되며 jdbc 패키지 안에 OracleDriver.class 가 추가됨

=>

ㄴ mariadb-java-client-3.1.2.jar 라이브러리가 추가되며 org.mariadb.jdbc 패키지 안에 Driver.class 가 추가됨

=>

이런식으로 확인하면 됨

 

JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩

jdbc_ex01_Exam0110.java

 DBMS에 연결하기
 => MySQL에 연결을 대행하는 클래스를 사용한다.
 => 이 클래스는 JDBC API 규칙에 따라 작성되었다.
 => 이 클래스는 JDBC Driver 파일(*.jar)에 들어 있다.
 => 이 클래스를 사용하려면 먼저 이 JDBC Driver 파일을 다운로드 받아
 프로젝트의 CLASSPATH에 등록해야 한다.
 => 절차
 1) mvnrepository.com 또는 search.maven.org에서 mysql jdbc driver를 검색한다.
 2) 라이브러리 정보를 build.gradle 파일에 설정한다.
 3) gradle을 이용하여 eclipse 설정 파일을 갱신한다.
 > gradle eclipse
 4) 이클립스 프로젝트를 리프래시 한다.
 - 프로젝트에 mariadb jdbc driver 라이브러리가 추가되었는지 확인한다.
 JDBC 드라이버 등록
     => java.sql.Driver 규칙에 따라 정의된 클래스를 로딩한다.
     => Driver 구현체는 JDBC에 대한 정보를 제공한다.
     => 또한 DBMS에 연결작업을 수행한다.
     => Driver 구현체는 DriverManager가 관리한다.
     => 따라서 접속할 DBMS의 Driver 구현체를 생성하여 DriverManager에게 등록해야 한다.
    
     DriverManager
     => java.sql.Driver 구현 객체를 관리하는 일을 한다.
     => DBMS 연결 요청이 들어오면 해당 DBMS의 Driver 구현체를 찾아 작업을 위임한다.
    
    
     JDBC 드라이버 등록 방법1: 직접 Driver 구현 객체를 생성하고 직접 등록하기
     => java.sql.Driver 구현체를 생성하여 JDBC 드라이버 관리자에 등록한다.
     => MySQL JDBC 드라이버에는 com.mysql.jdbc.Driver 클래스가 이 구현체이다.
// JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Exam0110 {

  public static void main(String[] args) {

    try {

      // 1) java.sql.Driver 구현체의 인스턴스를 생성한다.
      java.sql.Driver mariadbDriver = new org.mariadb.jdbc.Driver();
      java.sql.Driver oracleDriver = new oracle.jdbc.OracleDriver();
      java.sql.Driver mssqlDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
      java.sql.Driver mysqlDriver = new com.mysql.jdbc.Driver();

      // 2) java.sql.Driver 구현체의 인스턴스를 드라이버 관리자에 등록한다.
      DriverManager.registerDriver(mariadbDriver);
      DriverManager.registerDriver(oracleDriver);
      DriverManager.registerDriver(mssqlDriver);
      DriverManager.registerDriver(mysqlDriver);

      System.out.println("JDBC 드라이버 로딩 및 등록 완료!");

      // DriverManager에 등록된 Driver 인스턴스를 확인해보자!
      // => DriverManager.getDriver(jdbcUrl);
      // => jdbcUrl
      // jdbc:[DBMS]://서버주소:포트번호/데이터베이스명
      java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
      System.out.println(driver);

      java.sql.Driver driver2 = DriverManager.getDriver("jdbc:oracle:thin://");
      System.out.println(driver2);

      java.sql.Driver driver3 = DriverManager.getDriver("jdbc:sqlserver://");
      System.out.println(driver3);
      
      java.sql.Driver driver4 = DriverManager.getDriver("jdbc:mysql://");
      System.out.println(driver4);

    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

ㄴ mariadb, oracle, mysql 을 주석을 해도 결과는 동일하게 출력됨

 

JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩

jdbc_ex01_Exam0111.java

// JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Exam0111 {

  public static void main(String[] args) {

    try {
      java.sql.Driver mariadbDriver = new org.mariadb.jdbc.Driver(); 
      DriverManager.registerDriver(mariadbDriver);
      System.out.println("JDBC 드라이버 로딩 및 등록 완료!");

      // 등록되지 않은 드라이버를 찾을 경우 예외 발생!
      java.sql.Driver driver = DriverManager.getDriver("jdbc:db2://");
      System.out.println(driver);

    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

ㄴ 등록되지 않은 드라이버를 찾을 경우 예외 발생함

 

JDBC 드라이버 준비 - Driver 객체 생성 및 자동 등록

jdbc_ex01_Exam0120.java

 JDBC 드라이버 등록 방법2: Driver 구현 객체 생성과 자동 등록
     => Driver 객체를 생성하면 자동으로 DriverManager에 등록된다.
     => 어떻게?
     Driver 구현체가 로딩될 때 static 블록에서 인스턴스를 만들어 등록하기 때문이다.
// JDBC 드라이버 준비 - Driver 객체 생성 및 자동 등록
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Exam0120 {

  public static void main(String[] args) throws Exception {

    try {
      // 1) Driver 구현체의 인스턴스 생성
      // => Driver 구현체가 로딩될 때 인스턴스가 생성되기 때문에
      //    굳이 다음과 같이 인스턴스를 생성할 필요가 없다.
      new org.mariadb.jdbc.Driver();

      // 2) DriverManager에 등록 안함!

      // DriverManager에 자동으로 등록됐는지 확인해보자!
      java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
      System.out.println(driver);
      // 해당 드라이버가 등록되지 않았으면 예외가 발생할 것이다.

    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

 

JDBC 드라이버 준비 - 드라이버 클래스 로딩과 등록

jdbc_ex01_Exam0130.java

 JDBC 드라이버 등록 방법3: Driver 구현 클래스 로딩과 자동 등록
     => java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면
     해당 클래스에서 자신을 자동으로 DriverManager에게 등록할 것이다.
     org.mysql.jdbc.Driver 클래스의 소스를 확인해 보라!
     static 블록에서 Driver 객체를 만들어 DriverManager에게 등록한다.
    
     => 이 방식의 장점은 소스 코드에 클래스를 지정하는 대신
        클래스 이름을 지정하기 때문에 실행할 때 다른 클래스로 쉽게 바꿀 수 있다.
     => 따라서 특정한 Driver 구현체에 종속되지 않게 만들 수 있다.
 JDBC 드라이버 등록 방법3: Driver 구현 클래스 로딩과 자동 등록
     => java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면
     해당 클래스에서 자신을 자동으로 DriverManager에게 등록할 것이다.
     org.mariadb.jdbc.Driver 클래스의 소스를 확인해 보라!
     static 블록에서 Driver 객체를 만들어 DriverManager에게 등록한다.
    
     => 이 방식의 장점은 소스 코드에 클래스를 지정하는 대신
        클래스 이름을 지정하기 때문에 실행할 때 다른 클래스로 쉽게 바꿀 수 있다.
     => 따라서 특정한 Driver 구현체에 종속되지 않게 만들 수 있다.

// JDBC 드라이버 준비 - 드라이버 클래스 로딩과 등록
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0130 {

  public static void main(String[] args) {

    try {
      
      Class.forName("org.mariadb.jdbc.Driver");

      // DriverManager에 자동 등록된 것을 확인해보자!
      java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
      System.out.println(driver);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

 

 

JDBC 드라이버 준비 - DriverManager가 Driver 구현체를 자동 로딩 II

jdbc_ex01_Exam0141.java

 JDBC 드라이버 로딩 방법4: Driver 구현체 자동 로딩
     => DriverManager를 사용할 때,
        JVM은 'service-provider loading' 절차에 따라 
        Driver 구현체를 자동으로 로딩한다.
    
     2) java.sql.Driver 클래스의 서비스 제공자를 찾아 로딩한다.
     => jar 파일 안에 META-INF/services/java.sql.Driver 파일을 찾는다.
     => 이때 JVM은 'service-provider loading' 절차에 따라 이 파일에 등록된 클래스를 로딩한다.
     => jar 파일에 해당 정보가 있다면,
        앞의 예제처럼 개발자가 따로 java.sql.Driver 구현체를 명시적으로 등록하지 않아도 된다.
     => mariadb JDBC 드라이버 jar 파일은 이 정보가 들어 있다.
        따라서 java.sql.Driver를 구현한 클래스를 로딩하거나 생성할 필요가 없다.
// JDBC 드라이버 준비 - DriverManager가 Driver 구현체를 자동 로딩 II
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0141 {

  public static void main(String[] args) {

    // 현재 jdbc.drivers 에 등록된 클래스 이름이 없다.
    System.out.printf("jdbc.drivers=%s\n", System.getProperty("jdbc.drivers"));

    try {
      // Driver 구현체를 명시적으로 로딩하지 않는다!

      // DriverManager에 자동 등록된 것을 확인해보자!
      java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
      System.out.println(driver);

      // 그럼에도 MariaDB Driver를 찾을 수 있다!
      // 왜?
      // - JVM은 프로그램을 실행할 때 
      //   'service-provider loading' 절차에 따라
      //   .jar 파일에 있는 특정 클래스를 찾아 로딩하거나 객체를 자동으로 생성한다.
      // - JDBC의 경우도 이 규칙을 따른다.
      //   DriverManager의 getDriver()를 호출할 때 
      //   'service-provider loading' 규칙에 따라 .jar 파일에서 
      //   Driver 구현체를 찾아 자동으로 로딩한다.

      // 이 프로젝트에 Oracle JDBC 드라이버와 MSSQL Server의 JDBC 드라이버도 있다.
      // 이들 드라이버도 'service-provider loading' 규칙에 따라 만들어졌기 때문에
      // 따로 Driver 구현체를 생성한다거나 등록한다거나 클래스를 로딩하는 일을 하지 않아도
      // 드라이버를 찾을 수 있을 것이다.
      java.sql.Driver driver2 = DriverManager.getDriver("jdbc:oracle:thin://");
      System.out.println(driver2);

      java.sql.Driver driver3 = DriverManager.getDriver("jdbc:sqlserver://");
      System.out.println(driver3);

      System.out.println("테스트!");

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

 

각각의 Driver 경로 확인해보기

 

 

JDBC 프로그래밍 - DBMS에 연결하기

jdbc_ex01_Exam0210.java

 JVM에서 jdbc driver 파일(.jar/META-INF/services/java.sql.Driver 파일)을 뒤져서 
       java.sql.Driver 를 구현한 클래스를 알아내어 자동으로 로딩하기 때문에,
       다음과 같이 명시적으로 로딩할 필요가 없다.
       //     Class.forName("org.mariadb.jdbc.Driver");
 DBMS에 연결하기
       => Driver 객체를 직접 사용하여 DBMS에 연결하지 않고 대신 DriverManager를 통해 연결한다.
       => DriverManager에게 연결할 DBMS의 정보(jdbc URL)를 주면 
          해당 DBMS의 Driver 객체를 찾아 connect()를 호출한다.
       jdbc url : DBMS 서버 정보. 
        예) jdbc:DBMS://서버주소:포트/데이터베이스명
            (포트번호를 지정하지 않으면 mysql인 경우 3306번이 포트번호로 사용된다.)
       username : DBMS 사용자 아이디
       password : DBMS 사용자 암호
 => DriverManager는 등록된 java.sql.Driver 구현체 중에서
          jdbc url에 지정된 DBMS의 Driver 객체를 찾는다.
          예) MariaDB: org.mariadb.jdbc.Driver 클래스의 객체
       => DB 연결을 Driver 구현체에게 위임한다.
          즉, Driver 객체의 connect()를 호출한다.
       => Driver 구현체(org.mariadb.jdbc.Driver 객체)는 DBMS와 연결한 후
          소켓 정보를 갖고 있는 java.sql.Connection 구현체를 리턴한다.
// JDBC 프로그래밍 - DBMS에 연결하기
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0210 {

  public static void main(String[] args) throws Exception {

    java.sql.Connection con = null;

    try {

      con = DriverManager.getConnection(
          "jdbc:mysql://localhost:3306/studydb", // jdbcURL
          "study", // username
          "1111" // password
          );
          
      System.out.println("DBMS와 연결됨!");

      // MariaDB의 Driver 구현체가 리턴한 Connection 객체는
      // 어떤 클래스일까?
      System.out.println(con.getClass().getName());

    } finally {
      // 자원해제
      // => 파일과 마찬가지로 DBMS에 연결한 후 더이상 사용하지 않으면 연결을 해제해야 한다.
      try {
        con.close();
      } catch (Exception e) {
        // 연결 해제하다가 발생된 예외는 무시한다.
        // 왜? 이런 오류는 애플리케이션에서 처리할 방법이 없다.
        // 처리할 필요도 없다.
      }
      System.out.println("DBMS와 연결 해제됨!");
    }
  }
}

=>

 

 

JDBC 프로그래밍 - DBMS에 연결하기

jdbc_ex01_Exam0220.java

// JDBC 프로그래밍 - DBMS에 연결하기
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0220 {

  public static void main(String[] args) throws Exception {

    // try-with-resources 문법을 사용하면
    // try 블록을 벗어날 때 close()가 자동 호출된다.
    //
    try (java.sql.Connection con = DriverManager.getConnection(
        "jdbc:mariadb://localhost:3306/studydb", // jdbcURL
        "study", // username
        "1111" // password
        );) {

      System.out.println("DBMS와 연결됨!");

    }
    System.out.println("DBMS와 연결 해제됨!");
  }
}

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : insert

jdbc_ex01_Exam0310.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : insert
package com.eomcs.jdbc.ex1;

public class Exam0310 {

  public static void main(String[] args) throws Exception {

    try (java.sql.Connection con = java.sql.DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/studydb?user=study&password=1111");

        // java.sql.Statement 구현 객체를 얻는다.
        // - SQL문을 DBMS의 형식에 따라 인코딩하여 서버에 전달하는 일을 하는 객체.
        java.sql.Statement stmt = con.createStatement();) {

      // MariaDB의 Connection 객체가 리턴하는 Statement 구현체의 클래스 이름은?
      System.out.println(stmt.getClass().getName());

      // Statement 객체 사용법:
      //
      // 1) INSERT/UPDATE/DELETE 등 DML 관련 SQL문 전송
      // => executeUpdate()
      // => 리턴값: 변경(insert/update/delete)된 데이터의 개수
      //
      // 2) SELECT 등 DQL 관련 SQL문 전송
      // => executeQuery()
      // => 리턴값: 서버에서 데이터를 가져오는 일을 할 객체
      //
      // 용어정리
      // "DML(Data Manipulation Language)"
      // => insert, update, delete 처럼 데이터를 조작하는 sql 명령을 말한다.
      // "DQL(Data Query Language)"
      // => select처럼 data를 조회하는 sql 명령을 말한다.
      //
      int count = stmt.executeUpdate(
          "insert into x_board(title,contents) values('제목10','내용'),('제목11','내용')");
      System.out.printf("%d 개 입력 성공!", count);
    }
  }
}

ㄴ x_board 가 존재하지 않으므로 테이블 생성해주기

=>

ㄴ x_board, x_board_file 테이블 생성

=>

ㄴ 데이터 입력

=>

그 후 Exam310.java 실행 시 아래와 같이 출력되며 데이터 입력됨

=>

ㄴ 데이터 추가됨을 확인

 

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select

jdbc_ex01_Exam0320.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0320 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();

        // executeQuery()
        // => DBMS 서버에 select 문을 보낸다.
        // => 리턴 값: java.sql.ResultSet 구현 객체
        //
        // ResultSet?
        // => 결과가 아니다! 서버에서 결과를 가져오는 일을 할 객체이다.
        // => 즉 서버의 select 실행 결과를 가져올 때 사용하는 도구이다.
        //
        java.sql.ResultSet rs = stmt.executeQuery(
            "select * from x_board order by board_id desc");
        ) {

      System.out.println(rs.getClass().getName());

      // ResultSet 객체를 사용하여 
      // select의 실행 결과 중에서 한 레코드(row)를 서버에서 가져온다.
      //
      boolean isReceived = rs.next(); // 가져왔으면 true, 가져올 게 없다면 false
      // 용어정리
      // "레코드(record)"
      // => select를 실행한 후 생성된 결과이다.
      //

      if (isReceived) {
        // 서버에서 한 개 가져온 결과를 출력한다.
        System.out.printf("%s, %s, %s, %s, %s\n", //
            rs.getString(1), // board_id
            rs.getString(2), // title
            rs.getString(3), // contents
            rs.getString(4), // created_date
            rs.getString(5)); // view_count

        // getString(컬럼번호):
        // => DBMS에 설정된 컬럼의 값을 문자열로 리턴한다.
        // => select 문에 나열한 컬럼의 순서를 지정한다.
        //    단 번호는 0부터가 아니라 1부터 지정한다.
        // => select 문에 wildcard(*)를 사용했다면,
        //    테이블을 정의할 때 선언한 컬럼의 순서이다.
      } else {
        System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
      }
    }
  }
}

ㄴ ResultSet 이 결과가 아님을 알 수 있음 => 서버의 select 실행 결과를 가져올 때 사용하는 도구임

 

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : getXxx()

jdbc_ex01_Exam0321.java

 getXxx(컬럼번호):
         => DBMS에 설정된 컬럼의 타입에 따라 값을 변환해서 받고 싶다면,
            다음과 같이 해당 타입의 값을 리턴하는 getXxx()를 호출한다.
         => int, number: getInt()
         => char, varchar, text: getString()
         => date, time, datetime: getDate(), getTime()
         => float: getFloat()
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : getXxx()
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0321 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();
        java.sql.ResultSet rs = stmt.executeQuery(//
            "select * from x_board order by board_id desc");
        ) {

      boolean isReceived = rs.next();
      if (isReceived) {
        System.out.printf("%d, %s, %s, %s, %s, %d\n", 
            rs.getInt(1), // board_id
            rs.getString(2), // title
            rs.getString(3), // contents
            rs.getDate(4), // created_date
            rs.getTime(4), // created_date
            rs.getInt(5)); // view_count

      } else {
        System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
      }
    }
  }
}

 

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select

jdbc_ex01_Exam0330.java

 getXxx(컬럼명):
         => 컬럼의 번호를 지정하는 방식은 소스 코드를 읽을 때 매우 불편하다.
         => 해당 번호가 어떤 컬럼을 가리키는지 알려면
            select 문을 살펴봐야 하는 번거로움이 있다.
         => 그래서 실무에서는 가능한 번호 대신 컬럼의 이름을 사용한다.
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0330 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager
        .getConnection("jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();
        java.sql.ResultSet rs = stmt.executeQuery(//
            "select * from x_board order by board_id desc");
        ) {

      boolean isReceived = rs.next();

      if (isReceived) {
        System.out.printf("%d, %s, %s, %s, %d\n", 
            rs.getInt("board_id"), 
            rs.getString("title"), 
            rs.getString("contents"), 
            rs.getDate("created_date"), 
            rs.getInt("view_count")); 
            
      } else {
        System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
      }
    }
  }
}

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select

jdbc_ex01_Exam0340.java

 반복문을 사용하면 서버에서 여러 개의 데이터를 가져올 수 있다.
       - next()는 서버에서 레코드 1개를 가져온다.
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0340 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();
        java.sql.ResultSet rs = stmt.executeQuery(
            "select * from x_board order by board_id desc");
        ) {

      // 반복문을 사용하면 서버에서 여러 개의 데이터를 가져올 수 있다.
      // - next()는 서버에서 레코드 1개를 가져온다.
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s, %d\n", 
            rs.getInt("board_id"), 
            rs.getString("title"), 
            rs.getString("contents"), 
            rs.getDate("created_date"), 
            rs.getInt("view_count")); 
      }
    }
  }
}

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select

jdbc_ex01_Exam0341.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0341 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();
        java.sql.ResultSet rs = stmt.executeQuery("select * from x_board order by board_id desc");

        ) {

      while (rs.next()) {
        // 컬럼 타입에 상관없이 getString()으로 값을 꺼낼 수 있다.
        System.out.printf("%s, %s, %s, %s, %s\n", //
            rs.getString("board_id"), //
            rs.getString("title"), //
            rs.getString("contents"), //
            rs.getString("created_date"), // 시간까지 꺼낸다.
            rs.getString("view_count")); //
      }
    }
  }
}

ㄴ 컬럼 타입에 상관없이 getString()으로 값을 꺼낼 수 있음

 

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : update

jdbc_ex01_Exam0350.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : update
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0350 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();
        ) {

      // executeUpdate()
      // => DBMS 서버에 update 문을 보낸다.
      // => 리턴 값: 변경된 레코드의 개수이다.
      int count = stmt.executeUpdate( 
          "update x_board set"
              + " view_count = view_count + 1"
              + " where board_id = 4");
      System.out.printf("%d 개 변경 성공!", count);
    }
  }
}

ㄴ executeUpdate() 를 이용하여 DBMS 서버에 update 문을 보냄

 

 

jdbc_ex01_Exam0350.java 를 실행하여 목록 확인

=>

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete

jdbc_ex01_Exam0360.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0360 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();

        ) {

      // executeUpdate()
      // => DBMS 서버에 delete 문을 보낸다.
      // => 리턴 값: 삭제된 레코드의 개수이다.
      int count = stmt.executeUpdate(
          "delete from x_board where board_id = 7");
      System.out.printf("%d 개 삭제 성공!", count);
    }
  }
}

ㄴ executeUpdate() 를 이용하여 DBMS 서버에 delete 문을 보냄

=>

jdbc_ex01_Exam0360.java 한 번 더 실행 시 아래와 같이 출력됨

ㄴ 7번 데이터는 이미 삭제되었기 때문

=>

jdbc_ex01_Exam0350.java 를 실행하여 목록 확인

ㄴ 7 번 데이터가 삭제되어있음을 확인할 수 있음

 

 

JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete, FK 가 참조하는 데이터 지우기

jdbc_ex01_Exam0361.java

// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete, FK 가 참조하는 데이터 지우기
package com.eomcs.jdbc.ex1;

import java.sql.DriverManager;

public class Exam0361 {

  public static void main(String[] args) throws Exception {
    try (
        java.sql.Connection con = DriverManager.getConnection(
            "jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
        java.sql.Statement stmt = con.createStatement();

        ) {

      // 부모 테이블의 데이터를 지우려면,
      // 부모 테이블의 데이터를 참조하는 자식 테이블의 데이터를 먼저 지워야 한다.
      //
      // => 게시글을 참조하는 첨부 파일 데이터를 먼저 지운다.
      int count = stmt.executeUpdate(
          "delete from x_board_file where board_id = 1");
      System.out.printf("x_board_file 테이블 : %d 개 삭제 성공!\n", count);

      // => 부모 테이블의 데이터를 지운다.
      int count2 = stmt.executeUpdate(
          "delete from x_board where board_id = 1");
      System.out.printf("x_board 테이블 : %d 개 삭제 성공!\n", count2);
    }
  }
}

=>

int count = stmt.executeUpdate(
          "delete from x_board_file where board_id = 1");
      System.out.printf("x_board_file 테이블 : %d 개 삭제 성공!\n", count);

ㄴ 해당 코드를 주석 처리하면 아래와 같이 예외 발생

=>

=>

다시 주석 풀고 실행

=>

ㄴ 부모 테이블의 데이터를 삭제하기 위해 자식 테이블의 데이터를 먼저 지운 후 부모 테이블의 데이터를 삭제

 

=>

ㄴ 자식 테이블에서 board_id = 1 인 데이터를 모두 삭제하면 부모 테이블의 board_id = 1 인 데이터도 삭제 가능

 

ㄴ x_board_file, x_board 테이블에서 board_id = 1 인 데이터가 모두 삭제됨