当前位置: 首页 > 面试题库 >

在没有中间类的情况下将数据插入JavaFX TableView

黄啸
2023-03-14
问题内容

我是Java新手。我想将ResultSet数据插入JavaFX
TableView,但我不会使用中间类。我可以将ResultSet行插入到TableView行中作为对象吗?

这是我使用中间类单元的代码

 public static ObservableList<Unit> getUnits() {

    final ObservableList<Unit> data = FXCollections.observableArrayList();
    if (openConnection()) {
        try {
            rs = st.executeQuery("SELECT * FROM units");
            while (rs.next()) {

                data.add(new Unit(rs.getString("id_unit"),
                        rs.getString("short_name"),
                        rs.getString("name")));
            }
        } catch (Exception ex) {
            Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    closeConnection();
    return data;
}

控制者

idUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("idUnit"));
shortNameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("shortName"));
nameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("name"));

unitsTableView.setItems(SQLConnect.getUnits());

问题答案:

您需要一些东西来保存数据。某些东西(您称为“中间类”)将成为您的的数据类型TableView

它不必一定是您创建的类,但是如果您仅使用一般性的东西,那么您的代码将很难理解。例如,您可以只使用a List<String>来保存每一行:

TableView<List<String>> unitsTableView = new TableView<>();
idUnit = new TableColumn<List<String>, String>("Id");
idUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) {
        return new ReadOnlyStringWrapper(data.getValue().get(0)) ;
    }
});
shortNameUnit = new TableColumn<List<String>, String>("Short Name");
shortNameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) {
        return new ReadOnlyStringWrapper(data.getValue().get(1)) ;
    }
});
nameUnit = new TableColumn<List<String>, String>("Name");
nameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) {
        return new ReadOnlyStringWrapper(data.getValue().get(2)) ;
    }
});

然后

public static ObservableList<List<String>> getUnits() {

    final ObservableList<List<String>> data = FXCollections.observableArrayList();
    if (openConnection()) {
        try {
            rs = st.executeQuery("SELECT * FROM units");
            while (rs.next()) {
                List<String> unit = new ArrayList<>();
                unit.add(rs.getString("id_unit"));
                unit.add(rs.getString("short_name"));
                unit.add(rs.getString("name"));
                data.add(unit);
            }
        } catch (Exception ex) {
            Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    closeConnection();
    return data;
}

但是现在您的代码几乎完全没有您要表示的数据的语义。

请注意ResultSet,由于多种原因,您不能直接使用。一种是TableView中的数据由随机访问列表表示。尽管您可以将其ResultSet视为代表数据行的列表,但它没有实现List接口,并且没有任何随机访问功能(无法保证获得第5行等)。另一个原因是ResultSet需要(或至少可能需要,取决于JDBC驱动程序的实现)活动数据库资源。因此,您将有可能在TableView处于作用域的整个时间内锁定数据库表。

为什么要避免创建数据表示形式类?



 类似资料:
  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。 这是我代码的一部分(当我使用PowerMock时) 在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个: 经过一些研究,我找不到任何与监视一个具有私有构造

  • 问题内容: 我正在尝试将新记录插入到我之前知道是唯一的表中。我试过在对象上调用save(),但是这样做在执行任何INSERT之前会执行一堆SELECT语句,我不想​​这样做,因为我知道对象已经是唯一的。 我为每个交易都打开了一个新会话,可以看到这是一个问题,但这是我的工作范围的限制。有什么办法可以强迫Hibernate在插入之前不做任何选择? 问题答案: 您可以使用persist()方法而不是sa

  • 问题内容: 我想将一堆pandas数据框(大约一百万行和50列)索引到Elasticsearch中。 当寻找有关如何执行此操作的示例时,大多数人会使用elasticsearch-py的bulk helper方法 ,并向其传递处理连接的Elasticsearch类的实例以及使用pandas的dataframe创建的字典列表。orient =’records’)方法 。可以预先将元数据作为新列插入数据

  • -和有什么区别?什么时候使用更好? 我想每个Java开发人员至少在面试中听过一次这个问题。 -如果您希望能够在列表中间插入项目,则首选链表。 从这里 忘了提到插入费用。在LinkedList中,一旦有了正确的位置,插入将花费,而在ArrayList中,插入将上升到-所有超过插入点的元素都必须移动。 从这里 还有更多... 但你有没有尝试过自己复制它?我昨天试了一下,得到了这些结果: 产出: 哦,A

  • 我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。 这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。 我想切换到“常规”注入成员,使用注释单独标识,就像其他(哑)类一样。 这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例

  • 我的要求就像,我有一个json文件数据如下。,{Key1: value e1, key2: value 2,......}带有文件名example.json 应将其插入sql server,取名称:示例数据如下,Id key1 key2 1 value 1 value 2 我正在寻找一种解决方案,这样就不会有任何Java层的复杂性,比如首先将这些数据转换为JavaBean,然后使用Java数据库驱