2017-02-21 102 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(); 
相關問題