본문 바로가기
Programming/Spring

Spring JDBC (JdbcTemplate class)

by TinKerBellBass 2017. 8. 5.
728x90
반응형
참고 도서
스프링 퀵 스타트
국내도서
저자 : 채규태
출판 : 루비페이퍼 2016.06.30
상세보기



1. 설정

(1) 라이브러리 등록
pom.xml 파일에 spring jdbc, common dbcp 두 가지의 dependency 추가
maven repository 에서 검색 가능(https://mvnrepository.com/)

(2) DataSource 설정(bean 객체 등록)

1
2
3
4
5
6
7
8
<!-- 사용하는 데이터베이스 웹페이지 등을 참조해서 드라이브, url 설정 -->
<!-- destroy-method="close" dataSource 객체 삭제 전에 연결 해제 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="데이터베이스 드라이브" />
    <property name="url" value="데이터베이스 url" />
    <property name="username" value="데이터베이스 사용자 이름" />
    <property name="password" value="데이터베이스 사용자 비밀번호" />
</bean>
cs

2. JdbcTemplate 객체 얻기

(1) JdbcDaoSupport 클래스 상속하는 방법

1
2
3
4
5
6
7
8
9
10
public class BoardDAO extends JdbcDaoSupport{
    // DataSource 객체 주입
    @Autowired
    public void setSuperDataSource(DataSource dataSource){
        super.setDataSource(dataSource);
    }
    // 사용법
    // getJdbcTemplate().update(...) 
    // update(...) 는 JdbcTemplate 클래스의 메소드    
}
cs


(2) JdbcTemplate 클래스 bean 객체 등록 후 의존성 주입하는 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- DataSource 객체를 주입, ref="dataSource" => bean 등록한 dataSource 의 id-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>
 
public class BoardDAO{
    // bean 등록한 JdbcTemplate 객체 주입
    @Autowired
    private JdbcTemplate jdbcTemplate;    
 
    // 사용법
    // jdbcTemplate.update(...) 
    // update(...) 는 JdbcTemplate 클래스의 메소드    
}
cs


3. JdbcTemplate 클래스의 메소드

(1) CRUD 중 CUD (INSERT, UPDATE, DELETE)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// int update(String sql, Object...args)
// sql에 설정된 ? 를 차례대로 나열, 성공한 횟수를 int 로 반환
// 글 수정
public void upadateBoard(BoardVO vo){
    final String BOARD_UPDATE = "update board set title=?, content=?";
    int count = jdbcTemplate.update(BOARD_UPDATE, vo.getTitle(), vo.getContent());
    System.out.println(count + "건 데이터 수정");   
}
 
 
// int update(String sql, Object[] args)
// sql에 설정된 ? 를 배열에 담아, 배열 객체를 인자에 전달
// 글 수정
public void upadateBoard(BoardVO vo){
    final String BOARD_UPDATE = "update board set title=?, content=?";
    Object[] args = {vo.getTitle(), vo.getContent()};
    int count = jdbcTemplate.update(BOARD_UPDATE, args);
    System.out.println(count + "건 데이터 수정");   
}
// DELETE, INSERT 도 update() 메소드를 사용하면 된다

cs



(2) CRUD 중 R (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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// //int queryForInt(String sql)
// //int queryForInt(String sql, Object...args)
// //int queryForInt(String sql, Object[] args)
// //검색 결과가 정수인 경우 그 정수값을 int 로 반환
// //전체 게시글 수 조회
//public int getBoardTotalCount(BoardVO vo){
// final BOARD_TOT_COUNT = "select count(*) from board";
// return jdbcTemplate.queryForInt(BOARD_TOT_COUNT);
//} // 스프링 3.2.2 버전부터 queryForInt는 지원하지 않는다
 
// queryForInt를 queryForObject로 변경
public int getBoardTotalCount(BoardVO vo){
    final BOARD_TOT_COUNT = "select counr(*) from board";    
    return jdbcTemplate.queryForObject(BOARD_TOT_COUNT, Integer.class);
 
// int queryForObject(String sql)
// int queryForObject(String sql, RowMapper<T> rowMapper)
// int queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
// 하나의 검색 결과를 특정 자바 객체(VO)로 매핑하여 리턴 받을 때 사용
// 검색 결과가 없거나, 두 개 이상이면 예외 발생
// 검색 결과를 VO 로 매핑할 RowMapper 인터페이스를 구현한 클래스가 필요
// 글 상세 조회
public BoardVO getBoard(BoardVO vo){
    final BOARD_GET = "select * from board where boardNo=?";
    Object[] args = {vo.getBoardNo()};
    return jdbcTemplate.queryForObject(BOARD_GET, args, new BoardMapper());
}
 
 
// int query(String sql)
// int query(String sql, RowMapper<T> rowMapper)
// int query(String sql, Object[] args, RowMapper<T> rowMapper)
// 검색 결과가 목록 일 때, 특정 자바 객체(VO)를 매핑하여 목록으로 리턴 받을 때 사용
// 검색 결과를 VO 로 매핑할 RowMapper 인터페이스를 구현한 클래스가 필요
// 글 상세 조회
public List<BoardVO> getBoardList(BoardVO vo){
    final BOARD_LIST = "select * from board order by boardNo desc";    
    return jdbcTemplate.query(BOARD_LIST, new BoardMapper());
}
 
 
// RowMapper 인터페이스의 mapRow() 메소드 구현
// queryForObject(), querty() 메소드로 얻어낸 결과의 Row 정보를 매핑
public class BoardRowMapper implements RowMapper<BoardVO>{
    public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException{    
        boardVO board = new BoardVO();
        board.setTitle(rs.getString("TITLE"));
        board.setContet(rs.getString("CONTENT"));
        board.setBoardNo(rs.getInt("BOARDNO"));
        return board;
    }
}
 
cs



4. 트랜잭션 처리

(1) 설정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 네임스페이스 tx 추가 -->
<!-- 트랜잭션 관리자 등록, DataSource 객체 주입 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
 
<!-- 트랜잭션 어드바이스 설정, <tx:advice> 엘리먼트 사용 -->
<!-- 트랜잭션 관리자 지정, transaction-manager="txManager" => 트랜잭션 관리자 id -->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <!-- get으로 시작하는 모든 메소드를 읽기전용으로 처리, 트랜잭션 관리에서 제외 -->
        <tx:method name="get*" read-only="true"/>
        <!-- read-only="true" 로 설정하지 않은 모든 메소드를 틀랜잭션 관리에 포함 -->
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>
cs



(2) AOP 설정을 이용하여 트랜잭션 적용

1
2
3
4
5
6
7
<!-- 트랜잭션 advice 객체의 경우, 스프링 컨테이너가 자동으로 생성 하기 때문에
     객체의 아이디와 어드바이스 메소드 이름을 알 수 없음, <aop:advisor> 엘리먼트 사용 -->
<aop:config>
    <aop:pointcut id="txPointcut" expression="execution(* com.neverland.nyan..*(..))"/>
    <!-- advice-ref="txAdvice" => bean 등록한 트랜잭션 어드바이스의 id
    <aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
cs




728x90
반응형

'Programming > Spring' 카테고리의 다른 글

Spring Layered Architecture  (0) 2017.08.09
Spring MVC (annotation 기반)  (0) 2017.08.08
Spring MVC (XML 설정 기반)  (0) 2017.08.08
AOP(Aspect Oriented Programming)  (0) 2017.08.02
IoC(Inversion of Control) 컨테이너  (0) 2017.08.01

댓글