webentwicklung-frage-antwort-db.com.de

Wie verwende ich eine vorbereitete Anweisung für eine Auswahlabfrage in Java?

Ich habe es mehrmals mit vorbereiteten Anweisungen versucht, aber es gibt eine SQL-Ausnahme zurück. Hier ist mein Code:

public ArrayList<String> name(String mobile, String password) {
    ArrayList<String> getdata = new ArrayList<String>();
    PreparedStatement stmt = null;
    try {
        String login = "select mobile, password from tbl_1 join tbl_2 on tbl_1.fk_id=2.Pk_ID where mobile=? and password=?";

        String data = "select * from tbl_2  where password='" + password + "'";

        PreparedStatement preparedStatement = conn.prepareStatement(login);

        preparedStatement.setString(1, mobile);
        preparedStatement.setString(1, password);

        ResultSet rs = preparedStatement.executeQuery(login);

        Statement stmts = (Statement) conn.createStatement();

        if (rs.next()) {
            System.out.println("Db inside RS");
            ResultSet data = stmts.executeQuery(data);

            while (data.next()) { /* looping through the resultset */

                getdata.add(data.getString("name"));
                getdata.add(data.getString("place"));
                getdata.add(data.getString("age"));
                getdata.add(data.getString("job"));
            }

        }

    } catch (Exception e) {
        System.out.println(e);
    }

    return getdata;
}

Während der Ausführung wurde die folgende SQL-Ausnahme festgestellt:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 '? and password=?' at line 1.

Irgendwelche Vorschläge, um diese Arbeit zu machen? Jeder Code ist willkommen.

12
jasim

Sie müssen verwenden:

preparedStatement.executeQuery();

anstatt von

preparedStatement.executeQuery(login);

wenn Sie eine Zeichenfolge an executeQuery()that übergeben, wird die Abfrage buchstäblich ausgeführt, und somit wird ? an die Datenbank gesendet, die dann den Fehler erzeugt. Durch die Übergabe einer Abfragezeichenfolge wird die vorbereitete "zwischengespeicherte" Anweisung, für die Sie die Werte übergeben haben, nicht ausgeführt.

25

Für beide Parameter verwenden Sie preparedStatement.setString(1, ..);, sodass der erste Parameter zweimal gesetzt wird. Sie legen jedoch nie den Wert für den zweiten Parameter fest.

also ändere

preparedStatement.setString(1, mobile);
            preparedStatement.setString(1, password);

zu

    preparedStatement.setString(1, mobile);
    preparedStatement.setString(2, password);
1
Jens