简体   繁体   中英

How to dynamically set the PreparedStatement in java?

I was trying to build a preparedStatement here is the example:

StringBuffer sqlStatement = new StringBuffer("Select * From APPLES where price =?");
 if (request.getPackagedDate() != null) {
                sqlStatement.append(" AND packaged_dt_tm >= ?");
           }
 if(request.getExpiredDate() != null) {
                sqlStatement.append(" AND expired_dt_tm <= ?");
           }
 if (request.getAppleType() != null) {
                sqlStatement.append(" AND TYPE LIKE ?");
           }}
 PreparedStatement retrieveAppleStatement = connection.getPreparedStatement(sqlStatement.toString());

so the three "if" statement is where it getting tricky, after the prepare statement built, I don't know how many variable I should set, the only way I'm doing right now is something like this:

retrieveAppleStatement.setString(1, request .getId());
if (hasPackagedTime && hasExpiredTime && hasType ) {
    statement .setLong(2, packagedTime );
    statement .setLong(3, expiredTime);
    statement .setString(4, (type+"%")); 
 }
else if (hasPackagedTime && ! hasExpiredTime && !hasType ) {
    statement .setLong(2, packagedTime));
 }
else if (hasPackagedTime && ! hasExpiredTime && hasType ) {
    statement .setLong(2, packagedTime);
    statement .setString(3, (type+"%")); 
 }
else if (hasPackagedTime && hasExpiredTime && !hasType ) {
    statement .setLong(2, packagedTime);
    statement .setLong(3, expiredTime);
 }
else if (!hasPackagedTime && hasExpiredTime && hasType ) {
    statement .setLong(2, expiredTime);
    statement .setString(3, (type + "%" ));
 }
else if (!hasPackagedTime && ! hasExpiredTime && hasType ) {
    statement .setString(2, (type + "%" )); 
 }
else if (!hasPackagedTime && hasExpiredTime && !hasType ) {
    statement .setLong(2, expiredTime);
 }

I have to listed all the combinations (not for all null because I don't need to set anything), it feels a little bit lame... Is there any better way doing this? Any way that we can set the value dynamically while creating the prepared statement?

Your solution looks fine to me but if you are using a lot of parameters then I would suggest to use NamedParameterStatement class. Syntax will remain same, just instead of parameter numbers you will be using parameter names.

Connection con=getConnection();
String query="select * from User where first_name=:firstname or last_name=:lastname";
NamedParameterStatement p=new NamedParameterStatement(con, query);
p.setString("firstname", "John");
p.setString("lastname", "Doe");
ResultSet rs=p.executeQuery();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM