본문 바로가기

옛날

3. 데이터베이스에 쿼리문을 보내보자.

개발환경 :

Windows 7 Ultimate K 64bit

MySQL Community Server 5.7.17 <GPL>

MySQL Workbench 6.3 CE

Eclipse Kepler Service Release 2

mysql-connector-java-5.1.40-bin //커넥터 버전




Statement


데이터베이스에 DML쿼리(삽입,수정,삭제,조회) 를 전송할 때에 필요한 객체.


Statement에게는 executeQuery와 executeUpdate라는 메서드를 가지고있는데,


executeQuery(String) - SELECT(조회)문을 전송할 떄 사용하는 메서드로, ResultSet 자료형의 데이터를 반환한다.

이 때, ResultSet이란 대충 SELECT문을 실행하여 테이블로부터 얻은 결과를 저장하고있는 저장소라고 알면 되겠다.


Ex) stmt.executeQuery(SELECT * FROM Test;); //Test테이블로부터 받아온 데이터를 담고있는 ResultSet 반환


executeUpdate(String) - INSERT, UPDATE, DELETE 문을 실행할 때 사용, 수정한 레코드 수를 int형으로 반환


Ex) stmt.executeUpdate(INSERT INTO `test` VALUES ('1', '티스토리', '2017-01-05';); //1이 반환


//2017-01-06 추가 - DDL (CREATE DROP 등등..)문도 잘 되더라


대략 이러하다. 그럼 이제 실제로 쿼리문 보내볼 것인데 SELECT문으로 데이터를 조회 후, INSERT문으로 데이터를 삽입한 후에 다시 조회하여 변경사항을 확인하는 작업을 해보자.


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
package jdbc;
 
import java.sql.*;
 
public class Jdbc {
 
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/test?useSSL=false&user=root&password=5071";
        Connection conn = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("드라이버 로드 성공!");
            
            conn = DriverManager.getConnection(url);
            System.out.println("데이터베이스 접속 성공!");
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException se) {
            se.printStackTrace();
        } finally {
            if(conn!=nulltry {conn.close();} catch (SQLException e) {}
        }
    }//main
}//class
cs


딱 커넥팅만 하는 코드다. (간결하게 수정햇음) 여기서 이제 SELECT 쿼리문을 전송하는 코드를 추가해보자.


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
package jdbc;
 
import java.sql.*;
 
public class Jdbc {
 
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/test?useSSL=false&user=root&password=5071";
        Connection conn = null;
 
        /////////////////////////
        Statement stmt = null; //Statement 객체 선언
        /////////////////////////
 
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("드라이버 로드 성공!");
            
            conn = DriverManager.getConnection(url);
            System.out.println("데이터베이스 접속 성공!");
 
            //////////////////////////////////////////
            stmt = conn.createStatement(); //쿼리 준비 단계
            String selectSql = "SELECT * FROM table;"; //전송할 쿼리문
            stmt.executeQuery(sql); //쿼리문 전송
            /////////////////////////////////////////
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException se) {
            se.printStackTrace();
        } finally {
            if(conn!=nulltry {conn.close();} catch (SQLException e) {}
        }
    }//main
}//class
cs


이상태로 실행햇다면 콘솔창엔 아무런 변화도 없다는 것을 알 수 있다. 전송만하고 받아오질 않았으니..

참고로 위에서 executeQuery는 ResultSet이라는 객체를 반환한다고 했는데, 이제 ResultSet을 사용하여

콘솔창에서 test테이블의 데이터를 조회해보자.


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
package jdbc;
 
import java.sql.*;
 
public class Jdbc {
 
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/test?useSSL=false&user=root&password=5071";
        Connection conn = null;
        Statement stmt = null;
        ///////////////////////////////
        ResultSet rs = null; //ResultSet 객체 선언
        ///////////////////////////////
 
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("드라이버 로드 성공!");
            
            conn = DriverManager.getConnection(url);
            System.out.println("데이터베이스 접속 성공!");
 
            stmt = conn.createStatement();
            String selectSql = "SELECT * FROM table;";
            //stmt.executeQuery(sql);
            
            /////////////////////////////////////
            rs = stmt.executeQuery(sql); //rs에 executeQuery의 실행결과를 삽입
            
            while(rs.next()) //next()에 대한 설명은 본문에
            {
                System.out.println
                (
                    rs.getString(1+ "\t" + //본문 설명
                    rs.getString(2+ "\t" +
                    rs.getString(3)
                );
            }
            /////////////////////////////////////
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException se) {
            se.printStackTrace();
        } finally {
            if(conn!=nulltry {conn.close();} catch (SQLException e) {}
        }
    }//main
}//class
cs

rs.next() - next함수는 ResultSet에 저장된 SELECT문 실행 결과를 행단위로 1행씩 넘겨서 만약에 다음 행이 있으면

true, 다음 행이 없으면 false를 반환하는 함수다. while(rs.next())를 하게되면 한 루프가 돌아갈 때 마다 1행씩 넘겨주다가

더이상 행이 없으면 while문이 끝나게 된다.


rs.getString() - getString함수는 해당 순서의 열에있는 데이터를 String형으로 받아온단 뜻이다.

예로들어 rs.getString(2)를 하게되면 2번째 열에있는 데이터를 가져오게 된다. (getInt, getFloat등 도 있음)


참고로 현재 test테이블에는 이러한 데이터가 들어있는데 이클립스 실행 결과가 어떻게 나오는지 보자.

(현재 MySQL Workbench로 본 test테이블의 내용)


(이클립스 콘솔 출력)


이렇게 잘 나오는 것을 확인할 수 있다. 이제 조회를 완료했으니 데이터를 삽입해보자.

데이터를 삽입할 땐 executeUpdate를 사용한다.


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
61
62
63
64
package jdbc;
 
import java.sql.*;
 
public class Jdbc {
 
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/test?useSSL=false&user=root&password=5071";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("드라이버 로드 성공!");
            
            conn = DriverManager.getConnection(url);
            System.out.println("데이터베이스 접속 성공!");
            
            stmt = conn.createStatement();
            String selectSql = "SELECT * FROM test;";
            rs = stmt.executeQuery(selectSql);
            
            while(rs.next())
            {
                System.out.println
                (
                    rs.getString(1+ "\t" +
                    rs.getString(2+ "\t" +
                    rs.getString(3)
                );
            }
            
            ///////////////////////////////////////
            //구분선
            System.out.println("==============================================");
 
            //INSERT문 전송
            String insertSql = "INSERT INTO `test` VALUES ('2', 'qwer', '1000-01-01');";
            stmt.executeUpdate(insertSql);
            
            //test 테이블 조회
            rs = stmt.executeQuery(selectSql);
        
            while(rs.next())
            {
                System.out.println
                (
                    rs.getString(1+ "\t" +
                    rs.getString(2+ "\t" +
                    rs.getString(3)
                );
            }
            //////////////////////////////////////
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException se) {
            se.printStackTrace();
        } finally {
            if(conn!=nulltry {conn.close();} catch (SQLException e) {}
        }
    }//main
}//class
cs


앞의 내용을 이해했다면 그렇게 어려울 게 없는 내용이다. test테이블에 데이터를 삽입했다. 워크벤치를 보자.

(정상적으로 데이터가 추가되었다.)


이클립스 결과를 보자.

(잘 뜬다)


데이터 조회 → 데이터 삽입 → 데이터 조회 이 과정을 거쳐서 JDBC프로그래밍으로

어떻게 쿼리문을 작성하는지 알아보았다. 응용이 어려울 뿐 기초가 어려운 녀석은 아님.