使用MyBatis获取LONGBLOB作为字节数组

时间:2013-01-09 10:06:54

标签: java ibatis mybatis

我在项目中使用MyBatis,我有一个查询从MySQL数据库中的LONGBLOB字段获取数据。我希望将结果作为字节数组(byte[]),所以我试试这个:

<select id="fetchData" resultType="_byte[]" parameterType="_long">
    select blobData from Table where id = #{id}
</select>

然而,这不起作用。我收到以下错误:

java.lang.ClassCastException: [B cannot be cast to [Ljava.lang.Object;
    at org.apache.ibatis.binding.MapperMethod.convertToArray(MapperMethod.java:146)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:129)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)

有什么东西告诉我应该指定一个类型处理程序(BlobTypeHandler?),还是什么?但是在哪里以及如何?


我应该提一下,通过为字节数组创建一个包装类并使用结果映射来解决这个问题是没有问题的:

<resultMap type="BlobData" id="BlobDataMap">
    <constructor>
        <idArg javaType="_long" column="id" />
        <arg javaType="_byte[]" column="blobData" />
    </constructor>
</resultMap>

我仍然想知道是否有更优雅的方式不涉及创建包装类。

2 个答案:

答案 0 :(得分:1)

在我的项目中,我们以这种方式使用blob:

我们为使用过的类定义结果图:

<resultMap class="SomeClass" id="SomeClassResultMap">
    <result property="classByteAttribute" column="blobData" />
    <result property="classIdAttribute" column="id" />
</resultMap>

并在select语句中使用此结果映射

<select id="selectStatement" resultMap="SomeClassResultMap" parameterClass="Integer">
    SELECT * FROM EXAMPLETABLE where id=#id#
</select>

执行后,blob在字节数组中。

答案 1 :(得分:0)

正如duffy所建议的那样,将结果作为字节数组得到的唯一方法是:

Mybatis版本3.1。+

定义resultMap

<resultMap class="MyClass" id="MyClassMap">
    <result property="myByteArray" column="MYBINARY " />
</resultMap>

<select id="selectStatement"  resultMap="MyClassMap">
        SELECT MYBINARY FROM EXAMPLETABLE
</select>

但是,

Mybatis版本3.0.5

<select id="selectStatement"  resultType="_byte[]">
    SELECT MYBINARY FROM EXAMPLETABLE
</select>

这是一个奇怪的回归,因为mybatis无法应用正确的(BlobTypeHandler)TypeHandler,也无法在select标记上指定TypeHandler。