2017-01-25 5 views
0

Ich habe eine Tabelle in SQLYog, wo eine Spalte Varchar Limit bis 200 Länge ist. Ich schrieb die folgende Methode für die Einfügung, aber beim Testen des Codes ist die Spalte "Name" nicht durch die Daten in der DB gefüllt.Spring einfügen mit JDBC

@Override 
public void insert(final List<InfoRow> rows) { 
    String sql = "INSERT INTO info_table (ID, NAME, AGE) VALUES (?, SUBSTRING(?, 0, 200), ?)"; 

    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { 

     @Override 
     public void setValues(PreparedStatement ps, int i) 
       throws SQLException { 
      InfoRow row= rows.get(i); 
      ps.setInt(1, (int) row.getId()); 
      ps.setString(2, row.getName()); 
      ps.setInt(3,(int) row.getAge()); 
     } 

     @Override 
     public int getBatchSize() { 
      return rows.size(); 
     } 
    }); 

} 

Was ist der korrekte Weg, um die 'Name'-Größe beim Einfügen zu validieren?

Danke!

Antwort

0

Substring Ausdrücke in MySQL (dies ist eine Schätzung basierend auf dem SQL Tag) sind 1 basiert, nicht 0 basiert. Versuchen Sie stattdessen:

SUBSTRING(?, 1, 200) 

Im Allgemeinen würde ich Validierungslogik hält aus der Datenbank-Ebene, und behandelt „schlechten Eingang“ in der Anwendungsschicht. Dies ermöglicht es mir, die Tatsache zu protokollieren, dass Daten gelöscht werden.

Aber dieser Ansatz ist in Ordnung.

+0

Vielen Dank. funktioniert! – userit1985

0

Die korrekte Methode zum Validieren von Eingaben befindet sich in Ihrer Serviceebene, nicht in Ihrer Modellschicht, wie Sie hier beschreiben. Die DAO sollte nur dafür verantwortlich sein, dass persistente Daten nicht validiert werden.

Sie sollten einen Service haben, der die insert(List<InfoRow>); Methode aufruft, und dort muss Ihre Bestätigung sein.

Verwandte Themen