JAVA

[mybatis] xml 속성 정리

docc 2021. 8. 15. 19:44
<?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="board">

	<!-- 게시물 작성 -->
 	<insert id="insertBoard" parameterType="boardA">
		insert into board(bNum,bWriter,bTitle,bContent,bRef,bStep,bRefOrder,bParentNum)
		values(board_seq.nextval,#{bWriter.memNum},#{bTitle},#{bContent},#{bRef},#{bStep},#{bRefOrder},#{bParentNum})	
	</insert>
	
	<!-- 글 갯수 -->
	<select id="countBoard" resultType="int">
		select count(*) from board
	</select>
	
	<!-- 답글 끼워넣기 위치 확보 -->
	<update id="updateRefCount" parameterType="boardA">
		update board set bRefOrder=bRefOrder+1
		where bRef=#{bRef} and bRefOrder>#{bRefOrder}
	</update>
	
	<!-- 게시물 리스트 출력 -->
	<select id="selectListBoard" resultMap="selectListMap" parameterType="map">
		select 
		b.bNum			as b_num,
		b.bTitle		as b_title,
		b.bView			as b_view,
		b.bRef			as b_ref,
		b.bStep			as b_step,
		b.bRefOrder		as b_refOrder,
		b.bAnswerCnt	as b_answerCnt,
		b.bParentNum	as b_parentNum,
		b.bDeleteflag	as b_deleteflag,
		m.memNum		as m_memNum,
		m.memName		as m_memName
		from board b left outer join member m on b.bWriter=m.memNum
		order by b.ref desc,b.bRefOrder asc
		limit #{start},#{cnt}
	</select>
	
	<!-- 게시물 상세보기 출력 -->
	<select id="selectBoard" resultMap="selectMap">
		select 
		b.bNum			as b_num,
		b.bTitle		as b_title,
		b.bContent		as b_content,
		b.bView			as b_view,
		b.bRef			as b_ref,
		b.bStep			as b_step,
		b.bRefOrder		as b_refOrder,
		b.bAnswerCnt	as b_answerCnt,
		b.bParentNum	as b_parentNum,
		b.bDeleteflag	as b_deleteflag,
		m.memNum		as m_memNum,
		m.memName		as m_memName
		from board b left outer join member m on b.bWriter=m.memNum;
	</select>
		
	<!-- 조회수 증가 -->
	<update id="updateView" parameterType="Integer">
		update board set bView=bView+1
		where bNum=#{bNum}
	</update>
	
	<!-- DB 글 수정 -->
	<update id="updateBoard" parameterType="boardA">
		update board set bTitle=#{bTitle},bContent=#{bContent}
		where bNum=#{bNum} and bWriter=#{bWriter.memNum}
	</update>
	
	<!-- 글삭제 -->
	<update id="deleteDao" parameterType="boardA">
		update board set bDeleteflag='삭제'
		where bNum=#{bNum} and bWriter=#{bWriter.memNum}
	</update>

	<!-- 답글 수 업데이트 -->
	<update id="updateAnswerCnt" parameterType="boardA">
		update board set bAnswerCnt=bAnswerCnt+1
		where bRef=#{bRef} and bStep<![CDATA[ <= ]]>${bStep}
	</update>
		
	<!-- 게시물 리스트 resultMap -->
	<resultMap id="selectListMap" type="boardA">
		<id property="bNum" column="b_num"/>
		<result property="bTitle" column="b_title"/>
		<result property="bView" column="b_view"/>
		<result property="bRef" column="b_ref"/>
		<result property="bStep" column="b_step"/>
		<result property="bRefOrder" column="b_refOrder"/>
		<result property="bAnswerCnt" column="b_answerCnt"/>
		<result property="bParentNum" column="b_parentNum"/>
		<result property="bDeleteflag" column="b_deleteflag"/>
		<association property="bWriter" resultMap="memberResult"/>
	</resultMap>
	
	<!-- 게시물 상세보기 resultMap -->
	<resultMap id="selectMap" type="boardA">
		<id property="bNum" column="b_num"/>
		<result property="bTitle" column="b_title"/>
		<result property="bContent" column="b_content"/>
		<result property="bView" column="b_view"/>
		<result property="bRef" column="b_ref"/>
		<result property="bStep" column="b_step"/>
		<result property="bRefOrder" column="b_refOrder"/>
		<result property="bAnswerCnt" column="b_answerCnt"/>
		<result property="bParentNum" column="b_parentNum"/>
		<result property="bDeleteflag" column="b_deleteflag"/>
		<association property="bWriter" resultMap="memberResult"/>
	</resultMap>
	
	<!-- board resultMap의 공통 member select -->
	<resultMap type="memberA" id="memberResult">
		<id property="memNum" column="m_memNum"/>
		<result property="memName" column="m_memName"/>
	</resultMap>
</mapper>

<mapper>

- namespace = 자바의 패키지처럼 여러개의 SQL문을 묶는 용도로 사용한다.

 

 

<insert>,<select>,<update>,<delete>

- id = 구문을 찾기 위해 사용될 수 있는 네임스페이스 내 유일한 구분자

- parameterType = 쿼리문에 들어가는 매개타입

- resultType = 가져오는 결과 타입

 

 

<resultMap>

컬럼과 멤버변수를 매핑할 정보를 작성한다.

- type = 가져오는 결과 타입

- id = 구문을 찾기 위해 사용될 수 있는 유일한 구분자

<id> : primary key 에 해당하는 컬럼을 설정 ( 데이터들을 구분할 수 있는 값 )
- column : 테이블의 컬럼명
- property : 조회 결과가 매핑될 DTO 의 멤버변수
resultMap 속성인 id 가 아니다.

<result> : primary key 가 아닌 일반 컬럼에 대한 매핑을 처리하며 속성은 <id> 와 동일하다.

<select> 에서<resultMap> 를 사용할 때
returnType 대신 resultMap 속성에 resultMap의 id 를 넣어준다.

 

 

<association>

1:1 관계의 테이블을 조인할 때 사용 (조인 객체)

ex) 1개 Board 에는 1명의 Member 만 존재

 

- property : 조인객체명

- javaType : 조인객체의 자료형

- select : 사용할 <select> 의 id 값을 넣어 매핑

- column : 사용할 <select> 에 넣은 매개값

 

또는..

 

- resultMap : 다른 resultMap 을 재사용할 때 그 resultMap 의 id (다른 mapper 일 경우 namespace 포함)

 

 

<collection>

1:M 관계의 테이블을 조인할 때 사용 (조인 객체)

ex) 1개의 Board 에는 M개의 Member 가 존재

 

- property : 조인객체명

- javaType : collection의 자료형(ex List)

- ofType : collection의 자료형안의 지네릭(ex  List<T>)

- select : 사용할 <select> 의 id 값을 넣어 매핑

- column : 사용할 <select> 에 넣은 매개값

 

또는..

 

- resultMap : 다른 resultMap 을 재사용할 때 그 resultMap 의 id (다른 mapper 일 경우 namespace 포함)

 

참고 : https://goodteacher.tistory.com/248