JAVA

JDBC MySQL연결 create table

기하 2022. 6. 27. 02:08

JDBC란

자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고
SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API이다.
접속하려는 DBMS 서버에 따라서 알맞는 JDBC 드라이버가 필요하다. 
소개를 시작하기에 앞서, 

1) MySQL 사용에 필수적인 mysql-connector-java-버전-bin.jar 파일을 (인텔리제이 기준)
   프로젝트 구조 - 라이브러리 - +자바 를 통해 코딩할 모듈에 추가시켜준다.

2) MySQL에, 테이블을 삽입할 데이터베이스와 계정(id, password)을 등록해준다. :
   본 포스팅에서는 DB 이름 : dev, id : dev, pw : dev로 사용할 예정

JDBC 기본적인 연결 후 사용하기

JDBC를 본격적으로 사용하기 위해 반드시 거쳐야 하는 단계들을 먼저 언급하겠다.

1) import java.sql.*;

2) JDBC 드라이버 로딩

   가장 먼저 해야할 일은  데이터베이스 작업을 위해
   준비된 JDBC드라이버 파일을 사용할 수 있도록 메모리에 로드시키는 일이다.
     
Class.forName("com.mysql.jdbc.Driver");
   코드로 구현하며,
   Class.forName()의 인자값만 바꿔주면 되는 아주 간단한 사안이다. 
   Class.forName()으로 인해
   JDBC 드라이버 파일 내의 com.mysql.jdbc.Driver 클래스가 동적으로 로딩될 때
   자동으로 JDBC 드라이버 객체가 생성되어
   DriverManager에 등록되어 준비가 완료된다.
   com.mysql.jdbc.Driver 클래스는 드라이버 인터페이스를 구현한 클래스이다. 
   이 코드는 프로그램 구현 시 한 번만 필요하다.

3) DBMS 서버(MySQL)와의 연결 작업을 위한 Connection 객체 생성

   JDBC 드라이버가 사용할 준비가 되었다면
   첫번째 DB작업으로 DB서버와의 연결을 시켜준다.   
Connection conn = DriverManager.getConnection(url, id, password);
이 코드로 하여금 mysql과의 연결 작업을 완료할 수 있다. 
getConnection 메소드의 파라미터 값은 다음과 같다. 
  1. String url : 접속할 서버의 URL이며 맨 마지막에 DB이름을 넣어준다.
  2. String id : DB서버에 로그인할 계정
  3. String password : DB 서버에 로그인할 비밀번호
DriverManager.getConnection(url, idpassword); 은
실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결시켜주는 역할을 하며,
연결에 성공했을 시 DB와 연결된 상태를 Connection 객체 conn으로 표현하여 반환한다. 
바로 밑에서 이 객체를 통해 쿼리를 날리는 statement를 작성할 수 있다.

4) Statement 객체를 생성하여 질의 수행

Statement 객체는
자바프로그램이 DB쪽으로 SQL query문을 전송하고,
DB가 처리된 결과를 다시 자바프로그램쪽으로 전달할 수 있도록 돕는 객체이다.
Statement stmt = conn.createStatement();
 코드를 통해 생성한다.

5) SQL문 실행 및 결과 반환

SQL 쿼리 실행은 코드를 통해 보이겠으며,
결과 반환은 ResultSet 객체를 통한다. 
이 객체는 주로 조회 기능에 사용되며,
SQL 쿼리의 실행 결과를 ResultSet으로 받아서
정보를 저장할 오브젝트(JavaBean, DTO)에 옮겨준다.

6) 자원해제
    DB 관련 처리 작업을 하며 사용한 리소스들을 메모리에서 해제시켜주기.
    -> 최근 사용했던 객체부터

이제 아래 코드로 하여금 JDBC 연결을 테스트해보겠다. 
필자는 WARN: Establishing SSL connection without server's identity verification is not recommended. 라는 경고문이 나왔기 때문에 String url = "jdbc:mysql://localhost/dev?useSSL=false"; 코드를 덧붙여 해결하였다.
 
혹시, 
conn = DriverManager.getConnection(url, "dev""dev"); 코드로 인해
SQLException이 발생하였다면, MySQL에서 서버가 제대로 작동하고 있는지,
올바른 DB이름과 id, password를 기입하였는지를 체크해보자. 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

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

        try{
            //1. 드라이버 로딩 : mysql 드라이버 로딩
           Class.forName("com.mysql.jdbc.Driver"); 
            //드라이버들이 읽히기만 하면 자동 객체가 생성되고 DriverManager에 등록된다.

            //2. mysql과 연결시키기
            String url = "jdbc:mysql://localhost/dev?useSSL=false";

            conn = DriverManager.getConnection(url, "dev", "dev");
            System.out.println("Successfully Connection!");
        }

        catch(ClassNotFoundException e){
            System.out.println("Failed because of not loading driver");
        }
        catch(SQLException e){
            System.out.println("error : " + e);
        }

        finally{
            try{
                if(conn != null && !conn.isClosed()){
                    conn.close();
                }
            }

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

 

 

테이블을 생성하는 Query 보내기

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

//**student 테이블 생성하기**
//create table student(
//      id int,
//      name varchar(20),
//      grade int
//);

public class TableCreating {
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;

        String url = "jdbc:mysql://localhost/dev?useSSL=false";
        String id = "dev";
        String pw = "dev";

        try{
            Class.forName("com.mysql.jdbc.Driver");

            conn = DriverManager.getConnection(url, id, pw);

            System.out.println("Successfully Connected!");

            //DB와 연결된 conn 객체로부터 Statement 객체 획득.
            stmt = conn.createStatement();

            //query 만들기
            StringBuilder sb = new StringBuilder();
            String sql = sb.append("create table if not exists student(")
                    .append("id int,")
                    .append("name varchar(20),")
                    .append("grade int")
                    .append(");").toString();

            //query문 날리기
            stmt.execute(sql);
        }

        catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally{
            try{
//자원 해제
                if(conn != null && !conn.isClosed())
                    conn.close();
            } catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
}​
위에서는 JDBC API가 만들어내는 예외에 대해 일일이 예외처리를 해주었지만,
코드가 길어지고 요구되는 기능이 많아질수록 불필요한 코드를 잡아내는 것이 중요하기 때문에,
예외를 던져주는 방법을 사용하는 것도 나쁘지 않다.

위 코드에서는 Statement 객체를 던지는 방법으로 stmt.execute(sql); 을 사용하였다. 

 

Statement 객체를 던지는 방법에는 3가지가 있다.

  1. stmt.execute() : 테이블 생성, 수정, 삭제 등 DB 관리 명령어에 주로 사용.
  2. stmt.executeUpdate() : 레코드 삽입, 수정, 삭제 등 데이터 관리 명령어에 주로 사용하며,
     SQL문이 실행된 후 그에 영향을 받은 레코드의 갯수를 int형으로 반환하는 메소드.
  3. stmt.executeQuery() : Select한 결과 값들을 ResultSet 객체에 담아 반환하며,
    레코드나 테이블 조회 류의 명령에 사용.
위 코드를 실행한 뒤 MySQL을 확인해 보면 다음과 같이 테이블이 생성되어있다.