JavaFX客户端和JDBC服务器:服务器端是否需要JavaFX Bean样式的对象?

时间:2013-08-10 02:15:32

标签: java jdbc javafx-2

我有一个围绕单服务器数据库构建的JDBC应用程序(RDBMS是HSQLDB - 我喜欢到目前为止)。在我的应用程序初稿中,我使用了以下分层方法:

+-------------------------------+ 
|  DATA STORE (appx 20 tables)  |  HSQLDB; highly normalized tables
+-------------------------------+
                |
                v
+-------------------------------+
|  DOMAIN OBJECT LAYER  (1:1)   |  A Java class for each table in DB
+-------------------------------+
                |
                v
+-------------------------------+  Abstraction for the objects that the app
|  CLIENT OBJECT LAYER / DAO's  |  logic actually uses (denormalized)
+-------------------------------+
                |
                V
+-------------------------------+  Adapts ObservableArrayList() instances 
|  PRESENTATION LAYER (JAVAFX)  |  of objects to the GUI
+-------------------------------+

在域对象层中,我目前使用通用静态方法执行所有JDBC查询:

static <E> ObservableList<E> doGenericQuery(SQLParametersList pars,
        String sql, Callback<RowSet,E> factory) {

    // factory is a Function Object. For now I use Callback<P,R> as the
    // "strategy" ... P is a RowSet, R is the object return type. The factory
    // simply invokes the constructor for the desired return object type.


    RowSet jrs = null;
    ObservableList<E> queryList = FXCollections.<E>observableArrayList();

    try {
        jrs = SQLConnection.getRowSetInstance();
        if (jrs == null) {
            System.err.println(Census.MSG_ERR_JDBCFAIL);
            return queryList; }

        jrs.setCommand(sql);

        for(int i=0; i < pars.size(); i++) {

            // datum().col() method returns an enum representing the
            // database column; setJdbcParamByType is an enum 
            // constant-specific method that invokes the correct
            // setXXX method on the PreparedStatement

            pars.datum(i).col().setJdbcParamByType(jrs, pars.datum(i)));
        }

        jrs.execute();

        while (jrs.next()) {
            queryList.add(factory.<RowSet,E>call(jrs));
        }

    } catch (SQLException e) {            
        Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, e);

    } finally {            
        if (jrs != null) try { jrs.close(); } catch (SQLException e) { }
    }

    return queryList; 
}

我想要做的是在我的整个应用程序的数据访问抽象中使用此方法,但我想知道我是否可以。如上所述,此方法返回ObservableList,因为它由JavaFX应用程序使用。 ObservableList包含SimpleXXXProperty对象的实例(JavaFX Bean风格,即可变对象)。我认为我不能使用目前编写的代码,因为我不想将JavaFX Bean风格的对象带到服务器端。

最终,数据访问层将在服务器端环境中执行,而表示层事物将在客户端上发生。

我真的不想使用JavaFX Bean风格的对象来获取服务器端代码。理想情况下,我希望查询形成一个不可变对象的列表,我想我可以完成这个,除了处理JavaFX的必要性,这似乎要求我将所有内容公开和可变。

我现在想到的解决方案是让服务器代码从查询结果中创建不可变对象,这些对象包含在一个unmodifiableList中,然后传递给客户端。然后,客户端必须将只读列表变换为JavaFX Bean样式对象的ObservableList,以便可以在GUI中使用它们。但是......这种方法要求我编写不同版本的域对象层(客户端和服务器)。

我在这里走在正确的轨道上吗? (我讨厌听起来像是在我脑海里,在这里......但我现在可能已经在脑海中了。)

1 个答案:

答案 0 :(得分:0)

当我更多地考虑我想做什么时,我明白我的方法过于简单化了。我认为我真正在谈论的是从数据存储到客户端的信息流,它看起来更接近于此:

+-------------------------------+ 
|  DATA STORE (appx 20 tables)  |  HSQLDB; highly normalized tables
+-------------------------------+
                |
                v
+-------------------------------+  Receives query result
|  SERVER/SERVLET REQ PROCESSOR |  Transmits as CachedRowSet
+-------------------------------+
                |
         (Serialization)
                |
                v
+-------------------------------+
|     CLIENT INTERFACE LAYER    |  Deserializes query results
+-------------------------------+
                |
                v
+-------------------------------+
|  DOMAIN OBJECT LAYER  (1:1)   |  A Java class for each table in DB
+-------------------------------+  Generates data model objects from results
                |
                v
+-------------------------------+  Abstraction for the objects that the app
|  CLIENT OBJECT LAYER / DAO's  |  logic actually uses (denormalized)
+-------------------------------+
                |
                V
+-------------------------------+  Adapts ObservableArrayList() instances 
|  PRESENTATION LAYER (JAVAFX)  |  of objects to the GUI
+-------------------------------+

当然,现在看起来更像是一个已经存在框架的基于互联网的客户端 - 服务器应用程序,例如。 JavaEE的。从简单的单机JDBC数据库应用程序到分布式客户端 - 服务器应用程序似乎涉及复杂性的巨大飞跃。

但是,我不相信我需要在这个过程中的任何地方使用JavaFX Bean风格的对象,除了客户端。