Re: Best way to do this?
harryajh wrote:
ResultSet rs = ps.executeQuery();
while (true)
{
ret = new myBean();
Class names should start with an upper-case letter.
String propName = rs.getString(2);
if (propName.equalsIgnoreCase("licence_number"))
{
ret.setLicenceNo(rs.getString(3));
}
else if (propName.equalsIgnoreCase("return_requirement_id"))
{
ret.setReturnReqId(rs.getString(3));
}
}
It looks like you might need to revise your database query or schema -
the same column of the result should not mean different things.
But since it does ...
Alan Gutierrez wrote:
I read the OPs uncompilable code as being a loop over a result set, even
though it has that nonsense while(true) which really should read while
(rs.next()), but then maybe the OP really wants an infinite loop over a
single row of a result set. In which case, it doesn't matter how much
faster it runs.
One way would be to have an enum keyed to the different possible
values from column 2 with a service method to set the correct value
from column 3, something similar to this uncompiled (let alone tested)
idea:
public enum ColumnSetter
{
licence_number
{
@Override
public void setColumn3( MyBean ret, String value )
{
ret.setLicenceNo( value );
}
},
return_requirement_id
{
@Override
public void setColumn3( MyBean ret, String value )
{
ret.setReturnReqId( value );
}
};
abstract public void setColumn3( MyBean ret, String value );
}
Then the client code is something along the uncompiled, untested lines
of:
...
PreparedStatement ps = Connection.prepareStatement( ... );
try
{
// set up query parms
MyBean ret = new MyBean();
for( ResultSet rs = ps.executeQuery(); rs.next(); )
{
ColumnSetter cs = ColumnSetter.valueOf( rs.getString( 2 ));
cs.setColumn3( ret, rs.getString( 3 )); // risks NPE
}
return ret;
}
finally
{
ps.close();
}
You can create a replacement method in ColumnSetter for valueOf() that
is case-insensitive. I usually define an instance override
'toString()' and static 'fromString()' for enums.
(As a riff on "RAII" I call the above try...finally idiom variously
"RRIG" or "RRIF" or "RRID", respectively "Resource Release is
Guaranteed", "Resource Release in Finally" or "Resource Release in
Deallocation". Your votes welcomed.)
--
Lew