如何选择从数据库中使用iBatis的BLOB列(How to Select a BLOB colum

2019-07-31 02:45发布

一个表的列是BLOB数据类型(Oracle 10g中)的。 我们必须通过执行的iBatis一个简单的选择查询来选择BLOB列,并使用Struts2的和JSP显示。

在iBatis的XML文件中的结果标记有作为jdbc类型的java.sql.Blob

<result property="uploadContent" column="uploadcontent" jdbctype="Blob"/>   

我们是否应该提为BLOB列中的任何类型处理器类? 目前我们得到一个错误,说明列类型不匹配。

注意:此列中选择并映射到一个Java bean谁拥有类型java.sql.Blob中的属性

Answer 1:

我认为你不能使用本地jdbctype对于LOB在Oracle类型与iBatis 。 解决的办法是创建自定义typeHandler来处理LOB然后映射它像-

<result property="aClassStringProperty" column="aClobColumn" typeHandler="com.path.to.my.ClobTypeHandler"/>

关于更多信息typeHandlerCallback 这里 。



Answer 2:

这不是neccesary创建类型控制器。 对于Oracle,而且jdbcType是BLOB

<result property="bytes" column="COLUMNBLOB"  jdbcType="BLOB" />

Assumming “字节” 作为字节[]。

最重要的事情:在选择SQL,则必须设置jdbc类型,以这种方式:

INSERT INTO X (COLUMNBLOB) VALUES #bytes:BLOB#

我注意到,这为jdbc类型PostgreSQL是不同的。 您必须设置:

<result property="bytes" column="COLUMNBLOB"  jdbcType="BINARY" />


Answer 3:

我发现有人谁处理这这里 。

对于CLOB:

<result property="uploadContent" column="obfile" jdbctype="String" />

对于BLOB:

<result property="uploadContent" column="obfile" jdbctype="byte[]" />

我仍然在寻找它与C#的工作!



Answer 4:

我dindn't使用刀片,我的问题在那里,当我做了BLOB类型的选择有问题。 我使用Oracle 9i和这是怎么了我所做的:

  1. Oracle JDBC驱动程序添加到您的项目,你将需要mybatis依赖性太大。 如果您正在使用Maven:

     <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.3</version> </dependency> 
  2. 添加自定义BaseTypeHandler从甲骨文BLOB读取字节[]类:

     @MappedTypes(byte[].class) public class OracleBlobTypeHandler extends BaseTypeHandler<byte[]> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, byte[] bytes, JdbcType jdbcType) throws SQLException { // see setBlobAsBytes method from https://jira.spring.io/secure/attachment/11851/OracleLobHandler.java try { if (bytes != null) { //prepareLob BLOB blob = BLOB.createTemporary(preparedStatement.getConnection(), true, BLOB.DURATION_SESSION); //callback.populateLob OutputStream os = blob.getBinaryOutputStream(); try { os.write(bytes); } catch (Exception e) { throw new SQLException(e); } finally { try { os.close(); } catch (Exception e) { e.printStackTrace();//ignore } } preparedStatement.setBlob(i, blob); } else { preparedStatement.setBlob(i, (Blob) null); } } catch (Exception e) { throw new SQLException(e); } } /** see getBlobAsBytes method from https://jira.spring.io/secure/attachment/11851/OracleLobHandler.java */ private byte[] getBlobAsBytes(BLOB blob) throws SQLException { //initializeResourcesBeforeRead if(!blob.isTemporary()) { blob.open(BLOB.MODE_READONLY); } //read byte[] bytes = blob.getBytes(1L, (int)blob.length()); //releaseResourcesAfterRead if(blob.isTemporary()) { blob.freeTemporary(); } else if(blob.isOpen()) { blob.close(); } return bytes; } @Override public byte[] getNullableResult(ResultSet resultSet, String columnName) throws SQLException { try { //use a custom oracle.sql.BLOB BLOB blob = (BLOB) resultSet.getBlob(columnName); return getBlobAsBytes(blob); } catch (Exception e) { throw new SQLException(e); } } @Override public byte[] getNullableResult(ResultSet resultSet, int i) throws SQLException { try { //use a custom oracle.sql.BLOB BLOB blob = (BLOB) resultSet.getBlob(i); return getBlobAsBytes(blob); } catch (Exception e) { throw new SQLException(e); } } @Override public byte[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException { try { //use a custom oracle.sql.BLOB BLOB blob = (BLOB) callableStatement.getBlob(i); return getBlobAsBytes(blob); } catch (Exception e) { throw new SQLException(e); } } } 
  3. 该类型处理器封装添加到MyBatis的配置。 正如你所看到的,我使用的弹簧的MyBatis:

     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeHandlersPackage" value="package.where.customhandler.is" /> </bean> 
  4. 然后, 你可以从MyBatis的甲骨文的BLOB读字节[]:

     public class Bean { private byte[] file; } interface class Dao { @Select("select file from some_table where id=#{id}") Bean getBean(@Param("id") String id); } 

我希望这将有所帮助。 这是这个优秀的答案的改编:这是这个优秀的答案的改编: https://stackoverflow.com/a/27522590/2692914 。



文章来源: How to Select a BLOB column from database using iBatis