2011-04-26 30 views
5

que suelen utilizar el triplete lobHandler + + JdbcTemplate PreparedStatementSetter para insertar mi Clob en la base de datos, como vi en http://www.java2s.com/Code/Java/Spring/InsertClobData.htmInserción Clob con NamedParameterJdbcTemplate

Mi pregunta es cómo hacer esto con un NamedParameterJdbcTemplate? No tiene métodos que acepten la misteriosa interfaz PreparedStatementSetter como parámetro.

+0

nada con el tema, pero BLOB/CLOB tiene métodos para la corriente también, usando FileInputStream/FileOutputStream – mKorbel

+0

gracias, pero en realidad no relacionados :-(.. sé cómo manejarlos por código repetitivo anticuada JDBC . – jabal

Respuesta

8

Esto funciona sin utilizar el PreparedStatementCallback y lobHandler, al menos cuando se inserta una cadena.

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

en cuanto a mí que no funciona (Oracle 9.2, Java 6), lanza una excepción: 'java.lang.ClassCastException: java.lang.String \t en oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical (OraclePreparedStatement. java: 7898) \t en oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal (OraclePreparedStatement.java:7511) \t en oracle.jdbc.driver.OraclePreparedStatement.setObject (OraclePreparedStatement.java:7984) en oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject (OraclePreparedStatementWrapper.java:237)' – jabal

+0

Lo siento, verificada contra HSQL. ¿Qué versión de Spring estás usando? Creo que es [este error] (https://jira.springsource.org/browse/SPR-4508?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#issue-tabs) que causa el problema , debería haberse resuelto en 2.5.2. – Jonas

+0

OMG, así que tenemos que utilizar Spring 2.0 en este proyecto ... :-(Muchas gracias por señalar esto – jabal

0

Hago algo como esto, obviamente utilizamos una base de datos Oracle si utiliza algo más, tendrá que manipular algunos de los parámetros. El método getJdbcTemplate es un método de ayuda de JdbcDaoSupport (una clase de ayuda primavera.)

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

gracias, pero mi pregunta era cómo hacer esto con namedparameterjdbctemplate, y su solución utiliza una JdbcTemplate y es específica de Oracle – jabal

0

estoy utilizando Spring 2.5.6 + Oracle y para mí funcionó de inmediato.

// 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(); 
} 
Cuestiones relacionadas