使用preparedstatement

时间:2016-08-12 15:57:48

标签: java mysql

Testcase: testKlantVerwijderen(Main.ApplicationTest):   Caused an ERROR
SQL-exception in zoekKlant - statementcom.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 'from klant where naam = '2' and voornaam = 'test' and geboortedatum = '1998-08-1' at line 1
exception.DBException: SQL-exception in zoekKlant - statementcom.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 'from klant where naam = '2' and voornaam = 'test' and geboortedatum = '1998-08-1' at line 1
    at database.KlantDB.zoekKlant(KlantDB.java:116)
    at Main.Application.klantVerwijderen(Application.java:79)
    at Main.ApplicationTest.testKlantVerwijderen(ApplicationTest.java:101)

我的代码:

public Klant zoekKlant(Klant k) throws DBException {
  Klant returnKlant = null;
  // connectie tot stand brengen (en automatisch sluiten)
  try (Connection conn = ConnectionManager.getConnection();) {
     // preparedStatement opstellen (en automtisch sluiten)
     try (PreparedStatement stmt = conn.prepareStatement(
        "select * from klant from klant where naam = ? and voornaam = ? and geboortedatum = ? ");) {

        stmt.setString(1, k.getNaam());
        stmt.setString(2, k.getVoornaam());
        stmt.setDate(3, Date.valueOf(k.getGeboorteDatum()));
        stmt.execute();
        // result opvragen (en automatisch sluiten)
        try (ResultSet r = stmt.getResultSet()) {
           if (r.next()) {
              Klant klant = new Klant();
              klant.setId(r.getInt("id"));
              klant.setNaam(r.getString("naam"));
              klant.setVoornaam(r.getString("voornaam"));
              klant.setGeboorteDatum(r.getDate("geboortedatum").toLocalDate());
              klant.setOpmerking(r.getString("opmerking"));
              klant.setDebetstandLimiet(r.getBigDecimal("debetstand_limiet"));
              if (r.getByte("actief") == 0)
              {
                  klant.setActief(false);
              }
              else{
                  klant.setActief(true);
              }
              returnKlant = klant;
           }
           return returnKlant;

        } catch (SQLException sqlEx) {
           throw new DBException("SQL-exception in zoekKlant - resultset"+ sqlEx);
        }
     } catch (SQLException sqlEx) {
        throw new DBException("SQL-exception in zoekKlant - statement"+ sqlEx);
     }
  } catch (SQLException sqlEx) {
     throw new DBException(
        "SQL-exception in zoekKlant - connection");
  }

}

我的数据库:

1   id  int(11)         Nee Geen    AUTO_INCREMENT  Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    2   naam    varchar(64) latin1_swedish_ci       Nee Geen        Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    3   voornaam    varchar(32) latin1_swedish_ci       Nee Geen        Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    4   geboortedatum   date            Nee Geen        Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    5   opmerking   text    latin1_swedish_ci       Ja  NULL        Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    6   debetstand_limiet   double          Nee Geen        Veranderen Veranderen   Verwijderen Verwijderen 
Primaire sleutel Primaire sleutel
Unieke waarde Unieke waarde
Index Index
Ruimtelijk Ruimtelijk
Meer
    7   actief  tinyint(1)          Nee Geen

所以基本上某种程度上我的预备陈述有问题。虽然我不太明白什么?它应该正常工作,但它不是,这很奇怪。我只想选择符合我条件的所有字段,并且我非常确定这是查询应该是什么样子,但由于某种原因它不是。谁能告诉我我做错了什么?会受到很大的关注:)

1 个答案:

答案 0 :(得分:0)

这是因为您在FROM查询中重复了SELECT条两次,例如from klant from klant。见下文指出

 try (PreparedStatement stmt = conn.prepareStatement(
    "select * from klant from klant where naam = ? and voornaam = ?
                         ^.... HERE