본문 바로가기

카테고리 없음

JdbcDaoSupport example on Spring 2.5

JdbcDaoSupport 클래스는 JdbcTemplate 형 객체를 얻을 수 있는 getJdbcTemplate()메소드를 이용하여 매우 간략한 방법으로 데이터베이스 작업을 완성할 수 있다. 우선 설정파일에 DataSource를 설정해야 하는데, 내부적으로 Apache DBCP라이브러리를 필요로 한다.

1. Apache DBCP 라이브러리 다운로드 및 WEB-INF/lib/안에 저장


2. dispatcher-servlet.xml의 관련 부분

<bean name="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    p:driverClassName="oracle.jdbc.OracleDriver"
    p:url="jdbc:oracle:thin:@micropilot.co.kr:1521:ORCL"
    p:username="scott"
    p:password="tiger" />

<!-- 데이터베이스 작업이 필요할 때 이 객체를 사용하면 된다(jdbcTemplate를 포함하고 있고, dataSource를 사용함)-->
<bean id="empDao"
    class="test.JdbcTemplateEmpDao"
    p:dataSource-ref="dataSource" />

<!-- 데이터베이스 작업이 필요한 콘트롤러(empDao를 사용함) -->
<bean name="/search.htm"
    class="test.EmpMultiActionController"
    p:empDao-ref="empDao"
    p:methodNameResolver-ref="searchControllerNameResolver" />
 
<bean id="searchControllerNameResolver"
    class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"
    p:paramName="mode" />
 
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>       
</bean>



3. test.JdbcTemplateEmpDao.java

package test;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

/*JdbcDaoSupport클래스는 간결한 데이터베이스 소스를 지원하기 위해 JdbcTemplate 클래스를 지원하고 있다. JdbcTemplate클래스는 JDBC작업을 할 때 정형화된 코드를 내장하고 있기 때문에 반드시 필요한 것들만 전달해 주면 데이터베이스에 연결, PrepatedStatement객체생성, SQL실행등을 담당해 준다.
* JdbcTemplate객체를 사용하기 위해서는 getJdbcTemplate()를 호출하면 된다
* dataSource속성을 가지고 있기 때문에 이 클래스를 설정파일에 등록할 때는 dataSource속성에 dataSource태그의 참조를 * 입력해 주면 된다. 즉, JdbcDaoSupport 클래스는 JdbcTemplate객체와 dataSourc객체를 모두 사용할 수 있는 객체가  된다. JdbcTemplate 을 사용하면 Connection, PreparedStatement, ResultSet 등에 대해 스프링이 제어를 해 주기 때문에 개발자는 좀더 간결한 데이터베이스 코드를 사용할 수 있게 된다.
*/

public class JdbcTemplateEmpDao extends JdbcDaoSupport {

 public List<Emp> searchByDeptno(int deptno){
 
  String sql ="select * from emp where deptno=?";
  List<Emp> list = this.getJdbcTemplate().query(sql, new Object[]{deptno}, new RowMapper(){

   @Override  /* 컬럼과 객체의 속성을 연결하는 규칙을 지정함 */
   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    Emp emp = new Emp(rs.getInt("EMPNO"), rs.getString("ENAME"), rs.getString("JOB"), rs.getInt("DEPTNO"));
    return emp;
   }
  });
  return list;
 }
 
 public List<Emp> searchByEmpno(int empno){
  System.out.println("Dao.searchByEmpno()");
  String sql ="select * from emp where empno=?";
  List<Emp> list = this.getJdbcTemplate().query(sql, new Object[]{empno}, new RowMapper(){

   @Override  /* 컬럼과 객체의 속성을 연결하는 규칙을 지정함 */
   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    Emp emp = new Emp(rs.getInt("EMPNO"), rs.getString("ENAME"), rs.getString("JOB"), rs.getInt("DEPTNO"));
    return emp;
   }
  });
  return list;
 }
}

위에서는 SELECT문장을 이용하는 예만 들었는데, INSERT, UPDATE, DELETE문장을 실행할 필요가 있다면, update()메소드를 이용하면 된다. update 메소드는 다음과 같이 선언되어 있다.

 int update(String sql, Object[] args)
          Issue a single SQL update operation (such as an insert, update or delete statement) via a prepared statement, binding the given arguments.


4. test.EmpMultiActionController.java

package test;

import java.sql.*;
import java.util.*;
import javax.servlet.http.*;
import org.springframework.web.servlet.*;
import org.springframework.web.servlet.mvc.multiaction.*;

public class EmpMultiActionController extends MultiActionController {
 
 private JdbcTemplateEmpDao empDao;
 
 public void setEmpDao(JdbcTemplateEmpDao empDao) {
  this.empDao = empDao;
 }

 public ModelAndView searchByDeptno(HttpServletRequest request, HttpServletResponse response){
  int deptno = Integer.parseInt(request.getParameter("deptno"));
  List<Emp> list = empDao.searchByDeptno(deptno);
  ModelAndView mav = new ModelAndView();
  mav.setViewName("searchResult");
  mav.addObject("empList", list);
  mav.addObject("deptno", deptno);
  return mav;
 }

 public ModelAndView searchByEmpno(HttpServletRequest request, HttpServletResponse response){
  int empno = Integer.parseInt(request.getParameter("empno"));
  List<Emp> list = empDao.searchByEmpno(empno);
  ModelAndView mav = new ModelAndView();
  mav.setViewName("searchResult");
  mav.addObject("empList", list);
  mav.addObject("empno", empno);
  return mav;
 }
}



5. test.Emp.java

package test;

public class Emp {
 
 private int empno;
 private String ename;
 private String job;
 private int deptno;
 
 public Emp() {}

 public Emp(int empno, String ename, String job, int deptno) {
  this.empno = empno;
  this.ename = ename;
  this.job = job;
  this.deptno = deptno;
 }

 public int getEmpno() {
  return empno;
 }

 public void setEmpno(int empno) {
  this.empno = empno;
 }

 public String getEname() {
  return ename;
 }

 public void setEname(String ename) {
  this.ename = ename;
 }

 public String getJob() {
  return job;
 }

 public void setJob(String job) {
  this.job = job;
 }

 public int getDeptno() {
  return deptno;
 }

 public void setDeptno(int deptno) {
  this.deptno = deptno;
 }
}



6. searchResult.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>검색 결과</title>
<script type="text/javascript">

</script>
</head>
<body><center><br></br>

<c:if test="${!empty empList}">
 [${requestScope.deptno}${requestScope.empno}]를 이용하여 검색된 내용<hr width="40%">
 <table>
 <tr><td>사 번</td><td>이 름</td><td>직 무</td><td>부 서</td></tr>
 <c:forEach var="emp"  items="${empList}">
  <tr><td>${emp.empno}</td><td>${emp.ename}</td><td>${emp.job}</td><td>${emp.deptno}</td></tr>
 </c:forEach>
 </table>
</c:if>

</center>
</body>
</html>