为什么PrepareStatement不能生成正确的SQL查询?

Zaf*_*far 2 java mysql sql jdbc

以下是我的PrepareStatement代码.它不会生成正确的SQL查询.它也没有超越1st println-statement.另外它在查询中说**未指明**(请参见下文).

我们怎么解决这个问题呢?

   ps1 = con.prepareStatement(
                     "select stuId, name, relationsName, houseAddress, houseNumber from temp where "
                        + " stuId like '?%' and " 
                        + " sex = '?' and " 
                        + " name like '?%' and "
                        + " age BETWEEN ? and ? and "
                        + " relationsName like '?%' " 
                        + " order by name asc limit 0, 150000 "
               );

               System.out.println("ps1 Before : " + ps1);
Run Code Online (Sandbox Code Playgroud)

输出:

ps1之前:com.mysql.jdbc.JDBC4PreparedStatement@14d55de:从temp中选择stuId,name,relationsName,houseAddress,houseNumber,其中stuId喜欢'?%'和sex ='?' 并命名为'?%'和年龄BETWEEN**未指明**和**未指明**和relationsName喜欢'?%'按名称排序asc limit 0,150000

它没有超出这一点.此外,它说NOT SPECIFIED查询(请参阅为末).

有什么见解吗?

       ps1.setString(1, stuId);
       ps1.setString(2, gender);
       ps1.setString(3, name);
       ps1.setInt(4, startAge);
       ps1.setInt(5, endAge);
       ps1.setString(6, relationsName);

       System.out.println("ps1 After : " + ps1);

       rs = ps1.executeQuery();
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 11

因为占位符用单引号括起来,因此使它成为一个值而不再是一个参数.你应该摆脱它,例如

ps1 = con.prepareStatement(
                 "select stuId, name, relationsName, houseAddress, houseNumber from temp where "
                    + " stuId like ? and " 
                    + " sex = ? and " 
                    + " name like ? and "
                    + " age BETWEEN ? and ? and "
                    + " relationsName like ? " 
                    + " order by name asc limit 0, 150000 "
           );
Run Code Online (Sandbox Code Playgroud)

for LIKE语句,你应该连接java中的值,而不是sql,

ps1.setString(1, stuId + '%');
Run Code Online (Sandbox Code Playgroud)

  • 查询本身的连接也应该起作用(例如`?||'%'`或`?+'%'`或甚至``fn concat(?,'%')}`. (2认同)
  • `{fn concat(..)}`是连接的JDBC转义,它应该使查询与数据库无关(只要驱动程序支持concat函数转义). (2认同)