직원 전체 목록에서 신규등록으로 필수 값만 넣어 등록한 뒤, 그 직원의 상세정보 일부만 수정하여 update를 하려고 하면 org.mybatis.spring.MyBatisSystemException
이 발생하며 update가 되지 않았다.
그러나 기존 DB에 넣어둔 더미 값은 수정했을 때 update가 잘 되는 현상이 나타났다. 기존 값은 update가 되고 신규등록으로 입력한 값은 update가 되지 않는 update 쿼리문은 아래와 같다.
<update id="empInfoUpdate" parameterType="map">
update EMPLOYEE
set
E_NAME = #{E_NAME},
E_ADDRESS = #{E_ADDRESS},
E_AUTH = #{E_AUTH},
E_STATUS = #{E_STATUS},
E_EMAIL = #{E_EMAIL},
E_GENDER = #{E_GENDER},
E_HIREDATE = #{E_HIREDATE},
E_ENDDATE = #{E_ENDDATE},
E_PASSWORD = #{E_PASSWORD},
E_PHONE = #{E_PHONE},
E_RANK = #{E_RANK},
E_BIRTH = #{E_BIRTH},
DEPT_NAME = #{DEPT_NAME},
E_OCCUP = #{E_OCCUP},
E_PROFILE = #{E_PROFILE}
where E_NO = #{E_NO}
</update>
기존 값은 update가 되는데 신규등록한 값은 update가 되지 않는 현상이 무엇일지 값들을 비교해보았고 다른 점은 update 쿼리문에 해당하는 모든 값이 직원 정보에 입력되어 있는가 비어있는가
였다.
확인을 위해 신규등록하여 입력되어 있는 값들 중 하나를 DB에서 직접 모든 값을 입력해주었고 그 뒤에 프론트에서 내용을 수정하고 update를 하니 정상적으로 처리가 되었다.
즉, 위 쿼리문의 속성 내용이 반드시 있어야만 update가 성공하는 것이다. 이를 해결하기 위해 if문을 사용하여 null 값도 허용하도록 쿼리문을 수정하였다.
<update id="empInfoUpdate" parameterType="map">
update EMPLOYEE
<set>
<if test="E_NAME != null">E_NAME = #{E_NAME},</if>
<if test="E_ADDRESS != null">E_ADDRESS = #{E_ADDRESS},</if>
<if test="E_AUTH != null">E_AUTH = #{E_AUTH},</if>
<if test="E_STATUS != null">E_STATUS = #{E_STATUS},</if>
<if test="E_EMAIL != null">E_EMAIL = #{E_EMAIL},</if>
<if test="E_GENDER != null">E_GENDER = #{E_GENDER},</if>
<if test="E_HIREDATE != null">E_HIREDATE = #{E_HIREDATE},</if>
<if test="E_ENDDATE != null">E_ENDDATE = #{E_ENDDATE},</if>
<if test="E_PASSWORD != null">E_PASSWORD = #{E_PASSWORD},</if>
<if test="E_PHONE != null">E_PHONE = #{E_PHONE},</if>
<if test="E_RANK != null">E_RANK = #{E_RANK},</if>
<if test="E_BIRTH != null">E_BIRTH = #{E_BIRTH},</if>
<if test="DEPT_NAME != null">DEPT_NAME = #{DEPT_NAME},</if>
<if test="E_OCCUP != null">E_OCCUP = #{E_OCCUP},</if>
<if test="E_PROFILE != null">E_PROFILE = #{E_PROFILE},</if>
<if test="E_ADDRESS != null">E_ADDRESS = #{E_ADDRESS},</if>
</set>
where E_NO = #{E_NO}
</update>
MyBatis에서는 기본적으로 매핑된 SQL 쿼리의 매개 변수가 null이 아닌 것으로 가정한다. 따라서 매개 변수가 null이면 MyBatis는 SQL을 생성하는 중에 오류가 발생할 수 있다.
이 문제를 해결하기 위해 동적 SQL을 사용하여 Null 체크
하면 된다. 각 속성에 대한 Null 체크를 추가하여 해당 속성이 Null이 아닌 경우에만 업데이트 쿼리를 실행시키면 문제가 해결된다.
<if>
요소를 사용하여 조건부로 업데이트 쿼리를 생성하였다.