Spring
[mybatis] if 조건문 사용하기
wldnjd2
2022. 9. 14. 17:03
예시
SQL에서도 조건문을 사용해야할때가 필요하다...!
<update id="insertTest" parameterType="TestVO">
INSERT INTO
gms_minwon_tb
(
cvlcpt_unq_no
,cvlcpt_cn
,actn_ymd
,cvlcpt_typ
)
VALUES
(
#{cvlcpt_unq_no}
,#{cvlcpt_cn, jdbcType=VARCHAR}
,TO_DATE(#{actn_ymd, jdbcType=VARCHAR}, 'YYYY-MM-DD')
,#{cvlcpt_typ, jdbcType=VARCHAR}
)
</update>
위의 간단한 예제를 예로들면
actn_ymd에 null값이 들어갔을때 (컬럼에 20220914과 같은 날짜 데이터가 입력이 되지 않았을때)
데이터가 00010101bc로 db에 입력되는 현상이 일어났다.
이런현상이 일어나는 이유가
,TO_DATE(#{actn_ymd, jdbcType=VARCHAR}, 'YYYY-MM-DD') 가
null 값을 날짜로 변형시키게 되면서 나타나게 된 것이다.
해결방법
1. 데이터가 null이면 null값을 그대로(변형없이 입력)
2. null이 아니면 날짜를 그대로 insert
<update id="insertTest" parameterType="TestVO">
INSERT INTO
gms_minwon_tb
(
cvlcpt_unq_no
,cvlcpt_cn
<if test="actn_ymd != null and !actn_ymd.equals('')">
,actn_ymd
</if>
,cvlcpt_typ
)
VALUES
(
#{cvlcpt_unq_no}
,#{cvlcpt_cn, jdbcType=VARCHAR}
<if test="actn_ymd != null and !actn_ymd.equals('')">
,TO_DATE(#{actn_ymd, jdbcType=VARCHAR}, 'YYYY-MM-DD')
</if>
,#{cvlcpt_typ, jdbcType=VARCHAR}
)
</update>
조건문을 통해서 해결했다
<if test="actn_ymd != null and !actn_ymd.equals('')">
actn_ymd가 null이 아니면 TO_DATE(#{actn_ymd, jdbcType=VARCHAR}, 'YYYY-MM-DD') 를 실행!
아주 간단하다.
하지만 이것도 헤맸는데, 그 이유는 values에만 조건문을 걸어주면 된다고 생각했기 때문이다.
insert into에도 if 조건문을 걸어줘야하는 것을 몰랐다 ㅜㅜ
insert into랑 value 둘다 if를 해주는 이유는
T or F 의 조건에서, 조건에 해당하지 않으면 value 값이 비어버리기 때문에 insert에 들어갈 값이 밀려서 에러가 나기 때문이다.