ibatis 에서 모든 테이블에 적용되는 쿼리 만들기 (Substitution Strings 사용)

프로그래밍/iBatis 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 을 만들면 조금은 귀차니즘을 덜 수 있을거라 생각된다.
흠.. 매뉴얼을 보다보니 새로운 걸 많이 보게 되네...
: