取出一个LONGBLOB如使用MyBatis的一个字节数组(Fetching a LONGBLOB

2019-07-18 00:58发布

我在一个项目中,我有一个查询,从LONGBLOB场在MySQL数据库中获取数据使用MyBatis的。 我希望得到的结果作为一个字节数组( 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>

不过我想知道如果有不涉及创建一个包装类更优雅的方式。

Answer 1:

在我的项目中,我们使用的斑点是这样的:

我们定义为我们的一类结果地图:

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

执行之后团块是字节数组英寸



Answer 2:

作为建议的达菲得到结果的唯一途径作为一个字节数组是:

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 )类型处理器,而且是不可能指定的类型处理器select标签。



文章来源: Fetching a LONGBLOB as a byte array using MyBatis