티스토리 뷰

 업무개선안을 하면서 iBatis 라는 SqlMapper 프레임워크를 사용하는데, 이 녀석이 생각보다 다루기가 까다롭더군요. (아마도 제가 다룬지 얼마 안돼서 그렇겠지만...) 어제는 하루 종일 아래와 같은 형태의 쿼리를 어떻게 하면 구성할 수 있을까? 라는 고민을 계속하면서 삽질의 삽질을 계속했습니다.

 iterate 를 이용하면 된다는 것은 이미 manual 을 통해서 봤지만, 이게 다중 파라메터 Query 를 구성할 경우에는 자바 소스에서 어떤식으로 파라메터를 넘겨야하는지를 모르겠더군요.
SELECT
   *
FROM
   ADM.DBCFG
WHERE
   DBNAME = ?
   AND INPUT_DATE IN ( ? , ?, ?, ? )

 아주 단순한 쿼리이지만... -_-; 예제의 어떤 곳에도 파라메터 2개를 넘기는 방식으로 짜놓은게 없었기 때문에 막상 처리하려니 어떻게 넘겨야하나 라는 고민을 했습니다.

 결론은 정말 간단하더군요. -_-;; 

SQL.xml
 <select id="dbm.selectDBCfgByDBNameAndInputDate" parameterClass="java.util.HashMap" resultMap="retmapDBCfgVo">
SELECT
 *
FROM
 ADM.DBCFG
WHERE
 DBNAME = #dbname#
 <iterate property="input_date" prepend ="AND INPUT_DATE IN " open="(" close=")" conjunction="," >
  #input_date[]#
 </iterate>
 </select>

Java.java
 public List<DBCfgVo> getDBCfgList(String dbname, List<String> date) {
  SqlMapClient sqlMapper = SqlMapperMgr.getSqlMapClient(MAPPERTYPE.DBMDB);
  List<DBCfgVo> list = null;
  
  Map<String, Object> map = new HashMap<String, Object>();
  map.put("dbname", dbname);
  map.put("input_date", date);
  
  try {
   list = (List<DBCfgVo>)sqlMapper.queryForList("dbm.selectDBCfgByDBNameAndInputDate",map);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return list;
 }
 이야기의 핵심은 결국 Object 타입으로 HashMap 을 구성해서 던지면 iBatis 가 자동으로 이걸 판단해서 넣는다는 것입니다. 단, 여기에는 전제조건이 반드시 List 타입 변수는 property 라는 xml 어트리뷰트로 명시해야하죠. (저걸 안하니까 에러가... -_-;;)