본문 바로가기

MyBatis

MyBatis insert, update NULL 처리

반응형


MyBatis/iBatis를 사용하다보면 insert/update시 null을 입력해야 할 때가 있다.

일반적으로 paramter를 넘겨서 insert/update를 아래와 같이 한다고 했을때 입력값이 Null 이 들어가 있으면 오류가 발생한다.

<insert id="insQuery" parameterType="hashmap">
	INSERT INTO TB_test (idx, memo) VALUES (#{idx}, #{memo})
</insert>

<insert id="upQuery" parameterType="hashmap">
	UPDATE
		TB_test
	SET
		memo = #{memo}
	WHERE
		idx = #{idx}
</insert>



이를 해결하기 위해선 다음과 같이 if문을 사용해서 처리할수도 있지만, paramter가 많아지면 굉장히 난잡해지는 단점이 있다.

<insert id="insQuery" parameterType="hashmap">
	INSERT INTO
		TB_test
		(
			idx
		<if test="memo != null">
			, memo
		</if>
		) 
	VALUES 
		(
			#{idx}
		<if test="memo != null">
			, #{memo}
		</if>
		)
</insert>




if문을 사용하기 보다는 jdbcType을 지정하면 훨씬 더 깔끔하게 코드를 작성할 수 있다.
jdbcType을 명시해 줬을경우 해당 값이 있으면 해당값을, null 일경우 자동으로 null을 입력해 준다.

<insert id="insQuery" parameterType="hashmap">
	INSERT INTO TB_test (idx, memo) VALUES (#{idx, jdbcType=INTEGER}, #{memo, jdbcType=VARCHAR})
</insert>

<insert id="upQuery" parameterType="hashmap">
	UPDATE
		TB_test
	SET
		memo = #{memo, jdbcType=VARCHAR}
	WHERE
		idx = #{idx, jdbcType=INTEGER}
</insert>




jdbcType으로 지정가능한것들은 아래와 같으니 업무에 참고하면 된다.


BIT
FLOAT
CHAR
TIMESTAMP
OTHER
UNDEFINED
TINYINT
REAL
VARCHAR
BINARY
BLOB
NVARCHAR
SMALLINT
DOUBLE
LONGVARCHAR
VARBINARY
CLOB
NCHAR
INTEGER
NUMERIC
DATE
LONGVARBINARY
BOOLEAN
NCLOB
BIGINT
DECIMAL
TIME
NULL
CURSOR