使用myBatis从数据库中获取blob作为byte []

时间:2015-02-23 09:04:35

标签: spring mybatis

我在一个项目中使用spring MyBatis 1.2.0,我有一个查询从Oracle 11g数据库中的BLOB字段获取数据。我想将字段检索为字节数组(byte []),我的代码是:

<select id="getResponse" resultType="_byte[]" parameterType="string">
   select blob_Data from Table where id = #{value,jdbcType=VARCHAR} AND ROWNUM = 1    
</select>

这会出现以下错误:

java.lang.ClassCastException: [B incompatible with [Ljava.lang.Object;
    at org.apache.ibatis.binding.MapperMethod.convertToArray(MapperMethod.java:136)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:119)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)

除此之外,我还尝试使用resultMap:

<resultMap id="responseMap" type="ResponseMessageModel">
    <result property="blobData" column="blob_Data"/>
</resultMap>

<select id="getResponse" resultMap="responseMap" parameterType="string">
   select blob_Data from table where id = #{value,jdbcType=VARCHAR} AND ROWNUM = 1    
</select>

并指定javaType:

<resultMap id="responseMap" type="ResponseMessageModel">
      <result property="blobData" javaType="_byte[]" column="blob_Data"/>
</resultMap>

<select id="getResponse" resultMap="responseMap" parameterType="string">
   select blob_Data from table where id = #{value,jdbcType=VARCHAR} AND ROWNUM = 1    
</select>

但没有运气,所有人都给出了相同的ClassCastException

有人可以告诉我我做错了吗?

3 个答案:

答案 0 :(得分:3)

尝试在结果映射中指定JDBC类型:

<result property="blobData" column="blob_Data" jdbcType="BLOB"/>

这是Camunda BPM的一个例子:

Mapping with result map "resourceResultMap", that contains a bytes property

Entity with bytes (byte[]) field

修改

如果无效,请查看以下question。它建议使用 BINARY 作为JDBC类型,或使用自己接受的答案中的自定义类型处理程序。

答案 1 :(得分:2)

因此,我通过在代码中进行以下更改来实现此目的 -

我正在使用resultMap并指定了javaType和jdbcType:

<resultMap id="responseMap" type="ResponseMessageModel">
      <result property="blobData" javaType="_byte[]" column="blob_Data" jdbcType="BLOB"/>
</resultMap>

<select id="getResponse" resultMap="responseMap" parameterType="string">
   select blob_Data from table where id = #{value,jdbcType=VARCHAR} AND ROWNUM = 1    
</select>

通过这样做,我能够成功地将BLOB值检索为byte []。

答案 2 :(得分:0)

我已在查询中使用它来获取blob列值作为字符串

UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(BLOB_COLUMN_NAME, 200,1)) FAX_NOTES

这会将blob映射到字符串,而mybatis具有:

<result column="FAX_NOTES" property="faxNotes"  jdbcType="BLOB" />

在java类中-

private String faxNotes;