2013-11-14 6 views
-1

Я пытаюсь реализовать отношение FK от MySQL в JAVA с помощью JDBC. У меня есть список Garaz объектов, и у каждого Garaz есть список объектов Auto (cars). У меня очень смешанные данные.Внедрение JDBC MYSQL FK

Мой MySQl DB это нормально, и я пытаюсь сделать это следующим образом:

public static ArrayList <Garaz> selectRecords() throws SQLException { 
    Connection dbConnection = null; 
    Statement statement = null; 

    String selectTableSQL = "SELECT Garaz.G_ID, Garaz.Nazwa, Garaz.Adres, Garaz.LiczbaMiejsc, Garaz.LiczbaPoziomow, " + 
     "Garaz.Czynny, Auta.A_Id, Auta.Model, Auta.Kolor, Auta.IloscDrzwi, Auta.Rejestracja\n" + 
     "FROM Garaz\n" + 
     "LEFT JOIN Auta\n" + 
     "ON Garaz.G_Id=Auta.G_Id\n" + 
     "ORDER BY Garaz.G_Id; "; 

    // ArrayList lista = new ArrayList <Garaz>(); 

    try { 
     dbConnection = getDBConnection(); 
     statement = dbConnection.createStatement(); 

     System.out.println(selectTableSQL); 

     // execute select SQL stetement 
     ResultSet rs = statement.executeQuery(selectTableSQL); 

     while (rs.next()) { 
      int g_id = rs.getInt("G_ID"); 
      String nazwa = rs.getString("NAZWA"); 
      String adres = rs.getString("ADRES"); 
      int lmiejsc = rs.getInt("LICZBAMIEJSC"); 
      int lpoz = rs.getInt("LICZBAPOZIOMOW"); 
      boolean czynny = rs.getBoolean("CZYNNY"); 

      ArrayList lista2 = new ArrayList <Auto>(); 

      int a_id = rs.getInt("A_Id"); 
      String model = rs.getString("Model"); 
      String kolor = rs.getString("Kolor"); 
      int ildrzwi = rs.getInt("IloscDrzwi"); 
      String rejestracja = rs.getString("Rejestracja"); 

      Auto d = new Auto(a_id, model, kolor, ildrzwi, rejestracja); 
      if (a_id !=0){ 
       lista2.add(d); 
      } 
      Garaz f = new Garaz(g_id, nazwa, lista2, adres, lmiejsc, lpoz, czynny); 
      lista.add(f); 

      //System.out.println("nazwa : " + nazwa); 
      //System.out.println("adres : " + adres); 
      // return lista; 
     } 

    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } finally { 
     if (statement != null) { 
      statement.close(); 
     } 
     if (dbConnection != null) { 
      dbConnection.close(); 
     } 
    } 
    return lista; 
} 

Я не понимаю, как читать из ResultSet rs в том, что: ArrayList Garaz содержит объекты (Garaz) и каждый Garaz объект содержит ArrayList Auto. Поэтому у меня есть большая проблема с созданием 2 списков (один из них является частью другого), считывая данные с rs (ResultSet). У меня есть все Garaz и все Auto из таблиц DB, но отношение смешано. Мне нравится Garaz1 содержит случайные Auto (cars).

Как создать 2 списка (один является частью другого), чтобы сохранить отношение Auto является частью Garaz на основе G_ID?

ответ

0

Вы должны перебрать результата, проверьте, если вы уже создали Garaz объект для G_ID ряда, и либо использовать его или создать новый. Это можно упростить путем сортировки по полю G_ID и просто создать новый объект Garaz при изменении G_ID.

Как вы прокомментируете, что вы не знаете, как это сделать, вот полный пример:

public List<Garaz> getAllGaraz() throws SQLException { 
    List<Garaz> garazList = new ArrayList<Garaz>(); 
    try (
     Connection con = getDBConnection(); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery(
      "SELECT Garaz.G_ID, /* other garaz columns */ " + 
        "Auta.A_Id /*other auta columns */\n" + 
      "FROM Garaz\n" + 
      "LEFT JOIN Auta\n" + 
      "ON Garaz.G_Id=Auta.G_Id\n" + 
      "ORDER BY Garaz.G_Id"); 
    ) { 
     Garaz currentGaraz = null; 
     while (rs.next()) { 
      int garazId = rs.getInt("G_ID"); 
      // Create Garaz only if it is different 
      if (currentGaraz == null || currentGaraz.getId() != garazId) { 
       // retrieve other columns 
       currentGaraz = new Garaz(g_id /* + other garaz columns */); 
       garazList.add(currentGaraz); 
      } 

      int a_id = rs.getInt("A_Id"); 
      // replacement of your condition of a_id != 0 
      // 0 could be a valid value, check for null instead 
      if (!rs.wasNull()) { 
       // retrieve other columns 
       Auto auta = new Auta(a_id /* + other auta columns */); 
       // The list of Auta is part of the garaz 
       currentGaraz.addAuta(auta); 
      } 
     } 
     return garazList; 
    } 
} 

public class Garaz { 
    private final List<Auta> autaList = new ArrayList<Auta>(); 
    private final int id; 

    public Garaz(int g_id /* + other fields*/) { 
     id = g_id; 
    } 

    public int getId() { 
     return id; 
    } 

    public void addAuta(Auta auta) { 
     autaList.add(auta); 
    } 

    public List<Auta> getAutaList() { 
     return new ArrayList<Auta>(autaList); 
    } 
} 
+0

Хорошо. это звучит как план :) Thnx за то, что помог мне, я попробую это сделать. – user2982527

+0

Как насчет некоторых советов о создании объектов ArrayList для Auto, это часть объекта Garaz. Я знаю, к какому авто (автомобилю) относится Garaz на основе G_id в таблице Auta. – user2982527

+0

Сделайте эту часть 'List' объекта Garaz' и просто добавьте автомобили, которые вы создаете из' ResultSet' (или что-то в этом роде, решение зависит о том, как вы хотите использовать результат). Я не хочу быть грубым, но я бы сказал, что возможность думать об этих решениях является частью основных навыков решения проблем, которые вам нужны в качестве разработчика. –

1

ваш результирующий набор предоставит один результат (aka line) для каждого Garaz и Auto, так как это делает оператор select. Таким образом, вы можете ...

либо проанализировать набор результатов, сколько он есть, и вручную создать каждый Garaz & Автозапись, которую вы хотите, но вам придется иметь дело с дублирующими данными Гараза.

ИЛИ

Вы можете использовать рамки как MyBatis, чтобы получить получить объекты обратно, или.

ИЛИ

Выполните ЗЕЬЕСТ для списка Гараза, а затем выполнить еще ЗЕЬЕСТ, чтобы получить список задней AUTO для каждого Гараза.


Sudo code..... 


@Repository 
public class StoreDbDAO 
{ 
    @Autowired 
    public void init(@Qualifier("dataSourceCDB") DataSource dataSource) { 
     this.dataSource = dataSource; 
     this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 
    } 

    private static final String GET_USABLE_RECORDS = "SELECT d.ID, d.HARDWARE_ID " + 
      " FROM DEVICE d " + 
      " LEFT JOIN TABLEB o on o.X_ID = d.X_ID " + 
      " WHERE " + 
      " d.DEVC_HARDWARE_ID IS NOT NULL " + 
      " AND o.CODE = ? ""; 


    public List<Map<String, Object>> getStores(String cCode) 
    { 
     return simpleJdbcTemplate.queryForList(GET_USABLE_RECORDS, code); 
    } 
} 

@Autowired StoreDbDAO storeDbDAO;

public void caller() { Список> магазины = storeDbDAO.getStores();

List<Stores> storeRecords = new ArrayList[stores.size()]; 
for (Map<String, Object> store: stores) 
{ 

    final String storeId = (String) store.get("HARDWARE_ID"); 
    StoreRecord x = new StoreRecord(storeId) 
    storeRecords.add(x); 


    List<Map<String, Object>> devicesInTheStore = storeDbDAO.getDevicesForStore(storeId); 
    // convert these into something useful. 
    x.setDevicesInStore(convertToList(devicesInTheStore)); 
} 

}

+0

Ok, так: 1. Не могли бы вы показать мне, как создать 2 ArrayLists (одна является частью другой на основе G_ID) из этого rs (ResaultSet)? У меня БОЛЬШАЯ проблема с этим, мои данные MIXED – user2982527

+0

2. Я хочу, чтобы это было просто на данный момент, я не знаю много о fw 3.Я попытался, но: По умолчанию только один объект ResultSet для объекта Statement может быть открыт одновременно, поэтому он тоже не работал. – user2982527

+0

добавил пример sudo. –