「NULL を確実に設定できるようにするには」の版間の差分

提供: tknotebook
移動: 案内検索
 
3行: 3行:
  
  
MyBatis で SQL に パラメータに OGNL で値を渡すとき、実行時エラーになってしまうことがあります。
+
 
 +
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.NULL を指定しておけばうまくセットして
+
多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのでが、
くれるのですが、MS SQLServer などはひねくれていて通してくれません。
+
Oracle 等は java.sql.Type.NULL でないと駄目なようです。
 +
 
 +
これは MyBtis の設定に
 +
 
 +
<setting name="jdbcTypeForNull" value="NULL" />
 +
 
 +
を加えることで対処できます。
 +
 
 +
しかし、MS SQLServer などはこれでも駄目です。
  
 
そのような場合は OGNL でパラメータを指定する時
 
そのような場合は OGNL でパラメータを指定する時
  #{name, jdbcType=VARCHAR}
+
  #{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になる可能性がある場合は必ずこうするように心がけましょう。