본문 바로가기

Backend/DB 실무

[Mybatis] foreach문과 사용되는 Mybatis 요소 정의

반응형

프로젝트를 진행하다 Service부분에서 null발생

뭔짓을 해도 Service부분에서 null이 발생하길래 쿼리가 제대로 안되는 줄 알고 select해봄

그래도 null이 나오길래 다시 확인해보니 Service자체를 Mapping시켜주지 않아서 그랬었다.

@Autowired로 Service 맵핑시켜 정상작동 확인

 

Service부분에서 null이 발생하는 원인을 찾다가 쿼리문을 확인하는 과정에서 알게된 내용 정리

 

parameterType

- <foreach> 태그에 대한 parameterType 속성은 해당 <insert>나 <update> 쿼리에 전달되는 파라미터의 자료형 지정

collection

- <foreach> 태그의 collection 속성은 반복 작업을 수행할 컬렉션 또는 배열 지정

- 이 컬렉션 또는 배열은 MyBatis에서 제공한 parameterType에 정의된 변수에 할당

item

- collection에 포함된 요소를 가리키는 변수 이름 지정

- <foreach> 태그 내에서 #{item}을 사용하여 컬렉션의 각 요소를 참조, #{item}은 컬렉션의 각 요소를 나타내며, 이 변수 이름은 자유롭게 선택

 

open

- foreach를 수행하기 전에 붙이는 내용

 

separator

- foreach를 1회 수행 후 붙이는 내용

 

close

- foreach를 종료하기 직전에 가장 마지막에 붙이는 내용

 

// List<VO>로 된 파라미터 입력받음
<insert id="insertDataVariableGroupExcelData" parameterType="java.util.List">
	// 문장 전체를 List의 길이만큼 반복 하면서 ;로 구분지어줌
	<foreach collection="list" item="item" index="index" separator=";">
	INSERT INTO public.cdp_data_variable_group (
		group_seq
		, group_code
		, use_yn
		, insert_date
	) VALUES (
		(select max(group_seq) + 1 from public.cdp_data_variable_group)
		, trim(#{item.groupCode})
		, #{item.useYn}
		, now()
	)
	</foreach>
</insert>

// 단일 객체 받음
<delete id="deleteDataVariables" parameterType="DataVariableVO">
	DELETE FROM public.cdp_data_variable
	WHERE var_seq IN
    // 특정 요소(varSeq)를 반복해서 가져오고 가져온 값을 ()안에 넣어주면서 ,로 구분지음
	<foreach collection="varSeqList" item="varSeq" open="(" separator="," close=")">
		#{varSeq}
	</foreach>
</delete>

 

반응형