본문 바로가기

카테고리 없음

Spring 2.5.6에서 SqlMapClientDaoSupport을 이용하여 iBATIS 2.3.4와 연동하는 예

테스트 환경: iBATIS와 관련한 기초정보는 여기를 보세요
iBATIS CRUD Example --> Go!

Spring 2.5.6
iBATIS 2.3.4
JDK 1.6
Tomcat 5.5 (Tomcat 6.0을 이용한 테스트에서 실패함)
Eclipse 3.5
Oracle 10g


테스트하기 위한 최소한의 라이브러리
아래의 라이브러리들이 Eclipse에서 사용할 수 있도록 프로젝트가 설정되어야 한다

1. Spring 2.5.6에 포함되어 있는 라이브러리
commons-logging.jar
spring.jar
spring-webmvc.jar
standard.jar
jstl.jar
xalan-1.2.7.jar
2. Oracle JDBC Driver
ojdbc14.jar
3. Apache commons Library
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.5.4.jar
4. iBATIS라이브러리
ibatis-2.3.4.726.jar
5. Tomcat 5.5 라이브러리



Eclipse에 등록된 라이브러리와 구성파일들 (아래에 보이지 않는 라이브러리들은 Tomcat의 common/lib안에 복사했기 때문에 [Libraries]항목을 선택하여 [Apache Tomcat 5.5] 항목을 찾아 보면 발견할 수 있다.


WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>
      index.jsp
    </welcome-file>
  </welcome-file-list>
 
  <filter>
   <filter-name>encodingFilter</filter-name>
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC-KR</param-value>
   </init-param>
  </filter>
 
  <filter-mapping>
   <filter-name>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>




WEB-INF/dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean name="/hello.htm"
 class="test.HelloController"/>

<!--Datasource 가 Weblogic서버나 iBATIS 측에 이미 설정되어 있다면 아래의 Datasource 설정은 필요없다->
<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" />

<bean id="transactionManager"
 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
 p:dataSource-ref="dataSource" />
 
<bean id="sqlMapClient"
 class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
 p:dataSource-ref="dataSource" <!--iBATIS, Weblogic 측에 이미 Datasource가 설정된 경우라면 이 속성은 불필요함-->
 p:configLocation="classpath:SqlMapConfig.xml"
 p:useTransactionAwareDataSource="true"/>

<bean id="ibatisDao"
 class="kr.co.micropilot.ibatis.IBatisDao"
 p:sqlMapClient-ref="sqlMapClient" />

<bean name="/ibatis.htm"
 class="kr.co.micropilot.ibatis.IBatisMultiActionController"
 p:ibatisDao-ref="ibatisDao"
 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>

</beans>





WEB-INF/classes/Employee.xml (SQL문장을 등록하고 질의 결과를 자바객체와 연결하기 위한 설정, 맵파일)
이 파일은 iBATIS의 주설정 파일인 SqlMapConfig.xml에 포함된다.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">

  <!-- Use type aliases to avoid typing the full classname every time. -->
  <typeAlias alias="Employee" type="kr.co.micropilot.ibatis.Employee"/>

  <!-- Result maps describe the mapping between the columns returned
       from a query, and the class properties.  A result map isn't
       necessary if the columns (or aliases) match to the properties
       exactly. -->
  <resultMap id="EmployeeResult" class="Employee">
 <result property="empno" column="EMPNO"/>
 <result property="ename" column="ENAME"/>
 <result property="hiredate" column="HIREDATE"/>
  </resultMap>

  <!-- Select with no parameters using the result map for Employee class. -->
  <select id="selectAllEmployee" resultMap="EmployeeResult">
    select * from EMPLOYEE
  </select>

  <!-- A simpler select example without the result map.  Note the
       aliases to match the properties of the target result class. -->
  <select id="selectEmployeeByEmpno" parameterClass="int" resultClass="Employee">
    select
      EMPNO as empno,
      ENAME as ename,
      HIREDATE as hiredate
    from EMPLOYEE
    where EMPNO = #empno#
  </select>
  
  <!-- Insert example, using the Employee parameter class -->
  <insert id="insertEmployee" parameterClass="Employee">
    insert into Employee (
      EMPNO,
   ENAME,
   HIREDATE
    values (
      #empno#, #ename#, #hiredate#
    )
  </insert>

  <!-- Update example, using the Employee parameter class -->
  <update id="updateEmployeet" parameterClass="Employee">
    update EMPLOYEE set
      EMPNO = #empno#,
      ENAME = #ename#,
      HIREDATE = #hiredate#
    where
      EMPNO = #empno#
  </update>

  <!-- Delete example, using an integer as the parameter class -->
  <delete id="deleteEmployeeByEmpno" parameterClass="int">
    delete from Employee where EMPNO = #empno#
  </delete>

</sqlMap>



WEB-INF/classes/SqlMapClientConfig.xml (iBATIS의 주 설정파일, 자바코드에서 이 파일을 읽어들인다)

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

  <!-- Configure a built-in transaction manager.  If you're using an
       app server, you probably want to use its transaction manager
       and a managed datasource -->
      
<!-- Spring설정파일의 데이터소스를 사용할 것이므로 여기서 DB연결정보를 설정할 필요가 없음-->
<!--
  <transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"/>
      <property name="JDBC.Username" value="scott"/>
      <property name="JDBC.Password" value="koreait"/>
    </dataSource>
  </transactionManager>
 -->
  <!-- List the SQL Map XML files. They can be loaded from the
       classpath, as they are here (com.domain.data...) -->
  <sqlMap resource="Employee.xml"/>
  <!-- List more here...
  <sqlMap resource="com/mydomain/data/Order.xml"/>
  <sqlMap resource="com/mydomain/data/Documents.xml"/>
  -->

</sqlMapConfig>



IBatisDao.java (iBATIS의 SqlMapClient객체를 쉽게 얻을 수 있도록 Spring 프레임워크에서 지원하는 SqlMapClientDaoSupport클래스를 상속했기 때문에 getSqlMapClient()메소드를 이용하여 SqlMapClient객체를 얻을 수 있다)
iBATIS에서는 SqlMapClient객체가 모든 SQL문장을 실행하고 결과를 리턴하는 메소드를 가지고 있기 때문에 SqlMapClient객체만 얻어 낸다면 iBATIS의 모든 기능을 Spring프레임워크에서도 이용할 수 있게 되는 것이다.

참고: 이 클래스에서 getSqlMapClient()를 이용하여 SqlMapClient객체를 얻을 수 있게 하려면, dispatcher-server.xml에 sqlMapClient객체를 선언한 후에 이 클래스로 주입(Dependency Injection)해 주어야 한다. 즉, 다음과 같이 설정해야 한다.


<bean id="sqlMapClient"
 class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
 p:dataSource-ref="dataSource"
 p:configLocation="classpath:SqlMapConfig.xml"
 p:useTransactionAwareDataSource="true"/>

<bean id="ibatisDao"
 class="kr.co.micropilot.ibatis.IBatisDao"
 p:sqlMapClient-ref="sqlMapClient" />


p:configLocation="classpath:SqlMapConfig.xml"  대신에 속성 값으로 "WEB-INF/classes/SqlMapConfig.xml 으로 해도 된다.



IBatisDao.java

package kr.co.micropilot.ibatis;

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

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.client.SqlMapClient;

public class IBatisDao extends SqlMapClientDaoSupport {

 public List selectAllEmployee () throws SQLException {
  return getSqlMapClient().queryForList("selectAllEmployee");
    }

    public Employee selectEmployeeByEmpno(int empno) throws SQLException {
      return (Employee) getSqlMapClient().queryForObject("selectEmployeeByEmpno", empno);
    }

    public void insertEmployee (Employee emp) throws SQLException {
     getSqlMapClient().insert("insertEmployee", emp);
    }

    public void updateEmployee (Employee emp) throws SQLException {
     getSqlMapClient().update("updateEmployee", emp);
    }

    public void deleteEmployee (int empno) throws SQLException {
     getSqlMapClient().delete("deleteEmployee", empno);
    }
}



IBatisMultiActionController.java (위에 선언된 IBatisDao 를 주입받아서 사용하는 Spring의 MultiActionController)

package kr.co.micropilot.ibatis;

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

public class IBatisMultiActionController extends MultiActionController {
 
 private IBatisDao ibatisDao;

/* Dependency Injection을 위한 메소드 */ 
public void setIbatisDao(IBatisDao ibatisDao) {
  this.ibatisDao = ibatisDao;
 }

 public ModelAndView selectAllEmployee(HttpServletRequest request, HttpServletResponse response){
  List list = null;
  try{
   list = ibatisDao.selectAllEmployee();
  }catch(SQLException sqle){
   sqle.printStackTrace();
  }
  ModelAndView mav = new ModelAndView();
  mav.setViewName("searchResult");
  mav.addObject("empList", list);
  return mav;
 }
 
 public ModelAndView selectEmployeeByEmpno(HttpServletRequest request, HttpServletResponse response){
  int empno = Integer.parseInt(request.getParameter("empno"));
  Employee emp = null;
  try{
    emp = ibatisDao.selectEmployeeByEmpno(empno);
  }catch(SQLException sqle){
   sqle.printStackTrace();
  }
  ModelAndView mav = new ModelAndView();
  mav.setViewName("searchResult");
  mav.addObject("emp", emp);
  return mav;
 }
 
 public ModelAndView insertEmployee(HttpServletRequest request, HttpServletResponse response){
  Employee emp = new Employee();
  emp.setEmpno(Integer.parseInt(request.getParameter("empno")));
  emp.setEname(request.getParameter("ename"));
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  java.sql.Date hiredate = null;
  
  try{
   hiredate = new java.sql.Date(sdf.parse(request.getParameter("hiredate")).getTime());
   emp.setHiredate(hiredate);
   ibatisDao.insertEmployee(emp);
  }catch(Exception e){
   e.printStackTrace();
  }
  ModelAndView mav = new ModelAndView();
  mav.setViewName("insertResult");
  mav.addObject("emp", emp);
  return mav;
 }
 
 public ModelAndView updateEmployee(HttpServletRequest request, HttpServletResponse response){
  Employee emp = new Employee();
  emp.setEmpno(Integer.parseInt(request.getParameter("empno")));
  emp.setEname(request.getParameter("ename"));
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  java.sql.Date hiredate = null;
  
  try{
   hiredate = new java.sql.Date(sdf.parse(request.getParameter("hiredate")).getTime());
   emp.setHiredate(hiredate);
   ibatisDao.updateEmployee(emp);
  }catch(Exception e){
   e.printStackTrace();
  }
  ModelAndView mav = new ModelAndView();
  mav.setViewName("updateResult");
  mav.addObject("emp", emp);
  return mav;
 }
 
 public ModelAndView deleteEmployee(HttpServletRequest request, HttpServletResponse response){
  int empno = Integer.parseInt(request.getParameter("empno"));
  try{
   ibatisDao.deleteEmployee(empno);
  }catch(SQLException sqle){
   sqle.printStackTrace();
  }
  ModelAndView mav = new ModelAndView();
  mav.setViewName("deleteResult");
  mav.addObject("empno", empno);
  return mav;
 }
}



위의 콘트롤러에서 ibatisDao객체를 주입받기 위해서는 Spring설정파일에 다음과 같이 선언해 주어야 한

<bean id="ibatisDao"
 class="kr.co.micropilot.ibatis.IBatisDao"
 p:sqlMapClient-ref="sqlMapClient" />

<bean name="/ibatis.htm"
 class="kr.co.micropilot.ibatis.IBatisMultiActionController"
 p:ibatisDao-ref="ibatisDao"
 p:methodNameResolver-ref="searchControllerNameResolver"/>

<bean id="searchControllerNameResolver"
 class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"
 p:paramName="mode" />




Employee.java (테이블의 데이터와 매핑될 자바 클래스, DTO)

package kr.co.micropilot.ibatis;

import java.sql.Date;
import java.util.*;

public class Employee {
 
 private int empno;
 private String ename;
 private java.sql.Date hiredate;
 
 public Employee() {}

 public Employee(int empno, String ename, Date hiredate) {
  super();
  this.empno = empno;
  this.ename = ename;
  this.hiredate = hiredate;
 }

 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 java.sql.Date getHiredate() {
  return hiredate;
 }

 public void setHiredate(java.sql.Date hiredate) {
  this.hiredate = hiredate;
 }
}



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></tr>
 <c:forEach var="emp"  items="${empList}">
  <tr><td>${emp.empno}</td><td>${emp.ename}</td><td>${emp.hiredate}</td></tr>
 </c:forEach>
 </table>
</c:if>

<c:if test="${!empty emp}">
 [${requestScope.deptno}${requestScope.empno}]를 이용하여 검색된 내용<hr width="40%">
 <table>
 <tr><td>사 번</td><td>이 름</td><td>입사일</td></tr>
<tr><td>${emp.empno}</td><td>${emp.ename}</td><td>${emp.hiredate}</td></tr>
</table>
</c:if>

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


실행 , 웹브라우저를 열고 주소창에 다음과 같은 URL을 입력하고 엔터를 친다.
http://localhost/spring256/ibatis.htm?mode=selectAllEmployee