2012-04-30 3 views
0

Я хочу создать библиотеку (Jar-файл) в Java, которая будет содержать все мои методы для используемой нами базы данных. Есть около 60 методов, поэтому я хотел бы сделать его более организованным. Я хотел бы назвать методы, подобные приведенному ниже.Создание организованной библиотеки Java

db.accounts.add(username, password); or db.accounts().add(username, password); 
db.names.delete(name); or db.names().delete(name); 

Каков наилучший способ сделать это в Java?

+0

Организован как? Я не понимаю вопроса. –

+0

В основном я хочу иметь методы, связанные с управлением учетными записями таким образом, что при вводе db.accounts я получаю методы, связанные с управлением методами. – Arya

+0

Я пытаюсь сделать то же самое в этом посте, но в Java http://stackoverflow.com/questions/10361877/organizing-methods-for-better-accessing-them/10361968#comment13361067_10361968 – Arya

ответ

4

Вы можете сэкономить много хлопот и написать общий DAO:

package persistence; 

public interface GenericDao<K, V> { 
    V find(K id); 
    List<V> find(); 
    K save(V value); 
    void update(V value); 
    void delete(V value); 
} 

Я бы забыть о написании собственных классов сохраняемости и использовать проверенное решение, как шаблон Spring JDBC.

Эта проблема решена много раз, много способов. Что вы надеетесь сделать, чтобы улучшить то, что существует? Как вы будете оправдывать дополнительные расходы на разработку, тестирование и поддержку этой функции?

+0

Я задал тот же вопрос, но был связан с C#, и это было просто реализовать. Я думаю, вы неправильно поняли мой вопрос. Вот ссылка на вопрос C#. Я очень много спрашиваю то же самое, но для Java http://stackoverflow.com/questions/10361877/organizing-methods-for-better-accessing-them/10361968#comment13361067_10361968 – Arya

+0

Нет, я этого не делал. Мой ответ не изменился. – duffymo

1

Вот некоторые снимок моей пользовательской библиотеки для подключения к базе данных:

enter image description here

PostgreConnection.java

public class PostgreConnection { 

private static Connection conn; 

public Connection makeConnection(String url, String db, String username, String password) { 
    if (conn == null) { 
     try { 
      Class.forName(Constants.POSTGRES_DRIVER); 

      conn = DriverManager.getConnection(Constants.POSTGRES_URL + url + "/" + db, username, password); 
     } catch (SQLException | ClassNotFoundException ex) { 
      Logger.getLogger(PostgreConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    return conn; 
} 

}

Constants.java

public class Constants { 

    public static String POSTGRES_URL = "jdbc:postgresql://"; 
    public static String POSTGRES_DRIVER = "org.postgresql.Driver"; 
} 

В org.ert.model вы можете хранить все Model, которые вам нужны, на основе таблиц базы данных.

NotifyCharts.java

public class NotifyCharts { 

private Integer Id; 
private String revName; 
private Date importDate; 
private Integer pages; 
private Boolean status; 

public Integer getId() { 
    return Id; 
} 

public void setId(Integer Id) { 
    this.Id = Id; 
} 

public Date getImportDate() { 
    return importDate; 
} 

public void setImportDate(Date importDate) { 
    this.importDate = importDate; 
} 

public Integer getPages() { 
    return pages; 
} 

public void setPages(Integer pages) { 
    this.pages = pages; 
} 

public String getRevName() { 
    return revName; 
} 

public void setRevName(String revName) { 
    this.revName = revName; 
} 

public Boolean isStatus() { 
    return status; 
} 

public void setStatus(Boolean status) { 
    this.status = status; 
} 
} 

SQLQuery является abstract class для некоторых основного метода, таких как insert, update, delete, etc.

SQLQuery.java

public abstract class SQLQuery<T> { 
    protected void makeStatement(String url, String db, String username, String password) { 
    PostgreConnection connect = new PostgreConnection(); 
    Connection con = connect.makeConnection(url, db, username, password); 

    try { 
     state = (Statement) con.createStatement(); 
    } catch (SQLException ex) { 
     Logger.getLogger(SQLQuery.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public String arrayBuilder(Object[] obj, boolean val) { 
    StringBuilder arr = new StringBuilder(); 

    arr.append("("); 
    for (int i = 0; i < obj.length; i++) { 
     if (i < obj.length - 1) { 
      if (val) { 
       arr.append("'"); 
      } 
      arr.append(obj[i]); 

      if (val) { 
       arr.append("'"); 
      } 

      arr.append(", "); 
     } else { 
      if (val) { 
       arr.append("'"); 
      } 
      arr.append(obj[i]); 
      if (val) { 
       arr.append("'"); 
      } 
     } 
    } 
    arr.append(")"); 

    return arr.toString(); 
} 

public int insertRecord() throws SQLException { 
    StringBuilder query = new StringBuilder(); 

    query.append("INSERT INTO ").append(tableName).append(arrayBuilder(columns, false)).append(" VALUES ").append(arrayBuilder(values, true)); 

    return state.executeUpdate(query.toString()); 
} 

public ResultSet getAll() throws SQLException { 
    StringBuilder query = new StringBuilder(); 

    query.append("SELECT * FROM ").append(tableName); 
    rSet = state.executeQuery(query.toString()); 

    return rSet; 
} 

public abstract void setColsAndVals(T t); 
} 

NotifyChartsSQL.java является реализация abstract class, org.ert.sql.impl является package хранить всю вашу реализацию, что вам нужно.

NotifyChartsSQL.java

public class NotifyChartsSQL extends SQLQuery<NotifyCharts> { 

public NotifyChartsSQL(String url, String db, String username, String password, NotifyCharts notify) { 
    makeStatement(url, db, username, password); 
    setColsAndVals(notify); 
} 

@Override 
public final void setColsAndVals(NotifyCharts notify) { 
    Map<String, Object> objects = new HashMap<>(); 
    String[] columns; 
    Object[] values; 

    if(notify.getId() != null) 
     objects.put("id", notify.getId()); 
    if(notify.getRevName() != null) 
     objects.put("rev_name", notify.getRevName()); 
    if(notify.getImportDate() != null) 
     objects.put("import_date", notify.getImportDate()); 
    if(notify.getPages() != null) 
     objects.put("pages", notify.getPages()); 

    objects.put("status", notify.isStatus()); 

    columns = Arrays.copyOf(objects.keySet().toArray(), objects.size(), String[].class); 
    values = objects.values().toArray(); 

    setColumns(columns); 
    setValues(values); 
    setTableName("notify_charts"); 
} 

} 

И последнее это test пакет, который протестировать пользовательскую библиотеку, чтобы убедиться, что все в порядке.

TestMain.Java

public class TestMain { 

public static void main(String[] args) { 
    NotifyCharts notify = new NotifyCharts(); 
    try { 

     notify.setRevName("Test456"); 
     notify.setImportDate(new Date()); 
     notify.setPages(10); 
     notify.setStatus(false); 

     NotifyChartsSQL notCharts = new NotifyChartsSQL("localhost:5432", "charts", "username", "password", notify); 


     int status = notCharts.insertRecord(); 

     if (status == 1) { 
      System.out.println("Success Insert"); 
     } else { 
      System.out.println("Failed Insert"); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(TestMain.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

Я предлагаю, если вы хотите, чтобы сделать эту пользовательскую библиотеку, если вы используете ручной JDBC и не используя ORM такие как Hibernate. Потому что в Hibernate уже предусмотрены все методы, которые вам нужны, кроме как вы хотите добавить какой-то специальный метод, который вы можете сделать, как сказал ранее duffymo. Эта идея пользовательской библиотеки исходит от DAO и структуры Hibernate.

Спасибо, что прочитали его, и, пожалуйста, узнайте Design Pattern in Java, если вы хотите сделать какую-то специальную библиотеку более организованной.

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