0

使用するデータベースのすべてのメソッドを含むライブラリ(Jarファイル)をJavaで作成したいと思います。そこには約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);
}

独自の永続化クラスを作成することを忘れ、SpringJDBCテンプレートなどの実績のあるソリューションを使用します。

この問題は何度も、多くの方法で解決されてきました。存在するものを改善するために何をしたいですか?この機能の開発、テスト、および保守にかかる追加費用をどのように正当化しますか?

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

}

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.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使用していない場合は、このカスタムライブラリを作成することをお勧めします。Hibernateには、duffymoが前に言ったように実行できる特別なメソッドを追加したい場合を除いて、必要なすべてのメソッドがすでに提供されているためです。カスタムライブラリのこのアイデアは、と構造から来ています。ORMHibernateDAOHibernate

読んでいただきありがとうございます。より整理されたカスタムライブラリを作成したい場合は、Javaのデザインパターンを学んでください。

于 2012-04-30T04:14:01.110 に答える