2011-04-26 85 views
5

我通常使用LobHandler接口+的JdbcTemplate + PreparedStatementSetter三聯插入我的Clob到數據庫中,我就http://www.java2s.com/Code/Java/Spring/InsertClobData.htm插入的Clob與是NamedParameterJdbcTemplate

我的問題是如何使用是NamedParameterJdbcTemplate做到這一點看到?它沒有方法接受神祕的PreparedStatementSetter接口作爲參數。

+0

沒有你的話題,但BLOB/CLOB有流過的方法,用的FileInputStream/FileOutputStream中 – mKorbel 2011-04-26 16:19:21

+0

感謝,但是真的無關.. :-( 我知道如何用老式的JDBC樣板代碼來處理它們。 – jabal 2011-04-29 12:43:03

回答

8

這可以在不使用PreparedStatementCallback和lobHandler的情況下工作,至少在插入字符串時是如此。

NamedParameterJdbcTemplate template; //= new NamedParameterJdbcTemplate(pDs); 
String INSERT_STMT = "INSERT INTO MYTABLE (ID, LONG_TEXT) VALUES (:id, :clob)"; 
MapSqlParameterSource paramSource = new MapSqlParameterSource(); 
paramSource.addValue("id", 1L, Types.NUMERIC); 
paramSource.addValue("clob", "a long long text", Types.CLOB); 
template.update(INSERT_STMT, paramSource); 
+0

因爲對我來說,不工作(甲骨文9.2,Java 6中),拋出異常: 「java.lang.ClassCastException:java.lang.String中 \t在oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement。 java:7898) \t at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7511)在Oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:237)' – jabal 2011-04-29 12:35:15

+0

對不起,我對HSQL進行了驗證。你使用的是什麼版本的Spring?我認爲這是[此錯誤](https://jira.springsource.org/browse/SPR-4508?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#issue-tabs)導致您的問題,它應該在2.5.2中解決。 – Jonas 2011-04-30 16:31:43

+0

OMG,我們不得不在這個項目中使用Spring 2.0 ... :-(非常感謝您指出這一點 – jabal 2011-05-02 12:53:17

0

我這樣做,顯然我們使用Oracle數據庫,如果你使用其他的東西,你將不得不擺弄一些參數。該getJdbcTemplate方法是JdbcDaoSupport的helper方法(彈簧輔助類。)

getJdbcTemplate().execute(new ConnectionCallback() { 

     public Object doInConnection(Connection con) throws SQLException, DataAccessException { 

      PublishResponseObject responseObject = new PublishResponseObject(); 
      OracleCallableStatement ocstmt = null; 
      CLOB clob = null; 

      try { 
       clob = createCLOB(xmlString, con); 
       ocstmt = (OracleCallableStatement) con.prepareCall("{call schmea.publish(?)}"); 
       //When in insert mode and update By Pk is specified updates are possible and version numbers will be returned. 
       ocstmt.setCLOB(1, clob); 
      ... 
      } 
      finally { 
       clob.close() 
       stmt.close 
      } 
+1

謝謝,但我的問題是如何使用namedparameterjdbctemplate執行此操作,並且您的解決方案使用jdbctemplate並且是特定於oracle的 – jabal 2011-04-29 12:37:34

0

我使用Spring 2.5.6 + Oracle和對我來說它的工作,立竿見影。

// Inserts file into DB and returns the key for the new row 
public Number insert(String filename, byte[] data) { 
    MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue("filename", filename); 
    params.addValue("data", data); 

    // Returns the autogenerated ID 
    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    String[] columnNames = {"ID"}; 

    // This is a NamedParameterJdbcTemplate 
    jdbcTemplate.update(INSERT_SQL, params, keyHolder, columnNames); 

    return keyHolder.getKey(); 
} 
相關問題