如何使用 PostgreSQL 10.5 table 或视图中的 data/fields 填充 Vaadin 12.0.4 网格?

How do I populate a Vaadin 12.0.4 Grid with data/fields from a PostgreSQL 10.5 table or view?

我知道在很多网站上都有很多教程可以教你如何做到这一点,但这是我第一次尝试将数据库 table 连接到 UI,所以当例如,Spring Boot/MyBatis/Vaadin 的版本与我正在使用的版本不同,或者他们使用 JPA 或 JDBC 而不是 MyBatis,我不知道如何将其更改为根据我的具体情况工作。

当人们说 "it's no different than any other method of doing it with " 根本没有帮助时,因为正如我之前所说,我以前从未这样做过。教程代码示例中的注释和 classes 在每个新版本中都会被删除和弃用,但没有明确解释如何更改它以使用较新版本。我研究了各种 APIs(Spring Boot、Vaadin、MyBatis)大约一个月,对每个人的作用有一个模糊的理解,但不知道他们如何协同工作以达到预期的结果为数据库制作 UI。我只是对教程中的单个弃用注释或 class 如何导致整个事情崩溃感到非常沮丧。我知道这很啰嗦,但我只是想让你们都明白我的意思。我并不特别喜欢任何一个 API,只是最简单的。

我当前的依赖项是:

- Maven : 4.0.0 - Spring Boot: 2.1.2.RELEASE - Vaadin: 12.0.4 - MyBatis Spring Boot Starter: 2.0.0

我从Spring Initializr 得到了启动包,然后添加了MyBatis 依赖。

我有一个带有 17 个 table 的 PostgreSQL 10.5 数据库,它最终将成为 UI 供商店经理使用,例如查看收到的库存货物、员工工作的小时数和其他任务。

我的数据库名为 'store',用户:'store',密码:'store'(如果重要的话)。

例如,这些是我的一些 tables:

CREATE TABLE IF NOT EXISTS supplier ( id SERIAL, brand VARCHAR(30) NOT NULL, phone VARCHAR(15) NOT NULL, address VARCHAR(100) NOT NULL, CONSTRAINT pk_supplier PRIMARY KEY (id) );

CREATE TABLE IF NOT EXISTS shipment ( id SERIAL, shipdate DATE NOT NULL, shiptime TIME NOT NULL, status VARCHAR(10) DEFAULT 'arrived' NOT NULL, sid INT NOT NULL, CONSTRAINT pk_shipment PRIMARY KEY (id), CONSTRAINT fk_shipment_supplier FOREIGN KEY (sid) REFERENCES supplier(id) );

CREATE TABLE IF NOT EXISTS shipmentcontains ( shipid INT NOT NULL, iid INT NOT NULL, quantity INT NOT NULL, price DEC(6,2) NOT NULL, CONSTRAINT pk_shipmentcontains PRIMARY KEY (shipid, iid), CONSTRAINT fk_shipmentcontains_shipment FOREIGN KEY (shipid) REFERENCES shipment(id), CONSTRAINT fk_shipmentcontains_item FOREIGN KEY (iid) REFERENCES item(id) );

CREATE TABLE IF NOT EXISTS item ( id SERIAL, itemtype VARCHAR(25) NOT NULL, itemsize VARCHAR(10) NOT NULL, price DEC(5,2) NOT NULL, sid INT NOT NULL, CONSTRAINT pk_item PRIMARY KEY (id), CONSTRAINT fk_item_supplier FOREIGN KEY (sid) REFERENCES supplier(id) );

CREATE TABLE IF NOT EXISTS employee ( id SERIAL, lastname VARCHAR(40) NOT NULL, firstname VARCHAR(40) NOT NULL, hourlywage DEC(4,2), manager BOOLEAN DEFAULT false NOT NULL, CONSTRAINT pk_employee PRIMARY KEY (id) );

如果有人能给我一个代码示例,说明如何只让其中一个显示在网格中,我相信我能弄清楚如何完成其​​余部分。我的 application.properties 文件中有连接详细信息,但我已经看到,对于较新版本的 MyBatis,这不是必需的,并且可以在 SQL 语句上使用 @Update 等注释取代那个。另外,用简单的英语来说,Spring Bean 到底是什么?我希望那不会太长..或者不够长。

编辑:Vaadin 12 的当前版本是 12.0.4

你问的太多了,所以我会尽量触及所有内容,不要太详细。我希望这可以帮助您开始工作。

首先,您需要一个 java class,其中包含供应商 table 中的所有字段,并用 @Entity 进行注释。 @Table 注解可以让你定义 Db table 名称,如果 table 和 class 一样被调用(不区分大小写)则没有必要:

@Entity                        // javax.persistence
@Table(name = "supplier")      // javax.persistence
public class Supplier {

    @Id                        // javax.persistence
    private Long id;

    private String brand;
    private String phone;
    private String address;

    public Supplier(){

    }

    // public getters and setters for all fields
    // omitted for brevity
}

现在您的 table 有了一个 class,您可以开始为它创建一个 Vaadin 网格。这可以通过 Grid<Supplier> supplierGrid = new Grid<Supplier>(Supplier.class);.

最简单地完成

现在用项目(供应商)填充网格。这是用 supplierGrid.setItems(allSuppliers); 完成的。但是你问 allSuppliers 从哪里来?

可以使用 Repository. Because the repository will be annotated with @Repository, its a spring component that can be automatically generated by spring and can be Injected/Autowired(即在您看来)使用 @Inject/@Autowired.
获取它们 然后,您只需调用 List<Supplier> allSuppliers = supplierRepository.findAll() 即可获得数据库中所有供应商的列表,现在您可以使用上述 supplierGrid.setItems(allSuppliers);

将其放入网格中

任何 class 实例可以被 spring 注入的是 spring-bean,这包括使用 @Component、@ 注释的 classes服务或@Repository。 Spring 不能自动注入像 Supplier 这样的实体,除非你定义这是你的 @Configuration class:

/* Do this only if you want to inject a Supplier somewhere. */
@Bean
public Supplier supplier(){
    /* define here how a default Supplier should look like */
    return new Supplier();
}