2017-02-21 98 views
0

我试图在这里建立一个PreparedStatement是例如:如何在java中动态设置PreparedStatement?

这样三个“如果”的声明是它越来越棘手,在准备发言后建,我不知道有多少变量应集,我现在在做的唯一方法是这样的:

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); 
} 

我必须列出的所有组合(不适用于所有的空,因为我并不需要设置任何东西),感觉有点有点跛脚...有没有更好的办法做到这一点?任何我们可以在创建准备语句时动态设置值的方式?

+1

使用Builder的设计模式创建Statement来创建一个'StatementBuilder'类可能很有用。这样你可以分离你的逻辑(即创建和填充语句)和获取结果并返回它们的类。 – ahjohnston25

回答

0

你的解决方案看起来不错,但如果你使用了很多参数,那么我会建议使用NamedParameterStatement类。语法将保持不变,而不是使用参数名称的参数号。

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(); 
相关问题