2017-12-19 1 views
-3

Ich habe einen Tabellennamen "Coupon" und ich arbeite mit Java auf Eclipse.SQL-Code: SELECT * FROM Tabelle WHERE Spalte

Ich habe eine Methode getCoupon (lange ID); das gibt mir den Gutschein durch seine ID und ich schrieb es auf diese Weise:

public Coupon getCoupon(long id) { 
     Connection con = ConnectionPool.getInstance().getConnection(); 
     String sql = "SELECT * FROM Coupon WHERE TYPE=?"; 
     Coupon coupon = new Coupon(); 
     try (PreparedStatement pstmt = con.prepareStatement(sql);){ 
      pstmt.setLong(1, id); 
      try (ResultSet rs = pstmt.executeQuery();) { 
       if (rs.next()) { 
        coupon.setId(rs.getLong(1)); 
        coupon.setTitle(rs.getString(2)); 
        coupon.setStartDate(rs.getDate(3)); 
        coupon.setEndDate(rs.getDate(4)); 
        coupon.setAmount(rs.getInt(5)); 
        coupon.setType(CouponType.valueOf(rs.getString(6))); 
        coupon.setMessage(rs.getString(7)); 
        coupon.setPrice(rs.getDouble(8)); 
        coupon.setImage(rs.getString(9)); 
       } else { 
        System.out.println("Coupon ID: " + id + " could not be found\n"); 
       } 
      } 
     } catch (SQLException e) { 
      CouponSystemException ex = new CouponSystemException("Coupon ID: " + id + " could not be retrieved\n", e); 
      System.out.println(ex.getMessage()); 
      System.out.println(e); 
     } 
     ConnectionPool.getInstance().returnConnection(con); 
     return coupon; 
    } 

Ich möchte eine andere Methode machen, dass es mir den Gutschein gibt von seiner Art! Aber die TYPE COLUMN ist nicht in der ersten Spalte und es gibt mir Ausnahmen. Irgendwelche Ratschläge?

+2

erster rat ... formatieren Sie Ihre Frage –

+1

Welche Ausnahme erhalten Sie? Was ist das Problem beim Abrufen der Zeile durch eine andere Spalte? Gib mehr Details an. –

Antwort

0

Sie könnten versuchen, auf die Spalte mit Namen nenn eher als Ordnungsposition:

rs.getLong("type") 

statt:

rs.getLong(1) 

Manchmal Tabellen in einer Art und Weise neu erstellt bekommen, dass die Reihenfolge der Spalten ändert, Auf die Ordinalposition der Spalte kann also nicht zurückgegriffen werden.

Als eine weitere Verteidigung, listet ich immer die Spalten, die ich will, anstatt Codierung;

Dies ist auch effizienter, da Ihr Java-Programm nicht alle Spalten zurückzieht, nur diejenigen, die es benötigt.

+0

Nun, ich habe es versucht. aber es hilft nicht ,, –

+0

OK. Ich würde gerne helfen und du musst mir ein bisschen mehr erzählen, bevor ich kann. Ich denke, dass der Code, den du uns oben zeigst, funktioniert und du etwas Ähnliches machen willst, ist das richtig? Wenn ja, können Sie uns den Code zeigen, der fehlschlägt.Wir brauchen auch die Ausnahme, die Sie bekommen. Es würde auch helfen, die Tabellendefinition (mit Spalten und Datentypen) und die Marke der Datenbank, die Sie verwenden, zu haben. –

0

Erstens: Es sieht so aus, dass Sie Problem im Code haben als

String sql = "SELECT * FROM Coupon WHERE TYPE=?";

folgen denke ich, dass TYPE=? sollte als ID=?

Zweite gelesen werden: Als ich die TYPE Spalte sehen ist Zeichenkette (wegen coupon.setType(CouponType.valueOf(rs.getString(6)));), also müssen Sie pstmt.setLong(1, id); zu pstmt.setString(1, couponType.getValue());

ändern

Drittens: Vermeiden Sie immer SELECT * lieber alle Spalten, die Sie benötigen.

Forth: Versuchen Sie, die beiden Methoden getCouponByID(long id) und getCouponByType(CouponType couponType) zu verallgemeinern, damit die zukünftige Wartung einfacher wird.

Fünftens: Put ConnectionPool.getInstance().returnConnection(con); in finally Klausel, so dass Sie sicher sein, die Verbindung zum Pool zurückzukehren.

Sechstens: Die Verwendung von PreparedStatement hat weniger Leistung, wenn Sie es weniger als oft (d. H. 100 Mal) verwenden, und Sie haben es nur einmal verwendet. Die Verwendung von Statement in diesem Fall hat eine bessere Leistung, aber seien Sie vorsichtig mit SQL Injection, wenn Sie den Benutzertyp String einfügen. In diesem Fall, keine Sorge, es ist ein long Typ.

Verwandte Themen