web-dev-qa-db-fra.com

Comment utiliser l'instruction préparée pour la requête de sélection en Java?

J'avais essayé plusieurs fois d'utiliser des instructions préparées mais cela renvoie une exception SQL. voici mon 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;
}

Lors de l'exécution, j'ai obtenu l'exception SQL suivante:

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.

Une suggestion pour que cela fonctionne? tout morceau de code est apprécié.

12
jasim

Vous devez utiliser:

preparedStatement.executeQuery();

au lieu de

preparedStatement.executeQuery(login);

lorsque vous passez une chaîne à executeQuery()que la requête est exécutée littéralement et donc ? est envoyé à la base de données qui crée alors l'erreur. En passant la chaîne de requête, vous n'exécutez pas l'instruction préparée "mise en cache" pour laquelle vous avez transmis les valeurs.

25

Pour les deux paramètres, vous utilisez preparedStatement.setString(1, ..); afin que le premier paramètre soit défini deux fois. mais vous ne définissez jamais la valeur du deuxième paramètre.

alors changez

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

à

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