4

テーブルの列の1つは、BLOBデータ型(Oracle 10g)です。iBatisを介して実行される単純なselectクエリを使用して、BLOB列を選択し、Struts2とJSPを使用して表示します。

iBatisxmlファイルの結果タグのjdbctypeはjava.sql.Blobでした

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

Blob列のtypeHandlerクラスについて言及する必要がありますか?現在、列タイプの不一致を示すエラーが発生しています。

注:この列は選択され、java.sql.Blob型の属性を持つJavaBeanにマップされます。

4

4 に答える 4

3

Oracle では、型にネイティブ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 の使用に問題はありませんでした。ブロブ タイプの SELECT を実行したときの問題です。私はOracle 9iを使用していますが、これが私が行った方法です:

  1. mybatisOracle JDBC ドライバーをプロジェクトに追加します。依存関係も必要になります。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. Oracle BLOBクラスから byte[] を読み取るためのカスタム BaseTypeHandler を追加します。

    @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 に答える