Re: HashMap and dynamic JDBC update
Please *DO NOT* multipost.
(Reply cross-posted to rectify.)
Alessandro wrote:
I have an HashMap<String, Object> used to save names and values of
fields to be updated via JDBC update in a table. The type of data is
variable according to field name , so I'm using Object ... the idea to
produce update query is as follows but I believe there is a better
method to do it.
//START
public void updateQuery(Session session, String table,
HashMap<String,Object> updateH, String condition) throws Throwable{
try{
Your indentation is far too wide for Usenet. Do not use TAB characters to
indent Usenet posts; use a maximum of four spaces per indent level.
String sQuery="UPDATE " + table + " SET ";
String keys="";
Iterator iterator = updateH.keySet().iterator
(); //key set
while(iterator.hasNext()) //got the key
and then remove first char,
ie ","
keys= keys + "," + iterator.next() +
"= ?";
PreparedStatement ps = session.connection
().prepareStatement(sQuery
+ keys.substring(1) + " WHERE " + condition);
while(iterator.hasNext()){
Object myObj=updateH.get(iterator.next
());
if(myObj instanceof String){
Anytime you are checking type with 'instanceof' to support varied behavior,
suspect that you've erred.
ps.setString(....
}
else if (myObj.instanceof Date){
ps.setDate(.....
}
//etc also for Double, Integer, ..
}
ps.executeUpdate();
}
catch(Throwable ex){
throw ex;
}
}
//END
I've built up queries and corresponding set logic, polymorphically, using tiny
little setters similar to
interface ParmSetter <T>
{
void setValue( PreparedStatement ps, T value );
}
class StringSetter implements ParmSetter <String>
{
public void setValue( PreparedStatement ps, String value )
{
ps.setString( value );
}
}
Then you build up a list of SQL WHERE clause pieces and corresponding
ParmSetters as you receive criteria. Then you iterate through, calling
nextSetter.setValue( ps, nextValue );
Yet another way is to skip 'PreparedStatement#setString()' and the rest and
just use 'setObject()'.
--
Lew