使用 myBatis 从数据库中获取一个 blob 作为 byte[]
Fetching a blob from database as a byte[] using 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
有人可以告诉我我做错了什么吗?
尝试在结果映射中指定 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 类型或使用自定义类型处理程序,就像在接受的答案中一样。
所以,我通过在我的代码中进行以下更改来实现它 -
我正在使用 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[]。
我在查询中使用它来获取 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 class -
private String faxNotes;
我在项目中使用 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
有人可以告诉我我做错了什么吗?
尝试在结果映射中指定 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 类型或使用自定义类型处理程序,就像在接受的答案中一样。
所以,我通过在我的代码中进行以下更改来实现它 -
我正在使用 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[]。
我在查询中使用它来获取 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 class -
private String faxNotes;