0

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

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

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

4

2 回答 2

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 模板。

这个问题已经解决了很多次,很多方法。你希望做些什么来改进现有的东西?您将如何证明开发、测试和维护此功能的额外费用是合理的?

于 2012-04-30T01:49:36.143 回答
1

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

在此处输入图像描述

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;
}

}

常量.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;
}
}

SQLQueryabstract 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 设计模式。

于 2012-04-30T04:14:01.110 回答