我如何使用MyBatis BlobInputStreamTypeHandler / ClobReaderTypeHandler来传输选择请求的内容?

问题描述 投票:0回答:1

我需要获取BLOB内容并将其存储在某个位置(假设它是文件)。 BLOB内容可能很大,因此我想使用流来执行此操作。在MyBatis 'Configuration XML' page上有可用类型处理程序的列表。我发现有BlobInputStreamTypeHandler,它应该允许我获取InputStream,而这正是我所需要的。因此,我为xml配置中的查询指定了resultType="java.io.InputStream"。但是,当我尝试从InputStream读取“从DB读取”方法执行后得到的数据时,得到了java.io.IOException: Closed Connection。我试图弄清楚,发现该类org.apache.ibatis.executor.resultset.DefaultResultSetHandler is closing resultSet使得流不可读。

当我尝试使用ClobReaderTypeHandler从CLOB获取Reader时,我遇到了同样的异常。

我正在使用mybatis版本3.5.4。

如何从CLOB或BLOB列获取Reader / InputStream?这是错误还是我做错了?

java oracle mybatis
1个回答
0
投票
假设您的映射器方法声明如下...

@Select("select bindata from users where id = #{id}") InputStream selectBlob(Integer id);

获取和读取输入流的代码看起来像这样。

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
  Mapper mapper = sqlSession.getMapper(Mapper.class);
  try (InputStream inputStream = mapper.selectBlob(1)) {
    byte[] buffer = new byte[1024];
    int read;
    while((read = inputStream.read(buffer)) > -1) {
      // use the read data
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.