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

提供: tknotebook
移動: 案内検索
 
(1人の利用者による、間の3版が非表示)
1行: 1行:
 
[[Category:コンピュータ]][[Category:Java]][[Category:MyBatis]]
 
[[Category:コンピュータ]][[Category:Java]][[Category:MyBatis]]
[[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBtis Tips]]
+
[[メインページ]]>[[コンピュータの部屋#Java]]>[[MyBatis Tips]]
  
  
22行: 22行:
  
 
パラメータの JDBC型を指定すればよいのですが、MyBatis には型がわからないので、
 
パラメータの JDBC型を指定すればよいのですが、MyBatis には型がわからないので、
MyBatisの'''「jdbcTypeForNull」'''という設定値を使います。既定値は '''java.sql.Type.OTHER''' です。
+
MyBatisは'''「jdbcTypeForNull」'''という設定値を使います。既定値は '''java.sql.Type.OTHER''' です。
  
多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのでが、
+
多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのですが、
Oracle 等は java.sql.Type.NULL でないと駄目なようです。
+
Oracle 等は駄目なようです。
  
 
これは MyBtis の設定に
 
これは MyBtis の設定に
38行: 38行:
 
  #{email, jdbcType=VARCHAR}
 
  #{email, jdbcType=VARCHAR}
 
と JDBC型を明示するとうまく行きます。
 
と JDBC型を明示するとうまく行きます。
 
MyBatis は データベースにそのまま渡す SQL を直書きするので、SQLの互換性が犠牲になるのは
 
しかたがないのですが、それでも MyBtisの処理の互換性を少しでも上げたいなら、
 
OGNLの式が NULLになる可能性がある場合は必ずこうするように心がけましょう。
 

2016年11月19日 (土) 04:46時点における最新版

メインページ>コンピュータの部屋#Java>MyBatis 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型)が必要です。

パラメータの JDBC型を指定すればよいのですが、MyBatis には型がわからないので、 MyBatisは「jdbcTypeForNull」という設定値を使います。既定値は java.sql.Type.OTHER です。

多くの データベースでは java.sql.Type.OTHER(MyBatisの既定値)で大丈夫なのですが、 Oracle 等は駄目なようです。

これは MyBtis の設定に

<setting name="jdbcTypeForNull" value="NULL" />

を加えることで対処できます。

しかし、MS SQLServer などはこれでも駄目です。

そのような場合は OGNL でパラメータを指定する時

#{email, jdbcType=VARCHAR}

と JDBC型を明示するとうまく行きます。