728x90
반응형
참고 도서
|
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 |
댓글