创建有组织的Java库

我想用Java创建一个库(Jar文件),它包含我们使用的数据库的所有方法。 那里有大约60种方法,所以我想让它更有条理。 我想调用类似下面提供的示例的方法。

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

在Java中执行此操作的最佳方法是什么?

你可以省去很多麻烦并写一个通用的DAO:

 package persistence; public interface GenericDao { V find(K id); List find(); K save(V value); void update(V value); void delete(V value); } 

我忘了编写自己的持久化类并使用经过validation的解决方案,比如Spring JDBC模板。

这个问题已经解决了很多次,方法很多。 您希望如何改进存在的东西? 您如何certificate开发,测试和维护此function所需的额外费用?

这里有一些用于连接数据库的自定义库的快照:

在此处输入图像描述

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 { 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.javaabstract classorg.ert.sql.impl是用于存储所需的所有实现的package

NotifyChartsSQL.java

 public class NotifyChartsSQL extends SQLQuery { 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 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自定义库的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而不使用HibernateORM ,我建议您是否要创建此自定义库。 因为在Hibernate中已经提供了你需要的所有方法,除了你想要添加一些特殊的方法,你可以像之前说的duffymo那样做。 自定义库的这个想法来自DAOHibernate结构。

感谢您的阅读,如果您想创建一些更有条理的自定义库,请学习Java中的一些设计模式 。