티스토리 뷰

[JAVA]/Mybatis

[Mybatis] Mapper Elements

춘햄 2021. 6. 29. 15:36

이번에는 직전 포스팅에서 간단하게 확인해본 Mapper.xml 파일의 각 엘리먼트들과 그 속성을 좀 더 자세하게 정리하려고 한다.

 

바로 들어가보자.


1. <select>

 <select> 엘리먼트는 데이터를 조회하는 SELECT 구문을 작성할 때 사용한다. 

 

 1) id 속성:

 

필수 속성으로, 반드시 전체 Mapper 파일들 내에서 유일한 아이디를 등록해야 한다. 그러나 다른 namespace에서는 동일한 id 값이 사용되어도 무관하다.

 

 2) parameterType 속성:

 

Mapper 파일에 등록된 SQL을 실행하려면 SQL 실행에 필요한 데이터를 외부로부터 받아야 한다. 이때 parameterType 속성을 사용하여 다음과 같이 작성한다.

<insert id = "insertBoard"  parameterType="com.choonham.biz.board.BoardVO">
	insert into board (seq, title, writer, content)
	values((select nvl(max(seq), 0)+1 from board), #{title}, #{writer}, #{content})
</insert>

하지만, config 파일에서 alias 설정을 제대로 등록했다면, 다음과 같이 간략하게 쓰거나

 

◎config.xml

<!--  Alias 설정 -->
<typeAliases>
	<typeAlias alias="board" type="com.choonham.biz.board.BoardVO"/>
</typeAliases>

 

◎mapper.xml

<insert id = "insertBoard" parameterType = "board">
	insert into board (seq, title, writer, content)
	values((select nvl(max(seq), 0)+1 from board), #{title}, #{writer}, #{content})
</insert>

혹은 parameterType 속성을 생략해도 무관하다.

 

 3) resultType 속성:

 

반환되는 ResultSet을 자바 객체에 맵핑하는데 사용하는 속성이다. 이는 select 구문에서 필수적인 속성이다.

 

2. <insert>

 

1) <selectKey> 

 <insert> 구문은 자식 요소로 <selectKey> 엘리먼트를 가질 수 있다. 이는 Sequence 를 사용하여 PK를 사용하는 경우 다음과 같이 유용하게 사용할 수 있다.

 

<insert id = "insertBoard">
  <selectKey keyProperty = "seq" resultType = "int">
 	 select board_seq.nextval as seq from dual
  </selectKey>
  insert into board (seq, title, writer, content)
  values(#{seq}, #{title}, #{writer}, #{content})
</insert>

 

동일한 CRUD 기능 구성을 위한 <delete>, <update> 엘리먼트들이 있지만, 사용 방법은 동일하므로 생략한다.

 

3. SQL Mapper XML 추가 설정

 

 1) resultMap 속성: 

 

 검색 결과를 특정 자바 객체에 맵핑하여 리턴하기 위해서는 parameterType 속성을 이용하거나, Alias 설정을 등록해야 하는데, 이때 검색 결과가 단순 테이블 조회가 아닌 JOIN 구문을 포함하거나, 검색된 결과의 칼럼명이 자바 객체의 맴버 변수 이름과 다르다면 이는 언급한 방법으로는 맵핑이 불가능하다. 

 

이럴 때는 resultMap 속성을 추가하여 맵핑이 가능하도록 설정할 수 있다.

 

<resultMap id = "boardResult" type = "board">
  <id property = "seq" column = "SEQ"/>
  <result property = "title" column="TITLE"/>
  <result property = "writer" column="WRITER"/>
  <result property = "content" column="CONTNENT"/>
  <result property = "regDate" column="REGDATE"/>
  <result property = "cnt" column="CNT"/>
</resultMap>

<select id="getBoard" resultType = "board" resultMap = "boardResult">
	select * from board where seq = #{seq}
</select>

위 코드는 boardResult 라는 아이디로 resultMap을 설정했다. PK에 해당하는 SEQ 칼럼만 id 엘리먼트를 사용하고, 나머지는 result 엘리먼트를 사용하여 결과를 맵핑하고 있다. 

 

 2) CDATA Section 사용

 

기본적으로 xml 은 태그를 기반으로 작성되는 파일이기 때문에 프로젝트 내에 xml 파서가 이를 읽을 때도 <> 기호로 묶여있는 태그를 확인하려고 한다. 이 때, SQL 구문에 만약 '<' 가 비교문으로 포함되어 있다면, 이 또한 xml 파서가 읽어들이기 때문에 오류를 일으킬 확률이 매우 높아진다. 

 

따라서 다음과 같이 CDATA 를 이용하여 따로 구문을 작성해야 한다.

 

<select id="getBoard" resultType = "board" >
  <![CDATA[
  	SELECT * FROM BOARD WHERE SEQ <= #{SEQ}
  ]]>
</select>

 

'[JAVA] > Mybatis' 카테고리의 다른 글

[Mybatis] SQL 쿼리문을 실행하는 두가지 방법  (0) 2021.07.01
[Mybatis] JavaORM plugin  (0) 2021.06.30
[Mybatis] Dynamic SQL  (0) 2021.06.30
[Spring] Mybatis 사용  (0) 2021.06.29
[Mybatis] Mybatis 프레임워크 기초  (0) 2021.06.29
Comments