코드저장소/mybatis(ibatis)

mybatis와 ibatis 반복문 비교하기(foreach vs iterate)

개발로짜 2014. 11. 17. 10:23

Mybatis와 ibatis의 반복문에 대해서 알아보도록 하겠습니다.


보통 SQL 쿼리에서 IN절에 사용되는 방법입니다.

기본적으로 한 종류의 타입의 리스트 객체를 이용합니다.


Mybatis와 ibatis 태그를 나누어서 사용방법을 포스팅하겠습니다.


기본 ibatis 연동법에서 POM.XML의 IBATIS 관련 DEPENDENCY 설정부분을 빼고 

포스팅을 하였습니다.



2014/11/17 - [개발에필요한연동법/스프링연동] - Spring3 + ibatis(아이바티스) 연동해보고 쿼리결과값 콘솔에 출력해보기


pom.xml에 추가해주실 DEPENDENCY 부분은 다음과 같습니다.



IBATIS POM.XML DEPENDENCY 추가코드


<dependency>
	<groupId>org.apache.ibatis</groupId>
	<artifactId>ibatis-sqlmap</artifactId>
	<version>2.3.4.726</version>
</dependency>
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${spring-framework.version}</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-orm</artifactId>
	<version>${spring-framework.version}</version>
</dependency>




샘플테이블은 MySQL의 information_schema DB의 'TABLES' 테이블 기준으로 설명드리도록 하겠습니다.

※ 해당 샘플을 따라해보시려면 application-config.xml파일내에 존재하는 

datasource태그의 url 값의 db명을 "information_schema"로 변경하시면 되겠습니다.




컨트롤러 코드 먼저 작성해보도록 하겠습니다.


@RequestMapping("/list")
public void list(){
	try {
		Map<String, Object> hmap = new HashMap<String, Object>();
		ArrayList<String> dbList = new ArrayList<String>();
		dbList.add("mysql");
		dbList.add("test");
		hmap.put("dbList", dbList);
		studyDao.list(hmap);
	} catch (Exception e) {
		e.printStackTrace();
	}
}


Dao 인터페이스 추가 코드입니다.


public void list(Map<String, Object> hmap) throws SQLException;


DaoImpl 클래스 코드입니다.(Mybatis)


@Override
public void list(Map<String, Object> hmap) throws SQLException {
	query.selectList("query.list",hmap);
}


DaoImpl클래스 코드입니다.(ibatis)


@Override
public void list(Map<String, Object> hmap) throws SQLException {
	query.queryForList("query.list",hmap);
}



위코드를 보시면 DaoImpl에서 별도로 return 을 해주지 않았습니다.

그 이유는 단순하게 IN절내에 정상적인 Parameter값들이 들어가는지 

쿼리로그로 확인을 하기위하여 별도의 return 타입을 작성하지 않았습니다.


마지막으로 Mybatis(foreach 태그)와 IBATIS(iterate 태그) 별 쿼리 XML 태그는 다음과 같습니다.




Mybatis foreach 태그코드


<select id="list" parameterType="java.util.Map" resultType="java.util.Map">
	SELECT * 
	FROM TABLES 
	WHERE TABLE_SCHEMA IN
	<foreach item="item" index="index" collection="dbList" open="(" close=")" separator=",">
      		#{item}
	</foreach>
</select>


ibatis iterate 태그코드

<select id="list" parameterClass="java.util.Map" resultClass="com.spring.study.vo.ListVo">
	SELECT table_name FROM TABLES 
	WHERE TABLE_SCHEMA IN
	<iterate  property="dbList" open="(" close=")" conjunction=",">
		#dbList[]#
	</iterate>
</select>



mybatis의 경우는 collection에 넘겨준 단일타입의 List객체명을 작성해주시면 되겠으며 

ibatis의 경우는 property에 넘겨준 단일타입 List 객체명을 작성해주시면됩니다.


실행을 해보도록 하겠습니다.









 List객체로 넘긴 Parameter가 정상적으로 구분자를 통하여 IN PARAMETER에 넘어왔으면 

총 28개의 결과값을 출력한 것을 확인 할 수 있었습니다.


ibatis의 경우는 별도의 로그가 출력되지 않을것입니다.


   에러가 안나면 정상적으로 쿼리조회가 완료 된것이므로 신경쓰지 않으셔도 되겠습니다.

   mybatis처럼 resultClass를 Map타입으로 받아오지 못하는 관계로 

임의로 VO 객체를 RESULTCLASS로 받게끔 처리해두었습니다.




by 개발로짜