테스트 환경: iBATIS와 관련한 기초정보는 여기를 보세요
iBATIS CRUD Example --> Go!
iBATIS 2.3.4
JDK 1.6
Tomcat 5.5 (Tomcat 6.0을 이용한 테스트에서 실패함)
Eclipse 3.5
Oracle 10g
테스트하기 위한 최소한의 라이브러리
아래의 라이브러리들이 Eclipse에서 사용할 수 있도록 프로젝트가 설정되어야 한다
commons-logging.jar
spring.jar
spring-webmvc.jar
standard.jar
jstl.jar
xalan-1.2.7.jar
ojdbc14.jar
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.5.4.jar
ibatis-2.3.4.726.jar
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)해 주어야 한다. 즉, 다음과 같이 설정해야 한다.
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