3

我在一个项目中使用 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>

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

4

2 回答 2

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 位于字节数组中。

于 2013-01-09T10:55:55.547 回答
1

正如 duffy 所建议的,将结果作为字节数组获取的唯一方法是:

Mybatis 3.1.+

定义一个结果映射

<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。

于 2014-01-31T21:04:32.310 回答