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"/>
で成功する。
使用している MySQL や JDBC のバージョンが問題なのだろうか?
MySQL は、5.5
mysql-connector-java は、5.1.30 を使用
mybatis 3.2.7
でこの状況だった。