我有一个字符串,这是一个插入语句,我需要替换特殊字符?从列表中的特定元素。 查询字符串是
insert into OPRS_VEHICLE(VEHICLE_ID, DEPOT_ID, SERVICE_TYPE_ID, REGISTRATION_KEY,
REGISTRATION_NO, IS_ACTIVE,CREATED_BY, CREATED_DATE,
MODIFIED_BY, MODIFIED_DATE) values(?,?,?,?,?,?,?,?,?,?)
现在我需要更换每个?包含值的列表中包含特定元素的字符。
我试过这个
int index = query.indexOf("?");
for (int j = 0; j < list.size(); j++) {
formattedQuery = query.replace(query.substring(index, index+1),
list.get(j).toString());
}
我需要更换?与列表的相应值。
编辑
try{
conn.setAutoCommit(false);
if(query != null){
ps = conn.prepareStatement(query);
for (int i = 0; i < myCollection.size(); i++) {
List list = (List) myCollection.get(i);
int count = 1;
for (int j = 0; j < list.size(); j++) {
if(list.get(j) instanceof Timestamp) {
ps.setTimestamp(count, (Timestamp) list.get(j));
} else if(list.get(j) instanceof java.lang.Character) {
ps.setString(count, String.valueOf(list.get(j)));
}
else {
ps.setObject(count, list.get(j));
}
count++;
}
try {
ps.execute();
} catch (Exception e) {
}
如果预处理语句的执行失败,那么我需要调用一个方法,该方法接受整个集合列表并一次插入一个语句并提交。这该怎么做 ? (或)我认为是什么,因为我知道数组的大小,我可以将数组分成一半大小,然后为此准备语句并插入它?哪一个更好又安全?有可能这样做吗?
先谢谢
答案 0 :(得分:5)
您拥有的查询字符串实际上是如何在JDBC中表示具有动态值的SQL语句的示例。请参阅PreparedStatement
documentation中的以下示例,了解如何使用适当的值替换查询字符串中的?
字符:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
您还可以在Oracle的JDBC Basics教程中查看here。
答案 1 :(得分:2)
这样您就永远无法获得格式正确的查询。因为您要替换基本query
字符串并将其分配给新的formattedQuery
。此formattedQuery
将保留所有?
个占位符,但保留循环长度的最后一个。这不会产生您的预期。
您应该使用PreparedStatement在查询中设置值 见下面的例子。
示例:
PreparedStatement pst = con.prepareStatement( query );
for ( int j = 0; j < list.size(); j++ ) {
pst.setString( j + 1, list.get( j ).toString() );
}
pst.execute....
回复更新的帖子:
可以通过微小的更改执行相同的代码,以提交列表中的有效记录 我已经部分更改了您的代码并包含了一些用于理解的注释,如下所示 它应该解决你的问题:
try {
conn.setAutoCommit( false );
if ( query != null ) {
ps = conn.prepareStatement( query );
for ( int i = 0; i < myCollection.size(); i++ ) {
List list = ( List ) myCollection.get( i );
int count = 1;
for ( int j = 0; j < list.size(); j++ ) {
if ( list.get( j ) instanceof Timestamp ) {
ps.setTimestamp( count, ( Timestamp ) list.get( j ) );
} else if( list.get( j ) instanceof java.lang.Character ) {
ps.setString( count, String.valueOf( list.get( j ) ) );
} else {
ps.setObject( count, list.get( j ) );
}
count++;
} // for inner list
// now a record data is ready
try {
ps.execute();
// no errors? then if you don't want to lose, commit this record.
// because you are fearing if there would be error in next records to be inserted.
conn.commit();
} catch ( Exception specificE ) {
// handle specific ex here
} // try, catch
// clear current record parameters from the prepared statement.
// this allows to set next record parameters in loop continuation.
ps.clearParameters();
} // for outer collection
} // if query
} catch( Exception e ) {
// handle general ex here
} finally {
// close db objects if required
} // try, catch, finally
答案 2 :(得分:0)
如果你想继续使用String,请尝试:
int index = 0;
String formattedQuery = query;
for (int j = 0; j < list.size(); j++) {
index = query.indexOf("?",index);
formattedQuery = formattedQuery.replaceFirst("\\?", list.get(j).toString());
}
答案 3 :(得分:0)
您可以使用Java Formatter类,但是这通常使用%作为值的占位符而不是?因为它适用于printf格式字符串。
然后就可以了,
Formatter formatter = new Formatter()
formatter.format("INSERT INTO table_name(a_column, another_column) values(%s,%s)", value1, value2);
String formattedString = formatter.toString();
但是,请尝试使用PreparedStatement。
春课SimpleJdbcTemplate还有一个update(String sql, Object... args)
方法,可以完全按照你的意愿行事。
EG。 jdbc.update(sql, value1, value2)