创建一个有组织的Java库(Creating an organized Java library)

2019-07-29 05:17发布

我想在Java中创建一个库(JAR文件),其中将包括我对我们使用的数据库中的所有方法。 里面还有约60个方法,所以我想使它更有条理。 我想打电话给像下面提供的示例的方法。

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

什么是Java这样做的最佳方式?

Answer 1:

你可以为自己省下不少麻烦,并编写一个通用的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模板。

这个问题已经解决了很多次,很多方面。 你希望做的改进都存在多少? 您将如何自圆其说开发,测试和维护该功能的额外费用?



Answer 2:

在这里我为连接到数据库自定义库中的一些快照:

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 classorg.ert.sql.implpackage来存储所有您的实现你需要的。

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一些特殊的方法之前说的方法。 自定义库的这一想法来自于DAOHibernate结构。

感谢您的阅读,而且请了解一些在Java的设计模式 ,如果你想使更多的组织一些自定义库。



文章来源: Creating an organized Java library
标签: java class jar