【发布时间】:2017-07-11 13:43:00
【问题描述】:
我试图构建一个preparedStatement,这里是示例:
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());
所以三个“if”语句是它变得棘手的地方,在准备语句构建后,我不知道我应该设置多少变量,我现在唯一的方法是这样的:
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);
}
我必须列出所有的组合(不是全部为 null,因为我不需要设置任何东西),感觉有点蹩脚......有没有更好的方法呢?有什么方法可以在创建准备好的语句时动态设置值?
【问题讨论】:
-
使用 Builder 设计模式创建
StatementBuilder类以创建语句可能很有用。这样你就可以将你的逻辑(即创建和填写语句)和获取结果并返回它们的类分开。
标签: java mysql prepared-statement