DAY-83 체크박스 ajax로 데이터 보내기 ,myBatis Join, selectKey
💻2022-07-01
❗ 수업을 듣고, 개인이 공부한 내용을 적은 것 이기에 오류가 많을 수도 있음
1️⃣ 체크박스로 삭제하기(맴버 관리 필요)
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)
- collection : dao로부터 넘어오는 배열 / 리스트의 이름 (jstl forEach문의 items와 같은 역할)
→ dao에서 배열이나 리스트한테 별도의 이름(key)을 붙여주지 않고 배열 / 리스트 그대로 넘겨주는 경우에는 배열일 경우 array 리스트일 경우 list라는 별칭을 부여한다.
- item : 배열이나 리스트를 반목문 돌리며 각각 인덱스에 있는 값을 담아줄 변수(jstl forEach문의 var와 같은 역할)
- open : prefix 처럼 반복되는 구문의 가장 앞쪽에 특정 문자열을 추가 (myBatis의 prefix 같은 느낌)
- close : suffix 처럼 반복되는 구문의 가장 뒤쪽에 특정 문자열을 추가
- 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 사용
Leave a comment