1. DaoSupport는 Template를 제공해 준다.
따라서 DaoImp에는 Template 변수가 필요 없어지고, 해당 변수에 대한 setter도 필요없어짐
그렇기 때문에 해당 소스에 set관련 부분이 존재하지 않음

2. 또한 Template를 사용하는 이유는 Template class는 Runtime Exception발생으로 소스상에
try ~ catch, 구문이 필요없다. (DataAccess Exception 발생)


DeptVO.java

package test;

public class DeptVO {
 private int no;
 private String name;
 private String location;
 
 public DeptVO() {
  // TODO Auto-generated constructor stub
 }
 
 public int getNo() {
  return no;
 }
 public void setNo(int no) {
  this.no = no;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getLocation() {
  return location;
 }
 public void setLocation(String location) {
  this.location = location;
 }
 @Override
 public String toString() {
  return "DeptVO [location=" + location + ", name=" + name + ", no=" + no
    + ", toString()=" + super.toString() + "]";
 }
}


DeptDao.java

package test;

import java.util.List;

public interface DeptDao {

 Object add(DeptVO vo);
 int remove(int deptno);
 int update(DeptVO vo);
 DeptVO info(int deptno);
 List<DeptVO> list();
 
}


DeptDaoImp.java

package test;

import java.util.List;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

/*
 * Spring + ibatis 연동
 * SqlMapClientDaoSupport 클래스를 상속받아서 Dao구현 클래스를 작성한다.
 *  1. support 클래스가 SqlMapClientTemplate 객체를 제공해 준다.
 *     => 이런 이유로  dao 구현 클래스에는 순수 CRUD 코드만 남는다. (변수나, setter 메소드가 필요없어짐)
 *  2. 전제조건 : SqlMapClientDaoSupport를 상속받고
 *              Dao 구현 클래스에 SqlMapClient 객체를 주입해줘야 한다. (주입은 설정파일에서)
 */

public class DeptDaoImp extends SqlMapClientDaoSupport implements DeptDao {
 
 @Override
 public Object add(DeptVO vo) {
  // TODO Auto-generated method stub
  return getSqlMapClientTemplate().insert("add", vo);
 }

 @Override
 public DeptVO info(int deptno) {
  // TODO Auto-generated method stub
  //select의 결과가 1개
  return (DeptVO)getSqlMapClientTemplate().queryForObject("info", deptno);
 }

 @Override
 public List<DeptVO> list() {
  // TODO Auto-generated method stub
  //select의 결과가 다수
  return getSqlMapClientTemplate().queryForList("list");
 }

 @Override
 public int remove(int deptno) {
  // TODO Auto-generated method stub
  return getSqlMapClientTemplate().delete("remove", deptno);
 }

 @Override
 public int update(DeptVO vo) {
  // TODO Auto-generated method stub
  return getSqlMapClientTemplate().update("update", vo);
 }

}


dept.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">

<!-- Mapper 파일 -->
<sqlMap namespace="dept">

 <!-- CRUD작업과 관련된 SQL 구문을 정의한다. -->
 <insert id="add" parameterClass="test.DeptVO">
  INSERT
  INTO DEPT(DEPTNO, DNAME, LOC)
  VALUES(#no#, #name#, #location#)
 </insert> 

 <!--
  parameterClass는 클래스 타입만 기술가능함
  기본자료형은 자료형의 이름으로 기술함 : int = java.lang.Integer
  parameter가 2개 이상이면 무조건 VO를 사용
  -->

 <delete id="remove" parameterClass="int">
  DELETE
  FROM DEPT
  WHERE DEPTNO = #value#
 </delete>
 
 <!--
  select의 결과 컬럼이름과 VO의 멤버변수 이름하고 같아야 결과를 정상적으로 반환 받을 수 있음
  아래처럼 컬럼의 이름이 VO의 멤버변수명과 다를때는 as를 이용하여 VO의 멤버변수명과 같도록 해줌
  resultClass : 쿼리문 실행 후 얻어진 결과값(한개의 튜플)을 저장할 객체타입을 지정
 -->

 <select id="info" parameterClass="int" resultClass="test.DeptVO">
  SELECT DEPTNO as no, DNAME as name, LOC as location
  FROM DEPT
  WHERE DEPTNO = #value#
 </select>
 
 <!--
  결과 집합이 여러개의 행으로 얻어지더라도 resultClass에는 한개의 튜플과 매핑되는 class 타입을 지정
  resultClass의 VO멤버변수명과 쿼리 결과의 컬럼명 이름이 반드시 같아야함(대소문자는 구분 안함)
 -->
 <select id="list" resultClass="test.DeptVO">
  SELECT DEPTNO AS NO, DNAME AS NAME, LOC AS LOCATION
  FROM DEPT
 </select>
 
</sqlMap>


SqlMapConfig.xml

 <?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>

 <!-- spring과 연동하는 경우, sql구문이 정의된 xml파일을 등록한다. -->
 <sqlMap resource="test/dept.xml"/>
 
 <!-- 여러개일 경우는 아래와 같이 계속 추가해 주면 됨
 <sqlMap resource="test/emp.xml"/>
 <sqlMap resource="test01/dept/dept_01.xml"/>
 <sqlMap resource="test02/emp/emp_01.xml"/>
 -->

 
</sqlMapConfig>


test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
 
 xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


 <!-- 1. dataSource 생성 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
  <property name="url" value="jdbc:oracle:thin:@192.168.1.6:1521:mini"></property>
  <property name="username" value="scott"></property>
  <property name="password" value="global"></property>
 </bean>

 
 <!-- 2. ibatis 코딩을 지원해주는 SqlMapClient 객체생성 -->
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="dataSource" ref="dataSource"></property>
  <property name="configLocation" value="src/test/SqlMapConfig.xml"></property>
 </bean>

 <!-- 3. DeptDaoImp -->
 <!-- SqlMapClientDaoSupport를 상속받은 경우 템플릿을 생성할 필요가 없다 -->
 <bean id="deptDao" class="test.DeptDaoImp">
  <property name="sqlMapClient" ref="sqlMapClient"></property>
 </bean>

 
</beans>


DeptApp.java

package test;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class DeptApp {

 public static void main(String[] args) {
  
  ApplicationContext context = new FileSystemXmlApplicationContext("src/test/test.xml");
  
  DeptDao dao = (test.DeptDao)context.getBean("deptDao");
  
  DeptVO vo = dao.info(20);
  System.out.println("1 : " + vo.toString());
  
  DeptVO inVo = new DeptVO();
  inVo.setNo(60);
  inVo.setName("snoopy");
  inVo.setLocation("tistory");
  
  Object obj = dao.add(inVo);
  System.out.println("2 : " + obj);
  
  List<DeptVO> list = dao.list();
  System.out.println("3 : " + list.toString());

  int removeSuccess = dao.remove(50);
  System.out.println("4 : "+ ((removeSuccess == 1) ? "삭제성공":"삭제실패"));
  
 }
}


결과




+ Recent posts