mybatis에서 foreach 재질문
- 작성자 :
- 서*
- 작성일 :
- 2014-02-20 14:01:55
- 조회수 :
- 3,851
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
mybatis 컴파일 시 에러가 발생합니다
<?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="TestDAO">
<resultMap id="testList" class="java.util.HashMap">
<result property="testId" column="testId"/>
</resultMap>
<select id="testDAO.selecttestList" parameterType="java.util.HashMap" resultMap="testList">
/* ScenarioCompDAO.selectScenarioCompList 시나리오 조회 */
SELECT A.test_id
FROM test A
WHERE 1 = 1
AND A.test_id IN
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.value}
</foreach>
</select>
java에서 매개변수 : list : ['a1', 'a2', 'a3']
이렇게 되어있습니다
하지만 톰캣 빌드 시 다음과 같은 에러가 발생하고 있습니다
에러내용-------------
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmmUseDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'egov.sqlMapClient' defined in file Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException; lineNumber: 43; columnNumber: 110; 요소 유형 "select"에 대한 "parameterType" 속성을 선언해야 합니다.
org.xml.sax.SAXParseException; lineNumber: 43; columnNumber: 110; 요소 유형 "select"에 대한 "parameterType" 속성을 선언해야 합니다.
에러내용끝------------
select 문 안에 parameterType 을 여러가지로 다 변경해서 시도해봤지만, 전부 같은 에러가 발생하고 있습니다.
<?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="TestDAO">
<resultMap id="testList" class="java.util.HashMap">
<result property="testId" column="testId"/>
</resultMap>
<select id="testDAO.selecttestList" parameterType="java.util.HashMap" resultMap="testList">
/* ScenarioCompDAO.selectScenarioCompList 시나리오 조회 */
SELECT A.test_id
FROM test A
WHERE 1 = 1
AND A.test_id IN
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.value}
</foreach>
</select>
java에서 매개변수 : list : ['a1', 'a2', 'a3']
이렇게 되어있습니다
하지만 톰캣 빌드 시 다음과 같은 에러가 발생하고 있습니다
에러내용-------------
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmmUseDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'egov.sqlMapClient' defined in file Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException; lineNumber: 43; columnNumber: 110; 요소 유형 "select"에 대한 "parameterType" 속성을 선언해야 합니다.
org.xml.sax.SAXParseException; lineNumber: 43; columnNumber: 110; 요소 유형 "select"에 대한 "parameterType" 속성을 선언해야 합니다.
에러내용끝------------
select 문 안에 parameterType 을 여러가지로 다 변경해서 시도해봤지만, 전부 같은 에러가 발생하고 있습니다.
A
안녕하세요.
표준프레임워크센터입니다.
1. mybatis 버전이 3.x.x인지 확인해주세요. (foreach는 3.x.x부터 지원)
2. MyBatis 환경설정에 관해 처음부터 학습해보세요. iBatis를 MyBatis로 변경하고 계신지요?..
iBatis에서 MyBatis로 변경되면서 이름만 바뀐 것이 아니고 사용법도 바뀌었습니다.
코드작성보다는 환경을 정확하게 구성해놓는 것이 먼저입니다.
환경설정부터 잘못되었을거라 판단되는 이유는 XML 매퍼파일 상단에 선언되어야하는 스키마가 잘못되었습니다.
정확하게 사용법을 숙지하신 후 사용하셔야할 것 같습니다.
표준프레임워크에서는 MyBatis 적용가이드를 제공하고 있으며,
확인하신 후 MyBatis 사용을 위한 환경 설정이 제대로 되었는지부터 확인해주세요.
개발가이드>실행환경>표준프레임워크 2.6&2.7에서 Mybatis로 검색하시면 됩니다.
3. 다음은 올려주신 설정내용만으로 판단한 결과입니다.
올려주신 파일말고도 MyBatis 사용을 위한 설정들이 존재하기 때문에 적용가이드를 꼭 한번 읽어보시길 바랍니다.
Error creating bean with name 'egov.sqlMapClient' defined in file Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.
위 에러메시지에서 'sqlMapClient'라는 단어, ibatis.common....가 나온 것으로 보아,
MyBatis 사용을 위한 SqlSessionFactoryBean 설정이 제대로 안되셨으리라 판단됩니다.
SqlMapClientFactoryBean이 아니라 SqlSessionFactoryBean이 등록되어 있어야합니다.
-SqlSessionFactoryBean 설정
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="MyBatis Configuration 파일위치를 지정하세요" />
</bean>
적용가이드에서 Mybatis-Spring 연동부분을 참고하세요.
4. 그리고 올려주신 XML mapper 파일의 상단에는
<?xml version="1.0" encoding="UTF-8"?>~<sqlMap namespace="TestDAO">
이 아니라
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TestDAO">
로 바꾸셔야합니다.
5. 지난 번 답변에서 resutMap에 class 속성은 Mybatis에서 type으로 변경되었다고 말씀드렸습니다.
MyBatis에서 사용되는 태그와 속성설정은 매우 다양하기 때문에 적용가이드 외에 MyBatis 매뉴얼을 참조하셔야 합니다.
<resultMap id="testList" class="java.util.HashMap">
이 아니라
<resultMap id="testList" type="java.util.HashMap">
입니다.
6. collection에 설정하신 list는 자바단에서 넘겨주는 List 객체의 이름이어야합니다.
7. parameterType 속성은 자바단에서 넘겨준 값을 받기 위한 설정으로, hashMap형태로 받은 값을 위 쿼리문 어디에서 사용하시는지요?
이부분에 대한 설명이 필요합니다. 필요없으시면 지우고 사용하세요.
다음은 select 문에서 parameterType에 hashMap을 사용한 예제입니다.
- 자바
HashMap map = new HashMap<String, Object>();
EmpVO emp = new EmpVO();
emp.setEmpNm("표준프레임워크");
...
map.put("emp", emp);
- XML 매퍼파일
<select id="..." parameterType="hashMap" resultType="...">
select ...
from ...
where EMP_NM=#{emp.empNm}
</select>
8. "select 문 안에 parameterType 을 여러가지로 다 변경해서 시도해봤지만," 이라고 말씀하셨는데..
앞서 말씀드렸듯이, MyBatis가 동작할 수 있는 기본 설정을 구성해놓고 원하시는 기능이 구성되도록 변경해보셔야할 것 같습니다.
감사합니다.
표준프레임워크센터입니다.
1. mybatis 버전이 3.x.x인지 확인해주세요. (foreach는 3.x.x부터 지원)
2. MyBatis 환경설정에 관해 처음부터 학습해보세요. iBatis를 MyBatis로 변경하고 계신지요?..
iBatis에서 MyBatis로 변경되면서 이름만 바뀐 것이 아니고 사용법도 바뀌었습니다.
코드작성보다는 환경을 정확하게 구성해놓는 것이 먼저입니다.
환경설정부터 잘못되었을거라 판단되는 이유는 XML 매퍼파일 상단에 선언되어야하는 스키마가 잘못되었습니다.
정확하게 사용법을 숙지하신 후 사용하셔야할 것 같습니다.
표준프레임워크에서는 MyBatis 적용가이드를 제공하고 있으며,
확인하신 후 MyBatis 사용을 위한 환경 설정이 제대로 되었는지부터 확인해주세요.
개발가이드>실행환경>표준프레임워크 2.6&2.7에서 Mybatis로 검색하시면 됩니다.
3. 다음은 올려주신 설정내용만으로 판단한 결과입니다.
올려주신 파일말고도 MyBatis 사용을 위한 설정들이 존재하기 때문에 적용가이드를 꼭 한번 읽어보시길 바랍니다.
Error creating bean with name 'egov.sqlMapClient' defined in file Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.
위 에러메시지에서 'sqlMapClient'라는 단어, ibatis.common....가 나온 것으로 보아,
MyBatis 사용을 위한 SqlSessionFactoryBean 설정이 제대로 안되셨으리라 판단됩니다.
SqlMapClientFactoryBean이 아니라 SqlSessionFactoryBean이 등록되어 있어야합니다.
-SqlSessionFactoryBean 설정
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="MyBatis Configuration 파일위치를 지정하세요" />
</bean>
적용가이드에서 Mybatis-Spring 연동부분을 참고하세요.
4. 그리고 올려주신 XML mapper 파일의 상단에는
<?xml version="1.0" encoding="UTF-8"?>~<sqlMap namespace="TestDAO">
이 아니라
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TestDAO">
로 바꾸셔야합니다.
5. 지난 번 답변에서 resutMap에 class 속성은 Mybatis에서 type으로 변경되었다고 말씀드렸습니다.
MyBatis에서 사용되는 태그와 속성설정은 매우 다양하기 때문에 적용가이드 외에 MyBatis 매뉴얼을 참조하셔야 합니다.
<resultMap id="testList" class="java.util.HashMap">
이 아니라
<resultMap id="testList" type="java.util.HashMap">
입니다.
6. collection에 설정하신 list는 자바단에서 넘겨주는 List 객체의 이름이어야합니다.
7. parameterType 속성은 자바단에서 넘겨준 값을 받기 위한 설정으로, hashMap형태로 받은 값을 위 쿼리문 어디에서 사용하시는지요?
이부분에 대한 설명이 필요합니다. 필요없으시면 지우고 사용하세요.
다음은 select 문에서 parameterType에 hashMap을 사용한 예제입니다.
- 자바
HashMap map = new HashMap<String, Object>();
EmpVO emp = new EmpVO();
emp.setEmpNm("표준프레임워크");
...
map.put("emp", emp);
- XML 매퍼파일
<select id="..." parameterType="hashMap" resultType="...">
select ...
from ...
where EMP_NM=#{emp.empNm}
</select>
8. "select 문 안에 parameterType 을 여러가지로 다 변경해서 시도해봤지만," 이라고 말씀하셨는데..
앞서 말씀드렸듯이, MyBatis가 동작할 수 있는 기본 설정을 구성해놓고 원하시는 기능이 구성되도록 변경해보셔야할 것 같습니다.
감사합니다.