Java 插入名为ParameterJDBCTemplate的Clob

Java 插入名为ParameterJDBCTemplate的Clob,java,database,spring,clob,Java,Database,Spring,Clob,我通常使用lobHandler+JdbcTemplate+PreparedStatementSetter三元组将Clob插入数据库,如我在上所示 我的问题是如何使用NamedParameterJdbcTemplate实现这一点?它没有接受神秘的PreparedStatementSetter接口作为参数的方法。这在不使用PreparedStatementCallback和lobHandler的情况下有效,至少在插入字符串时是如此 NamedParameterJdbcTemplate templat

我通常使用lobHandler+JdbcTemplate+PreparedStatementSetter三元组将Clob插入数据库,如我在上所示


我的问题是如何使用NamedParameterJdbcTemplate实现这一点?它没有接受神秘的PreparedStatementSetter接口作为参数的方法。

这在不使用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);

我这样做,显然我们使用Oracle数据库,如果您使用其他东西,您将不得不修改一些参数。getJdbcTemplate方法是JdbcDaoSupport(一个spring助手类)的助手方法


我正在使用Spring2.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();
}

与您的主题无关,但BLOB/CLOB也有用于流的方法,使用FileInputStream/FileOutputStream谢谢,但实际上不相关..:-(我知道如何用老式的JDBC样板代码来处理它们。至于我,它不起作用(Oracle 9.2,Java 6),抛出异常:“Java.lang.ClassCastException:Java.lang.String在Oracle.JDBC.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.Java:7898)在Oracle.JDBC.driver.OraclePreparedStatement.setObjectInternalOraclePreparedStatementWrapper.setObject(OraclePreparedStatement.java:7984)中的OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:237)“对不起,我根据HSQL进行了验证。您使用的是哪个版本的Spring?我认为是它导致了您的问题,它应该在2.5.2.OMG中得到解决,我们必须在这个项目中使用Spring 2.0…”-(非常感谢您指出这一点,我在这里使用的是Spring 3.0,这是有效的。没有任何地方真正记录了它是如何实现的或为什么实现的,但确实如此。我更喜欢这个解决方案,因为SqlLobValue没有实现toString()所以阅读它需要更多的工作。是的,这看起来很不错。谢谢,但我的问题是如何使用namedparameterjdbctemplate实现这一点,而您的解决方案使用jdbctemplate,并且是特定于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();
}