dataSource.properties
#DataSource Properties
jdbc.driveClassName=org.h2.Driver
jdbc.url=jdbc:h2:tcp://localhost/~/test
jdbc.username=username
jdbc.password=password
.xml 파일
<beans ...생략... >
<!-- DataSource 등록 -->
<context:property-placeholder location="classpath:datasource.properties"/>
<!-- DataSource 설정 정보 입력 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driveClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- JdbcTemplate bean 등록-->
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
id="dataSource"
인 bean에 연결해준다.
- destory-method를 이용하여 bean 소멸 전 close 메소드를 실행해준다.
- setter 주입을 통해 dataSource 객체를 주입해준다.
- DAO 클래스에서 @Autowired를 이용해 타입을 주입해줄 것이다.
StudentDAOSpring.java
@Repository //DAO 객체 등록
public class StudentDAOSpring implements StudentDAO{
@Autowired //타입 주입
private JdbcTemplate spring;
// SQL 명령어
private final String STUDENT_INSERT = "insert into student(num, sex, name, role) values((select nvl(max(seq), 0) + 1 from student), ?, ?, ?)";
private final String STUDENT_UPDATE = "update student set name = ?, role = ? where num = ?";
private final String STUDENT_DELETE = "delete student where num = ?";
private final String STUDENT_LIST_N = "select * from student where name like '%'||?||'%' order by num desc";
private final String STUDENT_LIST_R = "select * from student where role like '%'||?||'%' order by num desc";
private final String STUDENT_GET = "select * from student where num = ?";
// CRUD 기능의 메소드
// 학생 정보 등록
public void insertStudent(StudentVO vo) {
System.out.println("===> SPRING 기반으로 insertStudent() 기능 처리");
spring.update(STUDENT_INSERT, vo.getSex(), vo.getName(), vo.getRole());
}
// 학생 정보 수정
public void updateStudent(StudentVO vo) {
System.out.println("===> SPRING 기반으로 updateStudent() 기능 처리");
spring.update(STUDENT_UPDATE,vo.getName(),vo.getRole(),vo.getNum());
}
// 학생 정보 삭제
public void deleteStudent(StudentVO vo) {
System.out.println("===> SPRING 기반으로 deleteStudent() 기능 처리");
spring.update(STUDENT_DELETE,vo.getNum());
}
// 학생 상세 조회
public StudentVO getStudent(StudentVO vo) {
System.out.println("===> SPRING 기반으로 getStudent() 기능 처리");
return spring.queryForObject(STUDENT_GET, new StudentRowMapper(), vo.getNum());
}
// 학생 목록 검색
public List<StudentVO> getStudentList(StudentVO vo) {
System.out.println("===> SPRING 기반으로 getStudentList() 기능 처리");
if(vo.getSearchCondition().equals("NAME")) {
return spring.query(STUDENT_LIST_N, new StudentRowMapper(), vo.getSearchKeyword() );
}else if(vo.getSearchCondition().equals("ROLE")) {
return spring.query(STUDENT_LIST_R,new StudentRowMapper(), vo.getSearchCondition());
}
return null;
}
}
StudentRowMapper.java
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class StudentRowMapper implements RowMapper<StudentVO> {
@Override
public StudentVO mapRow(ResultSet rs, int rowNum) throws SQLException {
StudentVO student = new StudentVO();
student.setNum(rs.getInt("NUM"));
student.setSex(rs.getString("SEX"));
student.setName(rs.getString("NAME"));
student.setRole(rs.getString("ROLE"));
student.setRegDate(rs.getDate("REGDATE"));
return student;
}
}
- 은행에서 A가 B에게 100만원을 송금을 한다. -> A의 통장에서 100만원이 빠져나간다. -> 전기가 끊긴다. -> B는 100만원을 받지 못했다. -> A의 통장에서는 100만원이 빠져나갔다.
tx
체크 (Eclipse 기준)<!-- Transaction -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 모든 메소드에서 예외 발생하면 롤백되며, 예외가 발생하지 않으면 자동으로 커밋된다.-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<tx:attributes>
name
: Transaction이 적용될 메소드 이름 지정 ( Ex:*Service
: 이름이 Service로 끝나는 메소드)read-only
: 읽기 전용 여부를 지정 (default값 : false)no-rollback-for
: Transaction을 롤백하지 않을 예외 지정rollback-for
: Transaction을 롤백할 예외 지정
<!-- pointcut 지정 -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.naver.biz..*Service.*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
Reference: