查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在附近使用'?和密码=?'在第1行

时间:2017-08-28 12:47:54

标签: java mysql

我遇到了SQL问题。这是我的代码,我不知道为什么,也不知道修复它。我使用Java EE和Eclipse来做到这一点。

public void userLogin(String username,String password) {

   Connection conn = null;  
   PreparedStatement ps = null; 
   ResultSet rs = null;

   try {        
      conn = JDBCUtilsWithProperties.getConnection();
      String sql = "select * from users where username = ? and password = ?;";
      ps = conn.prepareStatement(sql);
      ps.setString(1,   username);
      ps.setString(2,   password);
      rs = ps.executeQuery(sql);

      if(rs.next()) {   
         System.out.println("SUCESS");
      } else {
         System.out.println("FAIL");
      }

      } catch (Exception e) {
         // TODO: handle exception
         e.printStackTrace();
      } finally {
         JDBCUtilsWithProperties.release(rs, ps, conn);
      }     
   }
}

public class JDBCUtilsWithProperties {

   private static String driverClass;
   private static String url;
   private static String username;
   private static String password;

   private JDBCUtilsWithProperties(){}

   static {
      try {
         readConfig();
         Class.forName(driverClass);
      } catch (Exception e) {
         // TODO: handle exception
         e.printStackTrace();
      }
   }

   public static void readConfig() {    
      Properties pp = new Properties();
      try { 
         pp.load(new FileInputStream("src//config.properties"));
         driverClass = pp.getProperty("driverClass");
         url = pp.getProperty("url");
         username = pp.getProperty("username");
         password = pp.getProperty("password");
      } catch (Exception e) {
         // TODO: handle exception
      }
    }

    public static Connection getConnection() {
       try {
          return DriverManager.getConnection(url,username,password);
       } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
       }
       return null;
    }

    public static Statement createStatement() {
       Connection conn = getConnection();
       Statement stat = null;
       try {
          stat = conn.createStatement();
       } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
       }
       return  stat;
    }

    public static void release(ResultSet rs,Statement stat,Connection conn){
       if(rs != null) {
          try {
             rs.close();
          } catch (Exception e) {
             // TODO: handle exception
             e.printStackTrace();
          }
          rs = null;
        }
        if(stat != null) {
           try {
              stat.close();
           } catch (Exception e) {
              // TODO: handle exception
              e.printStackTrace();
           }
           stat = null;
        }
        if(conn != null) {
           try {
              conn.close();
           } catch (Exception e) {
              // TODO: handle exception
              e.printStackTrace();
           }
           conn = null;
        }
    }

    public static void release(Statement stat,Connection conn) {
       if(stat != null){
          try {
             stat.close();
          } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
          }
          stat = null;
        }
        if(conn != null) {
           try {
              conn.close();
           } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
           conn = null;
        }
    }
}

运行时会显示通知:

  

"您的SQL语法出错了;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'?和密码=?'在第1行"

1 个答案:

答案 0 :(得分:6)

如果使用预准备语句,则执行函数没有SQL查询作为参数:

String sql = "select * from users where username = ? and password = ?;";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
                    ^^

另请参阅Statement班级的documentation

  

布尔执行(String sql)                   抛出SQLException

     

执行给定的SQL语句,该语句可能返回多个结果。   在某些(不常见的)情况下,可能会返回单个SQL语句   多个结果集和/或更新计数。通常你可以忽略   除非你是(1)执行你知道的存储过程   返回多个结果或(2)您正在动态执行   未知的SQL字符串。 execute方法执行SQL语句和   表示第一个结果的形式。然后,您必须使用这些方法   getResultSet或getUpdateCount来检索结果,和   getMoreResults移动到任何后续结果。

     

注意:无法在PreparedStatement上调用此方法   的CallableStatement。