728x90
반응형

iBatis의 iterate요소를 이용한 동적 쿼리 생성 예제 입니다.


/////  기본환경 정보  /////////////////////////////

1. iBatis 2.3.4

2. JSP3.0

3. Tomcat 7.0

4. Oracle 10g HR 계정의 sample table


아래 그림과 같이 체크박스를 선택해서 JOB_TITLE을 선택하면

HR계정의 JOBS 테이블에 있는 해당 데이터 정보를 출력합니다.




주요소스 설명


/////// iterate.jsp ///////////////////////////////////////////////

<%@ page import="java.util.HashMap"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="exam.day2.dao.Day2Dao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    Day2Dao dao = new Day2Dao();
    ArrayList<HashMap<String, String>> jobIdList = dao.getJobId();  //선택옵션 생성
   
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

    // 체크박스 검색키워드 값을 배열에 담아 넘겨줌

    String[] checkIds = request.getParameterValues("jobId");
    if(checkIds != null){  //체크박스가 하나 이상 선택될경우
        list = dao.getJobs(checkIds);
    }

%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>동적쿼리 iterate</title>
</head>
<body>

<!-- 체크 영역  -->
<div style="float: left;">
  <table border="1">
      <colgroup>
        <col width="20%">
        <col width="40%">
        <col width="20%">
        <col width="20%">
      </colgroup>
     
      <thead>
        <tr>
           <th>JOB_ID</th><th>JOB_TITLE</th><th>MIN_SALARY</th><th>MAX_SALARY</th>
        </tr>
      </thead>
     
      <tbody>
         <!-- jstl을 이용하여 list에 담겨있는 Map의 value값을 호출  -->
         <c:forEach var="list" items="<%=list%>">
            <tr>
              <td>${list.JOB_ID}</td>
              <td>${list.JOB_TITLE}</td>
              <td>${list.MIN_SALARY}</td>
              <td>${list.MAX_SALARY}</td>
            </tr>
           
         </c:forEach>
      </tbody>
   </table>

</div>

<!-- 선택 영역  -->
<div style="float: right;">
    <form action="" method="get">
      <c:forEach var="jobIdList" items="<%=jobIdList%>" >
         <input type="checkbox"  name="jobId" value="${jobIdList.JOB_ID}"

          />${jobIdList.JOB_TITLE} <br />
      </c:forEach>   
      <input type="submit" value="검색" />
    </form>
</div>

</body>
</html>




/////// Day2Dao.java ///////////////////////////////////////////////

package exam.day2.dao;

import java.util.ArrayList;
import java.util.HashMap;
import common.db.IBatisManager;

public class Day2Dao {
    IBatisManager manager = new IBatisManager();
    public Day2Dao() {
        // TODO Auto-generated constructor stub
    }
   
    /**
     * JOBS 테이블의 정보를 반환(String[] 형태의 키값을 받아서 필터링함)
     * @param map
     * @return
     */
    public ArrayList<HashMap<String, String>> getJobs(String[] jobIdArr){
        ArrayList<HashMap<String, String>> list = null;
        HashMap<String, Object> map = new HashMap<String, Object>();
        //넘어온 배열을 맵에 담아 쿼리 실행

        map.put("jobIdArr",jobIdArr);
        list = manager.selectList("query.exam.Day2.getCheckJobs", map);
        return list;
    }
   
    /**
     * JOB_ID를 모두 반환함
     * @return
     */
    public ArrayList<HashMap<String, String>> getJobId(){
        ArrayList<HashMap<String, String>> list = null;
        HashMap<String, Object> map = null;
        list = manager.selectList("query.exam.Day2.getJobs", map);
        return list;
    }
}



/////// Day2.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="query.exam.Day2">
   
    <!-- JOBS 테이블의 모든 로우정보를 받아옴 -->
    <select id="getJobs" resultClass="java.util.HashMap">
        SELECT * FROM JOBS
        <dynamic prepend="where">
             <isNotNull property="job_id">
                 JOB_ID = #job_id#
             </isNotNull>
        </dynamic>
    </select>
   

     <!--

       배열에 담긴 정보를 conjunction 구분자',' 를 이용하여 출력

       IN 구문을 동적으로 생성하며 생성된 구문은 open,close 속성에 의하여

       괄호로 감싸진다.

     -->
    <!-- Check된 JOB_ID와 일치하는 정보를 반환 -->
    <select id="getCheckJobs" resultClass="java.util.HashMap"

                                                           parameterClass="java.util.HashMap">
               SELECT * FROM JOBS
                      <isNotNull prepend="WHERE JOB_ID IN">
                               <iterate property="jobIdArr" open="(" close=")" conjunction=",">
                                      #jobIdArr[]#
                               </iterate>
                      </isNotNull>
    </select>
   
</sqlMap>

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,