【问题标题】:How to dynamically set the PreparedStatement in java?如何在java中动态设置PreparedStatement?
【发布时间】: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


【解决方案1】:

您的解决方案对我来说看起来不错,但如果您使用很多参数,那么我建议使用 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();

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多