4

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

iBatis xml 文件中的结果标记的 jdbctype 为 java.sql.Blob

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

我们应该提到 Blob 列的任何 typeHandler 类吗?目前我们收到一个错误,说明列类型不匹配。

注意:选择此列并将其映射到具有 java.sql.Blob 类型的属性的 java bean

4

4 回答 4

3

我认为你不能在 Oracle 中使用 native 类型jdbctype和. 解决方案是创建自定义处理,然后映射它像 -LOBiBatistypeHandlerLOB

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

更多信息在typeHandlerCallback 这里

于 2012-08-21T21:26:33.460 回答
3

不需要创建 typeHandler。对于Oracle, jdbctype 是BLOB

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

假设“字节”为字节 []。

重要的是:在select sql中,你必须这样设置jdbcType:

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

我注意到Postgresql的这个 jdbctype是不同的。您必须设置:

<result property="bytes" column="COLUMNBLOB"  jdbcType="BINARY" />
于 2013-02-22T11:58:56.860 回答
0

我在这里找到了处理这个的人。

对于CLOB

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

对于BLOB

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

我仍在寻找它与 C# 一起使用!

于 2012-09-20T16:52:20.680 回答
0

我在使用 INSERT 时没有问题,我在选择 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 以从 Oracle BLOB类中读取 byte[] :

    @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. 将 type handlers 包添加到 mybatis 配置中。如您所见,我使用的是spring-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 的 Oracle BLOB 中读取 byte[]

    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 。

于 2016-01-29T19:32:41.380 回答