2016-06-12 5 views
0

Я пытаюсь создать приложение в MVC, которое также имеет базу данных. У меня есть несколько моделей, из которых я передаю данные из своих классов моделей. По мере продолжения хода применения, похоже, у него много дубликатов. В каждой функции в моих моделях мне нужно открыть соединение, инструкцию и результат, построить запрос и т. Д. И получить данные с помощью инструкции result.next();.Создание абстрактной модели для извлечения данных

Чтобы избавиться от этих дубликатов, я начал с абстрактного класса AbstractModel. Моя цель - распространить все модели на этот класс и передать запрос. Трудная часть для меня - это то, где мне нужно получить данные в цикле result.next().

Я думал, что смогу передать результирующий набор обратно к моей модели, но потом я больше не могу закрыть свои ресурсы.

Один из моих классов моделей.

public class BezoekerModel 
{ 

    public Gebruiker getGebruiker(String username, String password) 
    { 
     Gebruiker user = null; 

     PreparedStatement stat = null; 
     ResultSet result = null; 
     Connection conn = null; 

     try 
     { 
      conn = SimpleDataSourceV2.getConnection(); 
      String query = "SELECT * FROM gebruiker WHERE gebruikersnaam = ? AND wachtwoord = ?;"; 
      stat = conn.prepareStatement(query); 
      stat.setString(1, username); 
      stat.setString(2, password); 
      result = stat.executeQuery(); 

      while (result.next()) 
      { 
       String gebruikerstype = result.getString("gebruikerstype"); 
       String voornaam = result.getString("voornaam"); 
       String tussenvoegsel = result.getString("tussenvoegsel"); 
       String achternaam = result.getString("achternaam"); 
       int schoolcode = result.getInt("schoolcode"); 

       user = new Gebruiker(voornaam, tussenvoegsel, achternaam, gebruikerstype, schoolcode); 
      } 
     } 
     catch (SQLException ex) 
     { 
      ex.printStackTrace(); 
     } finally 
     { 
      try 
      { 
       result.close(); 
       stat.close(); 
       conn.close(); 
      } 
      catch (SQLException ex) 
      { 
       System.out.println("Error: " + ex.toString()); 
      } 
     } 
     return user; 
     } 
    } 

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

Это абстрактная модель, которую я сейчас создаю.

public class AbstractModel 
{ 

public List<Object> getData(String query) { 
    List<Object> data = new ArrayList(); 


    Statement stat = null; 
    ResultSet result = null; 
    Connection conn = null; 

    try { 
     conn = SimpleDataSourceV2.getConnection(); 
     stat = conn.createStatement(); 
     result = stat.executeQuery(query); 

     while (result.next()) { 
      // ????? 
     } 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      result.close(); 
      stat.close(); 
      conn.close(); 
     } catch (SQLException ex) { 
      System.out.println("Error: " + ex.toString()); 
     } 
    } 
    return data; 
} 

Как я сказал ранее, я хочу передать запрос, который будет создан в bezoekerModel к AbstractModel. Я понятия не имею, возможно ли это. Было бы очень полезно, если кто-либо из вас предоставит вам информацию, поэтому мне больше не нужно тратить время.

+1

Почему вы не используете библиотеку? JdbcTemplate от Spring? –

+0

Вы имели в виду 'public abstract class AbstractModel'? и 'public class BezoekerModel расширяет AbstractModel'? – Buildersrejected

+0

@Buildersrejected Да, но те, которые я показал, были доставлены так далеко. Это было просто показать, какова была моя цель. Эти 2 класса не связаны сейчас. – Necati

ответ

0

Если AbstractModel является родительским, а BezoekerModel является дочерним элементом AbstractModel, вы можете создать метод в родительском классе AbstractModel, который обрабатывает ваш запрос и передает результат обратно в дочерний класс.

public abstract class AbstractModel { 

    //current arraylist code 
    PreparedStatement stat; 
    ResultSet result; 
    Connection conn; 
    protected ResultSet processQuery(String query,String username, String password) { 

    try { 
      conn = SimpleDataSourceV2.getConnection(); 
      String _query = query; 
      stat = conn.prepareStatement(query); 
      stat.setString(1, username); 
      stat.setString(2, password); 
    return result = stat.executeQuery(); 
    } 
    } catch (SQLException ex) { 
     //..... 
} 
} 

Это должно обрабатывать запрос. Теперь ваш BezoekerModel будет говорить вместо этого:

public class BezoekerModel { 
public Gebruiker getGebruiker(String username, String password) { 
Gebruiker user = null; 
ResultSet result = processQuery("SELECT * FROM gebruiker WHERE gebruikersnaam = ? AND wachtwoord = ?;",username,password); 
    while (result.next()) { 
    String gebruikerstype = result.getString("gebruikerstype"); 
    String voornaam = result.getString("voornaam"); 
    String tussenvoegsel = result.getString("tussenvoegsel"); 
    String achternaam = result.getString("achternaam"); 
    int schoolcode = result.getInt("schoolcode"); 
    user = new Gebruiker(voornaam, tussenvoegsel, achternaam, gebruikerstype, schoolcode); 
    } 
} catch (SQLException ex) { 
    ex.printStackTrace(); 
} finally { 
    if (result != null || stat != null || conn != null) { 
      try { 
      result.close(); 
      stat.close(); 
      conn.close(); 
      } 
} catch (SQLException ex) { 
     System.out.println("Error: " + ex.toString()); 
} 
     } //end of if 
} return user; } } 

Это намного чище и должны решить любые проблемы системных ресурсов, вы можете иметь.

+0

Это та самая мысль, что у меня была до этого, но я понятия не имел, как вернуть набор результатов и т. Д. Но когда вы вернете набор результатов, conn и подготовленноеStatement заставят систему засорить системные ресурсы? – Necati

+0

Я так не думаю, что BezoekerModel владеет всеми методами, которые вы вызываете, теоретически вы просто вызываете второй метод из того же класса. Если вас беспокоят системные ресурсы, вы можете сделать соединение, запрос и набор результатов как классовые, а не vars.Фактически, я обновлю свой ответ с помощью этого метода. – Buildersrejected

Смежные вопросы