글 작성자: beaniejoy

  Java는 정말 다양한 기능을 수행할 수 있다는 장점이 있는데 JDBC도 그 중 하나다. JDBC(Java Database Connectivity)는 자바가 DB에 접근해서 데이터를 처리할 수 있도록 연결해주는 인터페이스라고 할 수 있다. 정확히는 자바에서 인터페이스만 제공하고 MS-SQL, MySQL, MariaDB, DB2 등 각 DB에서 자바 인터페이스에 따라 JDBC 드라이버를 만든 것이다. 우리는 각 DB를 선택해서 해당하는 드라이버를 사용해 JDBC를 이용하기만 하면 된다.


 연결 방법

 

본인은 MariaDB를 연동할 것이기 때문에 MariaDB driver를 이용해야 한다.

 

1. MariaDB JDBC driver 다운 받기

 

https://mariadb.com/downloads/#connectors

 

Download – MariaDB.com | MariaDB

Official downloads for MariaDB. Select versions / OS.

mariadb.com

2. jar 파일 Java Project에 연동

 

위의 링크를 타서 다운로드를 완료하면 mariadb-java-client-2.4.4.jar 파일이 생길 것이다. 이를 Java Project에 연동해야 한다. 

- JDBC를 사용하려는 Java Project에 마우스 오른쪽 클릭해서 Build Path > Configure Build Path.. 를 클릭한다.

- Libraries에서 Add External JARs.. 버튼 클릭해서 아까 받았던 mariadb-java-client-2.4.4.jar 파일을 집어 넣는다.

 

- 이렇게 jar 파일이 추가가 되어있으면 연동 성공한 것이다!!

 

여기까지 하면 이제 본격적으로 JDBC를 이용할 준비가 된 것이다.


 

 JDBC 사용해서 DB에 쿼리를 날려보자!

 

 SQL 중에서 기본 CRUD인 INSERT, SELECT, UPDATE, DELETE를 가지고 DB에 날려볼 것이다. 우선 INSERT를 가지고 어떤 과정을 거쳐 SQL이 DB로 전송이 되는지 알아보자.

 

1. Driver 로드

1
2
3
4
5
6
7
8
9
10
try {
    // 1. Drive 클래스를 로드해준다.
    Class.forName("org.mariadb.jdbc.Driver");
    System.out.println("드라이브로드 성공");
 
catch (ClassNotFoundException e) {
            
    e.printStackTrace();
}
 

 Class.forName 메서드를 이용해서 Driver 클래스를 메모리에 로딩시켜주자. 이와 관련된 내용은 앞선 static에 관한 게시글을 참조하면 좋을 것 같다. Driver 로드를 완료하면 이제 DB연결을 할 수가 있다.

 

2. Connection 객체를 생성해 DataBase 연결하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Connection con = null;
PreparedStatement pstmt = null;
 
try {
    con = DriverManager.getConnection(
    "jdbc:mysql://localhost/acorn?autoReconnect=true"
    "acorn12"// user name
    "acorn12"); // password
    // 2. 데이터 베이스와 연결을 시도한다.
    System.out.println("데이터 베이스 연결 성공");
catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
 

 DriverManager.getConnection 메서드를 이용해서 Connection 객체를 생성한다. 필요한 인자는 연결하려는 데이터베이스 주소, 등록한 user name과 password다. SQLException 예외처리 해야하는 것도 잊지말아야 한다.

 

3. Connection 객체를 생성해 DataBase 연결하기

1
2
3
4
5
6
7
8
9
10
PreparedStatement pstmt = null;
 
StringBuffer sql = new StringBuffer();
// 이런식으로 사용하자
// 쿼리에서 먼저 실험해보고 확실히 성공했을 때 넣기.
// ? : binding 변수 - 값(value)에만 사용할 수 있다.
sql.append("INSERT INTO dept(deptno, dname, loc) VALUES(?,?,?)");
 
// 3. SQL문을 전송할 수 있는 PreparedStatement 객체를 생성한다.
pstmt = con.prepareStatement(sql.toString());

 DB와 연결을 성공했으면 그 다음은 SQL문을 전송할 준비를 해야 한다. 여기서 PreparedStatement 객체를 이용한다.

StringBuffer를 이용해 원하는 sql문을 String으로 이어서 만들고 완성된 sql 문자열을 PreparedStatement 객체 생성하면서 연결한다. 여기까지는 아직 sql문을 전송한 것이 아니다.

 

4. 바인딩 변수 설정 후 쿼리 전송하기

1
2
3
4
5
6
7
8
9
// 4. 바인딩 변수(?)를 설정한다.
// ?,?,?에 각각에 맞는 index에 맞는 type을 집어넣으면 된다.
pstmt.setString(2"ANALYSIS");
pstmt.setString(3"LA");
 
// 5. SQL문을 전송한다.
int result = pstmt.executeUpdate(); 
// insert, update, delete(DML)일 때 사용

 바인딩 변수는 위에 sql 문자열 만들 때 보았던 '?' 변수이다. 여기에 따로 PreparedStatement 객체를 이용해 원하는 값을 집어 넣을 수 있다. 아래가 INSERT하려는 dept table이다. deptno=5, dname=ANALYSIS, loc="LA"를 INSERT 해보려 한다. 

 생성된 PreparedStatement 객체를 통해 executeUpdate 메서드로 쿼리를 전송한다. 여기서 INSERT, UPDATE, DELETE 3개의 쿼리를 묶어 DML이라 하는데 DML쿼리는 executeUpdate 메소드를 이용하고, SELECT는 DQL쿼리로 executeQuery 메소드를 사용해야 함을 잊으면 안된다. (근데 사실 DML에서도 executeQuery 메소드를 사용해도 실행은 된다고 합니다. 이에 대한 내용을 까먹었는데 혹시 정확히 아시는 분 계시면 댓글로 알려주시면 감사하겠습니다~)

 

 executeUpdate 메소드 결과값으로 갱신된 행(데이터)의 개수를 리턴해준다.

 

 성공적으로 쿼리가 수행됐음을 알 수 있다!

 

(추가) 5. SELECT 쿼리 보내기

 

SELECT 쿼리는 위의 3개의 DML쿼리와 다르게 executeQuery 메서드를 통해 쿼리를 보내고 특별히 중요한 것이 ResultSet 객체를 이용해서 executeQuery의 결과값을 받는다는 것이다.

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
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
 
    try {
        con = DriverManager.getConnection(
                                "jdbc:mysql://localhost/acorn",
                                "acorn12",
                                "acorn12");
 
        StringBuffer sql = new StringBuffer();
            sql.append("SELECT deptno, dname, loc ");
        sql.append("FROM dept ");
        sql.append("ORDER BY deptno");
 
        pstmt = con.prepareStatement(sql.toString());
        // SELECT 수행시 executeQuery() 사용
        // INSERT 때에도 사실 executeQuery로도 실행은 가능하다.
        rs = pstmt.executeQuery();
 
        // ResultSet을 이용해서 결과 출력
        while (rs.next()) {
            // 중간에 어느하나가 누락되었다 해도 알아서 고쳐줌
            int index = 1;
            int deptno = rs.getInt(index++);
            String dname = rs.getString(index++);
            String loc = rs.getString(index++);
            System.out.printf("%d, %s, %s\n", deptno, dname, loc);
            }
            
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
   }

 ResultSet은 executeQuery 메서드의 결과값을 받아내고 SELECT의 결과테이블 각 행을 기준으로 나타낸다.

이를 출력하기 위해 next() 메서드를통해서 다음 데이터가 존재하는지 유무를 판단하게 만들고 존재할 경우 계속 반복문이 돌아가도록 해서 출력코드를 작성하면 된다.

 

 

정리

 

1. org.mariadb.jdbc.Driver 클래스를 메모리에 로딩 (Class.forName 메서드를 이용한다.)

2. Connection 객체를 생성해 DataBase 연결하기 (DriverManager.getConnection(DB주소, username, pwd)를 이용해서 연결)

3. Connection 객체를 생성해 DataBase 연결하기

   (sql문을 StringBuffer를 이용해 하나의 문자열로 만들어서 PreparedStatement 객체 생성하는데 보낸다.)

4. 바인딩 변수 설정 후 쿼리 전송하기

   ('?' 처리한 곳에 PreparedStatement 객체를 이용해 원하는 값을 넣고 executeUpdate (or executeQurey) 메서드를 이용해 DB에 쿼리를 보낸다.)

5. DB에 가서 성공 유무를 확인한다. 끝!

 

 


(다음에는 JDBC를 이용해 쿼리를 보낼 때 DAO, DTO를 사용하는 방법과 의미에 대해서 정리해보겠습니다.)