프로그래밍/iBatis
ibatis 에서 모든 테이블에 적용되는 쿼리 만들기 (Substitution Strings 사용)
ismydream
2009. 12. 15. 13:01
ibatis 를 사용하다보면 테이블 이름만 다를 뿐이지 동일한 쿼리를 실행해야 할 경우가 있다.
예를 들면 SELECT count(*) FROM person 같은 쿼리인데 이 쿼리는 테이블 이름만 바꾸면 다른 테이블에도 적용 가능한 쿼리이다.
<select id="cm-count" resultClass="java.lang.Integer" parameterClass="java.lang.String"> SELECT count(*) as value FROM $tableName$ </select>
위 쿼리를 보면 일반 쿼리와 다른 점이 있다. 바로 $tableName$ 부분이다. inline parameter(ex> #value#) 와는 다르게 $ 표시로 감싸져 있다.
ibatis 내에서 해당 쿼리를 실행하기 전에 $tableName$ parameter 를 parameterClass 로 치환해준다.
따라서 우리가 해당 쿼리를 호출하는 코드 부분에서 parameter 로 person 스트링을 넘겼다면 해당 쿼리는 SELECT count(*) as value FROM person 으로 실행될 것이다.
public int count( String tableName) { SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance(); try { Integer count = (Integer)sqlMap.queryForObject("cm-count", tableName); return count.intValue(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return -1; }
ex.count("person")
위 코드는 실제로 호출하는 부분이다. 따라서 호출하는 곳에서 인자값을 바꾸어준다면 모든 테이블에 대해 적용이 가능하게 된다.
따라서 공용객체와 공용xml 을 만들면 조금은 귀차니즘을 덜 수 있을거라 생각된다.
흠.. 매뉴얼을 보다보니 새로운 걸 많이 보게 되네...