JdbcDaoSupport 클래스는 JdbcTemplate 형 객체를 얻을 수 있는 getJdbcTemplate()메소드를 이용하여 매우 간략한 방법으로 데이터베이스 작업을 완성할 수 있다. 우선 설정파일에 DataSource를 설정해야 하는데, 내부적으로 Apache DBCP라이브러리를 필요로 한다.
1. Apache DBCP 라이브러리 다운로드 및 WEB-INF/lib/안에 저장
2. dispatcher-servlet.xml의 관련 부분
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>