Spring
DAO 클래스를 구성하는 방법
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardDao;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;
// DAO
@Repository("boardDao")
public class BoardDaoImpl extends JdbcDaoSupport implements BoardDao{
public BoardDaoImpl() {
System.out.println("==> BoardDaoImpl 객체 생성");
}
Connection conn = null;
PreparedStatement pstmt=null;
private ResultSet rs;
private final String BoardInsert = "insert into board(seq, title, writer, content)"
+ " values((select nvl(max(seq), 0)+1 from board), ?, ?, ?)";
private final String BoardUpdate = "update board set title=?, writer=?, content=? where seq=?";
private final String BoardDelete = "delete from board where seq=?";
private final String BoardSelectAll = "select * from board order by seq asc";
private final String BoardSelectTitle = "select * from board where title like ? order by seq asc";
private final String BoardSelectWriter = "select * from board where writer like ? order by seq asc";
// set 인잭션(super를 사용해 상속받아 사용, applicationContext.xmp 동일한 id에서 실행
@Autowired
public void setSuperDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
}
@Override
public void insertBoard(BoardVO vo) {
Object args [] = {vo.getTitle(), vo.getWriter(), vo.getContent()};
getJdbcTemplate().update(BoardInsert, args);
}
@Override
public void updateBoard(BoardVO vo) {
Object args [] = {vo.getTitle(), vo.getWriter(), vo.getContent(), vo.getSeq()};
getJdbcTemplate().update(BoardUpdate, args);
}
@Override
public void deleteBoard(BoardVO vo) {
Object args [] = {vo.getSeq()};
getJdbcTemplate().update(BoardDelete, args);
}
테이블의 쿼리문을 실행하기 위해 JdbcDaoSupport를 상속받아 DAO 클래스를 구성할 수 있다.
쿼리문의 변수는 오브젝트로 arg의 배열값으로 받아 처리했다.
selectOne과 selectAll
@Override
public BoardVO getBoard(BoardVO vo) {
Object args [] = {vo.getSeq()};
return getJdbcTemplate().queryForObject(BoardSelectOne, new BoardRomMapper(), args);
}
@Override
public List<BoardVO> getBoardList(BoardVO vo) {
if(vo.getCh1() == null || vo.getCh2()=="" || vo.getCh2().equals("")) {
return getJdbcTemplate().query(BoardSelectAll, new BoardRomMapper() );
}else if(vo.getCh1().equals("title")) {
return getJdbcTemplate().query(BoardSelectTitle, new BoardRomMapper(), "%" + vo.getCh2() + "%");
}else if(vo.getCh1().equals("writer")) {
return getJdbcTemplate().query(BoardSelectWriter, new BoardRomMapper(), "%" + vo.getCh2() + "%");
}
return null;
}
}
// BoardRomMapper 만들기
class BoardRomMapper implements RowMapper<BoardVO>{
//BoardVO의 객체값을 동작 후 리턴한다.
@Override
public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
BoardVO board = new BoardVO();
board.setSeq(rs.getInt("seq"));
board.setTitle(rs.getString("title"));
board.setWriter(rs.getString("writer"));
board.setContent(rs.getString("content"));
board.setRegDate(rs.getDate("regDate"));
board.setCnt(rs.getInt("cnt"));
return board;
}
select 쿼리문을 실행하기 위해 RomMapper 클래스를 따로 작성해주어 쿼리문을 실행하기 위한 BoardVO의 객체값을 받아와 작성한 뒤 다시 리턴 해준다.(public은 한 파일당 하나의 클래스만 존재할 수 있음으로 class로만 작성!)
package com.springbook.biz.user.Impl;
import java.sql.*;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
import com.springbook.biz.user.UserDao;
import com.springbook.biz.user.UserVO;
@Repository
public class UserDaoImpl extends JdbcDaoSupport implements UserDao{
public UserDaoImpl() {
System.out.println("==> UserDaoImpl 객체생성 ");
}
Connection conn =null;
PreparedStatement pstmt=null;
ResultSet rs = null;
private final String SQL ="select * from users where id=? and password = ? ";
// JdbcTemplate 사용
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<UserVO> getUser(UserVO vo) {
String id = vo.getId();
String password = vo.getPassword();
Object args [] = { id, password } ;
return jdbcTemplate.query(SQL, new UserRowMapper(), args);
}
JdbcTemplate 을 사용하여 XML파일의 ID값을 정한 리소스를 불러와 데이터를 연동하여 사용할 수 있다.
<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- Spring JDBC 설정 -->
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Transaction 설정 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Transaction advice 설정 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- AOP 설정을 통한 Transaction 적용 -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.springbook.biz..*(..))" />
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
<bean id="log" class="com.springbook.biz.common.LogAdvice"/>
<aop:config>
<aop:pointcut id="allPointcut"
expression="execution(* com.springbook.biz..*Impl.*(..))" />
<aop:aspect ref="log">
<aop:before method="printLog" pointcut-ref="allPointcut" />
</aop:aspect>
</aop:config>
xml 파일에서 트랜잭션을 적용하는 방법이다.
데이터소스, Jdbc, 트랜잭션설정, 트랜잭션 어드바이스설정, aop 트랜잭션 적용을 통해 상호간의 호출 방법에 대해 알아볼수 있다.
정확하게 어디로 이동하는지를 확인하도록 !