#java #database #spring #clob
#java #База данных #spring #clob
Вопрос:
Обычно я использую триплет lobHandler JdbcTemplate PreparedStatementSetter для вставки моего Clob в базу данных, как я видел на http://www.java2s.com/Code/Java/Spring/InsertClobData.htm
Мой вопрос в том, как это сделать с NamedParameterJdbcTemplate? В нем нет методов, принимающих таинственный интерфейс PreparedStatementSetter в качестве параметра.
Комментарии:
1. ничего по вашей теме, но у BLOB / CLOB тоже есть методы для stream, используя FileInputStream / FileOutputStream
2. спасибо, но на самом деле это не связано .. 🙁 Я знаю, как с ними обращаться с помощью старомодного стандартного кода JDBC.
Ответ №1:
Это работает без использования 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);
Комментарии:
1. как по мне, это не работает (Oracle 9.2, Java 6), выдает исключение: ‘java.lang. ClassCastException: java.lang. Строка в oracle.jdbc.driver. OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7898) в oracle.jdbc.driver. OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7511) в oracle.jdbc.driver. OraclePreparedStatement.setObject(OraclePreparedStatement.java:7984) в oracle.jdbc.driver. OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:237)’
2. Извините, я проверял по HSQL. Какую версию Spring вы используете? Я думаю, что именно эта ошибка является причиной вашей проблемы, она должна была быть решена в 2.5.2.
3. БОЖЕ, ну, мы должны использовать Spring 2.0 в этом проекте… 🙁 Большое вам спасибо, что указали на это
4. Восстанавливая это, я использую Spring 3.0 здесь, и это работает. На самом деле нигде не задокументировано, как или почему, но это так. Мне нравится это решение больше, потому что SqlLobValue не реализует toString (), поэтому для его чтения потребовалось немного больше работы.
5. Да, это кажется довольно приятным.
Ответ №2:
Я использую 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();
}
Ответ №3:
Я делаю что-то вроде этого, очевидно, мы используем базу данных Oracle, если вы используете что-то другое, вам придется возиться с некоторыми параметрами. Метод getJdbcTemplate является вспомогательным методом JdbcDaoSupport (вспомогательного класса spring).)
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