読者です 読者をやめる 読者になる 読者になる

MySQL BLOB を mybatis で使う時に出たエラー

mybatis

mybatis MySQL の BLOB型データを読み書きしようとしたら、

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'. x'504B030414000808080081B2AC460000000000000000000000000B0000005F72656C732F2E72' at line 2


SQLMap で parameterMap あるいは、resultMap で指定したのは、
  javaType="byte" jdbcType="BLOB"
としているのに、発生する。

嘘みたいだが、INSERT SQLを以下のように、BLOB型の値セットを単独行にしないSQL文を指定すると、
上のようなエラーになる。

<parameterMap type="org.uran.Foostack" id="paramStack">
   <parameter property="id" javaType="int" jdbcType="INTEGER"/>
   <parameter property="start_date" javaType="java.util.Date" jdbcType="DATE"/>
   <parameter property="customer_name" javaType="java.lang.String" jdbcType="VARCHAR"/>
   <parameter property="data" javaType="byte" jdbcType="BLOB"/>

</parameterMap>

<insert id="insertFoo" parameterMap="paramStack">
INSERT INTO foo ( id, start_date, customer_name, data)
VALUES( #{id}, #{start_date}, #{customer_name}, #{data})
</insert>

INSERT文の VALUE句を以下のようにするとエラーはなくなり成功する。

VALUES( #{id}, #{start_date}, #{customer_name},
#{data}
)

と改行させるのである。

UPDATE文も、以下のように書くとエラーになる。

  UPDATE  foo  SET
   data = #{data}, start_date = #{start_date}
   WHERE id = #{id}

次のように書けば、成功する。

  UPDATE foo  SET   data = #{data}
  , start_date = #{start_date}
   WHERE id = #{id}

なぜかよく解らない。

また、SELECT についてもSQL文ではなく、javaType の指定の方でエラーになる。
parameterMap は javaType="byte" と書かせるのに、

<result property="data" column="data" javaType="byte"
 jdbcType="BLOB"/>

で、resultMap を書くとエラーなのである。

これを解決するには、javaType を "[B" と書く。

  <result property="data" column="data" javaType="[B" jdbcType="BLOB"/>

で成功する。

使用している MySQLJDBC のバージョンが問題なのだろうか?

MySQL は、5.5
mysql-connector-java は、5.1.30 を使用
mybatis 3.2.7

でこの状況だった。