2023.01.24-1 Spring
Springboot
34. Dynamic SQL Mapper 구현하기 #4 (deleteAll)
넘겨받기 위한 데이터가 배열이다.
delete from Notice where id in (1,2,3,4) 이런식으로 담아야한다.
동적으로 배열이 펼쳐지도록 마이바티스가 동적으로 쿼리를 작성할 수 있도록 지원하고 잇다.
https://mybatis.org/mybatis-3/ko/dynamic-sql.html
foreach를 사용해보자.
<delete id="deleteAll">
delete from Notice
where id in
<foreach item="id" index="index" collection="ids"
open="ID in (" separator="," close=")">
#{id}
</foreach>
</delete>ids가 collection에 들어간다. 하나씩 꺼낸다. 그 변수가 item id
이게 반복되는데 앞부분엔 (가 여릴고 끝날땐)로 닫히고 중간에 ,가 추가된다.
그래서 뭘담든 in (1,2,3,4)이런식의 구분이 된다는 것이다.
35. Dynamic SQL Mapper 구현하기 #5 (updatePubAll)
pubIds 와 closeIds를 두가지 다 처리해야한다.
https://jin2rang.tistory.com/entry/MySQL-CASE-%EB%AC%B8%EB%B2%95
mysql의 case문법(swith와 비슷함) 사용한다.
update Notice
set
pub = case id
when 14 then 0
when 15 then 0
when 21 then 1
when 22 then 1
end
where id in (14,15,21,22)pub에 0또는 1로 바꾸는 건데 배열로 받은것을 펼쳐놓고 하기.
14 15 = closeid 이것을 두번에 걸쳐서 나눠서하면 된다.
int updatePubAll(int[] ids, boolean pub)로 할수도잇다.
int updatePubAll(int[] pubIds, int[] closeIds);
하지만 이렇게하는 이유는 ui를 보고 더 직관적으로 여러기법과 한번에 해야된다. 라고 할 수잇다.
when 14 then 0 when 15 then 0/ when 21 then 1 when 22 then 1 / 14,15 / 21,22
4번의 반복이 필요하다.
반복되는 과정에서 INDEX 가필요하면 사용해야하는데 필요없으면 없어도된다. 구분자를 반복해서 넣을게 없다면 그냥 없애고 넣으면된다.
반복되는 모습만 생각하면 된다.
<update id="updatePubAll">
update Notice
set
pub = case id
<foreach item="id" collection="openIds">
when #{id} then 1
</foreach>
<foreach item="id" collection="closeIds">
when #{id} then 0
</foreach>
end
where id in (
<foreach item="id" collection="openIds">
#{id}
</foreach>
,
<foreach item="id" collection="closeIds">
#{id}
</foreach>
)
</update>36. Dynamic SQL Mapper 구현하기 #6 추가된 (updatePubAll)
위가 너무 복잡해보이니 더 쉽게 만들어보자.
마이바티스는 오버로드를 지원하지 않는다. 이름을 바꿔써야한다.
int updatePubAll(int[] ids, boolean pub);
사용자가 어떤값을 전달함에따라서 공개할지 말지에 대해 담는다.
<update id="updatePubAll">
update Notice
set
pub = #{pub}
where id in
<foreach item="id" index="index" collection="ids"
open="ID in (" separator="," close=")">
#{id}
</foreach>
</update>pub를 받고 id에 따라 처리하는 것이다. 위는 한문장에 하는 것 이거는 여러번 실행되는 것이다.
37. Dynamic SQL (if, where, trim 태그)
동적 sql에서 자주 사용하는 것이 조건처리 where절 이어붙이기 등 이다.
이미 데이터를 가져오는 getViewList를 완성햇다. ㅇ여기서 사용되는 쿼리에서 where절이 간과하고잇는게잇다.
목록을 가져올때 관릴자는 다봐야하는데 일반 사용자는 공개된것만 봐야한다.
List<NoticeView> getViewList(int offset, int size, String field, String query, boolean pub);
pub를 인자로 하나 더 넣어줘야한다.
SELECT * FROM noticeview
WHERE
${field} LIKE '%${query}%'
and pub = #{pub}
ORDER BY regdate DESC
LIMIT #{offset}, #{size}쿼리에서도 pub를 하나 더 받아야한다.
만약에 query가 빈문자열이라면 like절을 빼야한다. 마이바티스의 동적 쿼리에서 if문을 사용하면 된다.
빈문자가 아닐때 혹은 null값이 아닐때만 할수 잇게끔 포함시키게 해주자.
WHERE
<if test="query != null or query != ''">
${field} LIKE '%${query}%'
</if>
and pub = #{pub}근데 그냥 이렇게 써버리면 구분이 이상해진다. 없다면 and가 붕뜨게 되는 것이다.
그래서 여기서 사용되는게 where라는 태그이다.
where태그로 조건절을 감싸면 조건이 하나라도 포함되면 where가 포함되는 것이고 아니면 포함되지 않느다. 만약에 where가 포함된것에서
포함안되면 and를 없애버린다.
<where>
<if test="query != null or query != ''">
${field} LIKE '%${query}%'
</if>
and pub = #{pub}
</where>if블럭이 사라진다고 하더라도 and를 지워버릴 수 잇다. 포함되면 자연스럽게 where가 포함된다.
만약 where가 잘 자동하지 않는다면 trim을 사용하면된다.
trim은 안쪽에서 구문이 포함되면 where가 붙는다. 구ㅡ문에서 시작되는 첫글자가 and거나 or면 where로 바꾼다.
<trim prefix="where" prefixOverrides = "AND | OR">
<if test="query != null or query != ''">
${field} LIKE '%${query}%'
</if>
and pub = #{pub}
</trim>if문이 실행이안되면 where pub 가 되는 것이고 if문 실행되면 where ${field}~가 되는 것이다.
더 작동이 더 편하게 될 수 있을 듯하다.
둘중하나로 더 잘되는 것을 사용하면 된다.
쿼리에서 컬럼 매핑이름이 잘되지않을 경우 문제 생길 수잇다.