2017-08-28 2 views
0

SQLに問題があります。これは私のコードなので、なぜそれを修正するのかわからない。私はこれを行うためにJava EEとEclipseを使用します。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文を使用してください。パスワード=? ' 1行目

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サーバのバージョンに対応していること取扱説明書を確認してください " ?AND password =? 'ライン1"

+0

私はあなたのSQL文で** ";" **が必要と思わない! –

+0

また、[PreparedStatementを実行しようとするとMySQLSyntaxErrorExceptionが発生する](https://stackoverflow.com/questions/18680503/preparedstatement-does-not-work-with-mysql-jdbc) – Dukeling

+0

@GuillaumeHusta ';'それは問題ではありません。あなたは ';'クエリの終わり – Blasanka

答えて

4

であなたが準備されたステートメントを使用している場合、関数はパラメータとして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(); 
        ^^ 

また

documentationStatementのクラスを参照してください(実行ブールString sql) throw SQLException

与えられたSQL文を実行します。複数の結果を返すことがあります。 一部の(珍しい)状況では、単一のSQL文が複数の結果セットおよび/または更新カウントを 返します。通常は を無視することができます。(1) 複数の結果を返すストアドプロシージャを実行するか、または(2)不明なSQL文字列 を動的に実行している場合を除きます。 executeメソッドはSQL文を実行し、 は最初の結果の形式を示します。その後、メソッド getResultSetまたはgetUpdateCountを使用して結果を取得し、 getMoreResultsを使用して後続の結果に移動する必要があります。

注:このメソッドは、PreparedStatementまたは CallableStatementで呼び出すことはできません。

関連する問題

 関連する問題