关于Java:使用prepare语句的动态Sql查询

文章讲述了作者在使用DynamicSQL和PreparedStatement构建MySQL查询时遇到的问题,涉及到参数检查、IN子句括号和ArrayList的使用。作者试图根据用户输入的非空参数动态构建查询,但遇到空指针异常和语法错误。
摘要由CSDN通过智能技术生成

Dynamic Sql qyery using prepare statement

我想创建一个动态查询来过滤产品。我要从"产品"表中过滤产品
根据某些参数,例如

  • 味道
  • 价钱
  • 尺寸
  • 类型
    我正在创建一个函数,在其中我正在执行MySQL查询,我想检查用户使用了哪个参数,使用了哪些参数,这些值将不为null,其余未选择的参数为null。所以我正在检查为null的函数,并在查询中传递它们
    我尝试了以下代码
    但它显示带有以下消息的空指针执行

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

,您尝试打印查询:

SELECT * FROM products WHERE 1=1 AND brand in (?,? AND Price < ? AND Size < ? AND Type = ?

下面的代码是:

public List<Products> Filter_Itemsl(String[] Brand, String[] Flavour, float Price, float Size, String Type) {

    List<Object> parameters = new ArrayList<Object>();
    ResultSet rs;
    List<Products> data = null;
    PreparedStatement stmt;

    try {
        StringBuilder query = new StringBuilder("SELECT * FROM products WHERE 1=1");
        if (Brand != null) {
            query.append(" AND brand in (");
            for (int i = 0; i < Brand.length; i++) {
                query.append('?');
                if (i < Brand.length - 1) {
                    query.append(',');
                }
                parameters.add(Brand[i]);
            }
        }
        if (Flavour != null) {
            query.append(" AND Flavour in (");
            for (int i = 0; i < Brand.length; i++) {
                query.append('?');
                if (i < Flavour.length - 1) {
                    query.append(',');
                }
                parameters.add(Flavour[i]);
            }
        }
        if (Price != 0) {
            query.append(" AND Price < ?");
            parameters.add(Price);
        }
        if (Size != 0) {
            query.append(" AND Size < ?");
            parameters.add(Size);
        }
        if (Type != null) {
            query.append(" AND Type = ?");
            parameters.add(Type);
        }
        String Query = query.toString();
        System.out.println(Query);

        stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(Query);

        int i = 1;
        for (Object parameter : parameters) {
            stmt.setObject(i++, parameter);
        }

        rs = stmt.executeQuery();
        if (rs != null) {
            data = new ArrayList<Products>();
            while (rs.next()) {
                Products p = new Products();
                p.setTitle(rs.getString("Ttile"));
                p.setCategory(rs.getString("Category"));
                p.setSubCategory(rs.getString("SubCategory"));
                p.setSubCategoryTwo(rs.getString("SubCategorytwo"));
                p.setPrice(rs.getInt("Price"));
                p.setFlavour(rs.getString("Flavour"));
                p.setSize(rs.getFloat("Size"));
                p.setImage(rs.getString("image"));
                p.setBrand(rs.getString("Brand"));
                p.setInstock(rs.getString("instock"));
                p.setInstockQty(rs.getInt("instockqty"));
                p.setType(rs.getString("Type"));
                data.add(p);
            }

        }

    } catch (Exception e) {
        System.out.println(e.getStackTrace());
        System.out.println("----------------------");
        System.out.println(e.getMessage());
        System.out.println("----------------------");
        System.out.println(e.getSuppressed());
        System.out.println("----------------------");
        e.printStackTrace();

        return null;
    }
    return data;

}
  • 当使用IN关键字时,可以使用打开的(大括号启动该子句,但我看不到要使用该)右括号括起来。解决该问题,您的查询应该可以正常工作。
  • MySQL服务器版本,用于在')'最终营养',)'Dymatize优质乳清')附近使用正确的语法,并且在第1行的价格<4000.0 AND尺寸<4.0'如果我关闭括号,这是错误的提示
  • 为条件为真
  • 另外,确保parameters是链表而不是arrayList,以保持参数顺序
  • 您似乎在每个参数之后添加了),所以它最终像这样:IN (param1,)param2,),但只需要像这样在最后添加:IN (param1, param2)。只需在for循环后添加)。
  • 问题已解决,但是当我传递所有参数的值时它可以工作,但是如果我跳过任何参数则它不起作用为什么?
  • 检查空字符串。例如if(!("").equals(Flavor) && Flavor != null) 除了空检查
  • java.lang.IndexOutOfBoundsException:索引:0,大小:0 \\ tjava.util.ArrayList.rangeCheck(ArrayList.java:635)我试过了,但是现在给出了这个异常
  • @ user3660263 ArrayList还维护数据的顺序。也许您将它与HashSet混淆了。
  • @ user748316 Flavor是一个数组,由于将字符串与数组进行比较,因此检查"".equals(Flavor)完全无关。

您需要在for循环后关闭括号

if (Flavour != null) {
        query.append(" AND Flavour in (");
        for (int i = 0; i < Brand.length; i++) {
            query.append('?');
            if (i < Flavour.length - 1) {
                query.append(',');
            }
            parameters.add(Flavour[i]);
        }
       query.append(")");
    }
  • 当我选择所有参数或少数几个参数时,可以帮我解决我的查询问题吗

您缺少每个IN sql语句的结尾)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ok060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值