본문 바로가기

Programming/Java

[MySQL] JDBC 사용하기 :: MySQL연결 + create table 수행

반응형

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 프로그래밍을 위해 가장 먼저 해야할 일로, 데이터베이스 작업을 위해 준비된 JDBC드라이버 파일을 사용할 수 있도록 메모리에 로드시킨다. 
Class.forName("com.mysql.jdbc.Driver"); 코드로 구현하며, Oracle의 경우는 구글링을 통해 서치하면 충분히 찾을 수 있고 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, idpassword);
이 코드로 하여금 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를 기입하였는지를 체크해보자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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();
            }
        }
    }
}
 
cs



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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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();
            }
        }
    }
}
 

cs


위에서는 JDBC API가 만들어내는 예외에 대해 일일이 예외처리를 해주었지만, 코드가 길어지고 요구되는 기능이 많아질수록 불필요한 코드를 잡아내는 것이 중요하기 때문에, 예외를 던져주는 방법을 사용하는 것도 나쁘지 않다.

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


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

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

위 코드를 실행한 뒤 MySQL을 확인해 보면 다음과 같이 테이블이 생성되어있다. 





반응형