DAY-83 체크박스 ajax로 데이터 보내기 ,myBatis Join, selectKey

2 minute read

💻2022-07-01

❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음

1️⃣ 체크박스로 삭제하기(맴버 관리 필요)

1.png

outputList.jsp

HomeController.java

MessageService

MessageDAO - 1번

MessageDAO - 2번

message-mapper.xml - 1번

<!-- 메세지 삭제(체크박스) -->
<!-- 1. dao로 부터 배열/리스트가 있는  그대로 넘어오는 경우 (메세지 선택 삭제) -->
<!-- foreach (dao에서 배열 혹은 리스트가 넘어오는 경우에만 사용 가능) -->
<delete id="deleteChecked" parameterType="int">
	delete from msg where no in
		<foreach collection="array" item="num" open="(" close=")" separator=",">
			#{num}
		</foreach>
</delete>

message-mapper.xml - 2번

<!-- 메세지 삭제(체크박스) -->
<!-- 2. key값을 가지고 배열 / 리스트를 넘기는 경우 -->
<!-- collection : 속성값에 반드시 넘어오는 key값을 사용해서 데이터를 받아줘야함 -->
<delete id="deleteChecked" parameterType="int">
	delete from msg where no in
		<foreach collection="deleteArr" item="num" open="(" close=")" separator=",">
			#{num}
		</foreach>
</delete>

myBatis (forEach)

  1. collection : dao로부터 넘어오는 배열 / 리스트의 이름 (jstl forEach문의 items와 같은 역할)

→ dao에서 배열이나 리스트한테 별도의 이름(key)을 붙여주지 않고 배열 / 리스트 그대로 넘겨주는 경우에는 배열일 경우 array 리스트일 경우 list라는 별칭을 부여한다.

  1. item : 배열이나 리스트를 반목문 돌리며 각각 인덱스에 있는 값을 담아줄 변수(jstl forEach문의 var와 같은 역할)
  2. open : prefix 처럼 반복되는 구문의 가장 앞쪽에 특정 문자열을 추가 (myBatis의 prefix 같은 느낌)
  3. close : suffix 처럼 반복되는 구문의 가장 뒤쪽에 특정 문자열을 추가
  4. seperator : 한번 반복한 후 뒤에 또 반복이 이어진다면 구분자를 추가해주는 속성

2️⃣ myBatis - Join

message-mapper.xml

<!-- 조인된 테이블의 데이터 조회 -->
<select id="selectJoin" resultType="map" >
	select nickname, message, address, phone from msg join member using (nickname)
</select>
  • 반환값은 map으로 해야한다. → 꺼낼 때도 대문자로 가져와야한다(jsp에서)

라이브러리 적용후

message-mapper.xml

<!-- 조인된 테이블의 데이터 조회 -->
<select id="selectJoin" resultType = "org.apache.commons.collections4.map.CaseInsensitiveMap">
	select nickname, message, address, phone from msg join member using (nickname)
</select>

MessageService.java

MessageDAO

outputJoinList.jsp

  • 테이블에는 컬럼명이 대문자로 들어가기 때문에 join 사용 시 값을 가져올 때도 대문자로 가져와야한다 ->commons-collections4 라이브러리를 사용하면 소문자로 사용가능

3️⃣ selectKey

  • order : selectKey 태그가 들어있는 구문을 수행하기 전에 추출해오고자 하는 값을 가져올 건지 혹은 쿼리문이 실행된 후에 값을 가져올 건지 여부에 대한 속성 → before / after
  • keyProperty : selectKey가 실행되고 난 결과 값을 저장할 변수명
  • resultType : selectKey안의 구문이 실행됐을때 반환 받을 데이터의 타입

BEFORE

<!-- 메세지 저장 BEFORE 사용-->
<insert id="insert" parameterType="kh.message.dto.MessageDTO">
	<selectKey order="BEFORE" keyProperty="no" resultType="int">
		select seq_msg.nextval from dual
	</selectKey>
	insert into msg values(#{no}, #{nickname}, #{message})
</insert>

기존의 insert into msg values(#{no}, #{nickname}, #{message}) 에서는 seq_msg.nextval을 넣어줬다. 하지만 selectKey를 이용하면 먼저 seq_msg를 구한뒤, MessageDTO에 no을 넣어주고 그 값을 insert문으로 돌려준다. (그래서 #{no} 사용 가능)

  • keyProperty의 값은 반드시 DTO의 값과 일치해야 setter를 통해 값을 설정해준다.
  • SQL 구문 전에 사용
  • nextval 사용

AFTER

<!-- 메세지 저장 AFTER 사용-->
<insert id="insert" parameterType="kh.message.dto.MessageDTO">
	insert into msg values(seq_msg.nextval, #{nickname}, #{message})
	<selectKey order="AFTER" keyProperty="no" resultType="int">
		select seq_msg.currval from dual
	</selectKey>
</insert>
  • sql 구문 뒤에 selectKey를 사용
  • nextval이 아닌 currval 사용

Categories:

Updated:

Leave a comment