「NULL を確実に設定できるようにするには」の版間の差分
提供: tknotebook
(ページの作成:「Category:コンピュータCategory:JavaCategory:MyBatis メインページ>コンピュータの部屋#Java>MyBtis Tips MyBatis で SQL ...」) |
|||
| 3行: | 3行: | ||
| − | MyBatis で SQL に | + | |
| + | MyBatis で SQL に パラメータには SQLに OGNL式 を埋め込んで値を渡しますが、値が NULL だと | ||
| + | 実行時エラーになってしまうことがあります。 | ||
| + | |||
| + | 例 | ||
| + | <insert ・・・・ | ||
| + | INSERT INFO STUDENT(NAME, EMAIL) VALUES(#{name}, #{email}) | ||
| + | </insert> | ||
| + | |||
| + | 式 email が NULL だと例外が発生する。 | ||
| + | |||
| + | |||
これは JDBC の仕様に起因しています。 | これは JDBC の仕様に起因しています。 | ||
JDBC では SQLパラメータに NULL をセットする時は | JDBC では SQLパラメータに NULL をセットする時は | ||
| − | |||
PreparedStattement#setNull(int parameterIndex, int sqlType) | PreparedStattement#setNull(int parameterIndex, int sqlType) | ||
| − | |||
を使いますが、値の設定にはなぜか、型の sqlType(JDBC型)が必要です。 | を使いますが、値の設定にはなぜか、型の sqlType(JDBC型)が必要です。 | ||
| − | 多くの データベースでは java.sql.Type.OTHER | + | 多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのでが、 |
| − | + | Oracle 等は java.sql.Type.NULL でないと駄目なようです。 | |
| + | |||
| + | これは MyBtis の設定に | ||
| + | |||
| + | <setting name="jdbcTypeForNull" value="NULL" /> | ||
| + | |||
| + | を加えることで対処できます。 | ||
| + | |||
| + | しかし、MS SQLServer などはこれでも駄目です。 | ||
そのような場合は OGNL でパラメータを指定する時 | そのような場合は OGNL でパラメータを指定する時 | ||
| − | #{ | + | #{email, jdbcType=VARCHAR} |
| − | + | と JDBC型を明示するとうまく行きます。 | |
| + | |||
| + | OGNLの式が NULLになる可能性がある場合は必ずこうするように心がけましょう。 | ||
2016年11月16日 (水) 02:02時点における版
メインページ>コンピュータの部屋#Java>MyBtis Tips
MyBatis で SQL に パラメータには SQLに OGNL式 を埋め込んで値を渡しますが、値が NULL だと 実行時エラーになってしまうことがあります。
例
<insert ・・・・
INSERT INFO STUDENT(NAME, EMAIL) VALUES(#{name}, #{email})
</insert>
式 email が NULL だと例外が発生する。
これは JDBC の仕様に起因しています。
JDBC では SQLパラメータに NULL をセットする時は
PreparedStattement#setNull(int parameterIndex, int sqlType)
を使いますが、値の設定にはなぜか、型の sqlType(JDBC型)が必要です。
多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのでが、 Oracle 等は java.sql.Type.NULL でないと駄目なようです。
これは MyBtis の設定に
<setting name="jdbcTypeForNull" value="NULL" />
を加えることで対処できます。
しかし、MS SQLServer などはこれでも駄目です。
そのような場合は OGNL でパラメータを指定する時
#{email, jdbcType=VARCHAR}
と JDBC型を明示するとうまく行きます。
OGNLの式が NULLになる可能性がある場合は必ずこうするように心がけましょう。