Spring

MyBatisでinsert,update,delete時にnullを設定するときの注意点

MyBatisを使って、insertやupdate、delete時にnullを設定するとエラーとなったときの対処法をメモしておきます。例えば、以下のSQL文の#{name}#{tel}にnullを設定するとTypeExceptionが発生します。

<insert id="insertUser">
INSERT INTO users (id, name, tel)
VALUES (#{id}, #{name}, #{tel})
</insert>
<update id="updateUser">
UPDATE users
SET name = #{name}, tel = #{tel}
WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM users
WHERE tel = #{tel}
</delete>

jdbcTypeを指定する必要がある

JDBCの仕様で、insertやupdate、deleteでnullが許可されている列を指定する場合、JDBCデータ型(jdbcType)を指定する必要があります。サポートされているJDBCデータ型の一覧は、MyBatisのドキュメントに記載されています。nullだとカラムのデータ型がわからないので、きちんと定義してねってことのようです。

具体的に上記コードを書き直してみると、以下のようになります。

<insert id="insertUser">
INSERT INTO users (id, name, tel)
VALUES (#{id}, #{name, jdbcType=VARCHAR}, #{tel, jdbcType=INTEGER})
</insert>
<update id="updateUser">
UPDATE users
SET name = #{name, jdbcType=VARCHAR}, tel = #{tel, jdbcType=INTEGER}
WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM users
WHERE tel = #{tel, jdbcType=INTEGER}
</delete>

まとめ

MyBatisでinsertやupdate、delete時にnullを設定するときは忘れずjdbcTypeを設定しましょう。

参考リンク

-Spring

S