티스토리 뷰

Java

JDBC(Java DataBase Connectivity)

siyoon210 2018. 11. 19. 21:00
반응형

JDBC(Java DataBase Connectivity)

JDBC란 자바에서 데이터베이스를 다루기 위한 API 입니다. Spring을 이용하게되면 JDBC를 직접 다루는 일은 없으나, SpringJDBC, MyBatis, JPA 등등 데이터베이스와 관련한 API는 JDBC를 기본으로 하여 동작하게 됩니다.  예제는 직접적인 코드 설명을 주로 하고, MAVEN과 mariaDB를 이용해서 진행했습니다.



1) SQL에 맞는 의존성을 MAVEN에 넣는다. (참고로 DBMS 버젼과 maven에 주입할 client의 버젼은 다른 것입니다.)

<dependency>
     <groupId>org.mariadb.jdbc</groupId>
     <artifactId>mariadb-java-client</artifactId>
     <version>2.3.0</version>
 </dependency>

2) 리플렉션을 이용하여, SQL에 맞는 드라이버를 등록한다.

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

3) DriverManager 객체의 getConnection(); 메소드를 이용하여 Connection 객체를 받아, DBMS로 접속한다. 

Connection c = 	DriverManager.getConnection("jdbc:mariadb://localhost:3306/Test_db",”username”,”password”);

4) 쿼리문을 String으로 준비시키고, DBMS로 전송하면, 쿼리는 DBMS에서 실행되고, 실행된 결과도 일단 DBMS에 있다.

String sql = "SELECT role_id, description FROM ROLE where role_id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery() //실행~!

5) 쿼리문을 입력할때 파라미터 바인딩이 필요하다면, 바인딩이 필요한 위치의 쿼리문은 ?로 하고, set함수를 이용하여서 바인딩한다.

ps.setInt(1, 500); // 1번째 ? 에 정수 500을 바인딩시킨다.

6) 실행된 결과를 한건씩 (한행씩) 가져오게 된다.

if(rs.next()){ . . . }

7) 가져온 각 열에 따른 데이터 타입에 맞는 get 함수를 써서 데이터를 입력받고 출력한다.

int roleId = rs.getInt(1); // 첫번째 칼럼의 값을 정수로 읽어온다.

8) 커넥션은 반드시 close() 한다.



실제예제

아래 코드는 게시판 구현을 위해서 게시물 한건을 불러오는 DAO(Data Access Object)중 일부 입니다.

public ArticleDTO getArticleDTO(int boardid) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArticleDTO article = new ArticleDTO();

    try {
        conn = DbUtil.connect(dbUrl, dbId, dbPassword);
        String sql = "SELECT boardid, nickname, title, content, regdate, view FROM board WHERE boardid=?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1,boardid);
        rs = ps.executeQuery();

        while (rs.next()) {
            board.setId(rs.getInt(1));
            board.setNickname(rs.getString(2));
            board.setTitle(rs.getString(3));
            board.setContent(rs.getString(4));
            board.setDate(rs.getTimestamp(5));
            board.setViewCount(rs.getInt(6));
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        DbUtil.close(conn, ps, rs);
    }
    return board;
}


반응형
댓글