如何使用 PostgreSQL 10.5 表或视图中的数据/字段填充 Vaadin 12.0.4 网格?

Posted

技术标签:

【中文标题】如何使用 PostgreSQL 10.5 表或视图中的数据/字段填充 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? 【发布时间】:2019-06-17 21:58:30 【问题描述】:

我知道在同样多的网站上有很多关于如何做到这一点的教程,但这是我第一次尝试将数据库表连接到 UI,所以当 Spring Boot/MyBatis/Vaadin 的版本,对于例如,与我正在使用的不同,或者他们使用 JPA 或 JDBC 而不是 MyBatis,我不知道如何更改它以适应我的具体情况。

当人们说“这与使用其他任何方法没有什么不同”时,这根本没有帮助,因为正如我之前所说,我以前从未这样做过。教程代码示例中的注释和类在每个新版本中都被删除和弃用,没有明确说明如何更改它以与新版本一起使用。我一直在研究各种 API(Spring Boot、Vaadin、MyBatis)大约一个月,对每个 API 的作用有一个模糊的了解,但不知道它们如何协同工作以实现为数据库制作 UI 的预期结果。我只是对教程中一个不推荐使用的注释或类如何导致整个事情崩溃感到非常沮丧。我知道那是冗长的,但我只是想让你们都明白我来自哪里。我并不特别依赖任何单一的 API,只要是最简单的。

我目前的依赖是:

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

我从 Spring Initializr 得到了 starter 包,后来添加了 MyBatis 依赖。

我有一个 PostgreSQL 10.5 数据库,其中包含 17 个表,最终将成为商店经理的 UI,用于查看收到的库存发货、员工工作时间和其他任务。

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

例如,这些是我的一些表格:

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

【问题讨论】:

我很抱歉这么说,但您的问题与 SO 无关。首先,它非常广泛。问题应该是关于一些具体问题。其次,它没有显示您的研究成果。你需要改进它。一种方法是描述您尝试过的方法以及无效的方法。就像如果您尝试了一些基于旧版本 say vaadin 的示例,那么您可能会先让它工作(在旧版本中),然后搜索并询问是否没有答案已经是特定问题What is a way to implement deprecated feature X of vaadin version Y in newer version Z? 这是一个人们提出编程问题的网站,这是一个编程问题。我确实问了一个具体的问题,它在标题中,最后,你只是没有注意。如果我展示了我尝试过的所有东西但都不起作用,那么长时间没有人会阅读它。我从使用旧版本的教程中尝试过的东西是无关紧要的,因为所需要的只是展示当前有效的方法。我不明白对于一个有足够技能的人来说,举一个我所问的例子有多难。或者你可能已经忘记了新手程序员是什么样的。 是的,它的范围很广,但 IMO 操作显示了研究工作并解释了为什么该研究没有结果。是的,所有信息都可以通过访问正确的网站、博客和教程来收集,但你需要确切地知道你在谷歌上搜索的是什么,而 op 似乎并非如此。我不在乎我是否被否决,但我很高兴发布了答案。希望对你有帮助 @KevinPalembas 我能理解你的沮丧。我的评论意图不是冒犯,而是帮助您改进问题,以便您获得答案。虽然标题相当具体,但有关您尝试过的内容的信息并不是很有帮助。特别是问题是缺少具体不起作用的信息。作为一个例子,你说注释通常被删除/弃用,但没有提到具体的。 我明白了。我学过向量微积分和中级物理学,但没有什么比编程更能让你感到愚蠢了。 【参考方案1】:

你问的太多了,所以我会尝试一点一点,不要太详细。我希望这可以帮助您顺利进行。

首先,您需要一个 java 类,其中包含供应商表中的所有字段,并使用 @Entity 进行注释。 @Table 注解让你可以定义 Db 表名,如果表名与类名相同(不区分大小写),则不需要:

@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

现在您已经为表创建了一个类,您可以开始为它创建一个 Vaadin 网格。这可以通过Grid<Supplier> supplierGrid = new Grid<Supplier>(Supplier.class); 最简单地完成。

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

可以使用Repository 获取它们。因为存储库将使用@Repository 进行注释,所以它是一个spring 组件,可以由spring自动生成,并且可以使用@Inject/@Autowired 为Injected/Autowired(即在您看来)。 然后,您只需调用List<Supplier> allSuppliers = supplierRepository.findAll(),您就会获得数据库中所有供应商的列表,您现在可以使用上述supplierGrid.setItems(allSuppliers); 将其放入网格中

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

/* 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();

【讨论】:

感谢您的示例和解释。这正是我想要的。我会在供应商表上试试这个,看看我是否有任何问题。我预见到的唯一错误是@Entity 注释。每当我在 IntelliJ 之前使用它时将它涂成红色并说Cannot resolve symbol 'Entity'..当我把它放在我的 StoreuiApplication 类中时它又做了一次,它用@SpringBootApplication 注释。 MainView 应该在该类中还是它自己的类中,顺便说一句? 我忽略了很多这样的小事,因为你的问题太宽泛了。对于像Cannot resolve symbol 'Entity' 这样的详细问题,我认为您现在拥有比以前更多的信息,并且应该能够自己搜索解决方案(我也不知道,可能缺少依赖项)。不,让 MainView 成为一个独立的类。我更像是一个 Vaadin 人,而不是 Spring 小伙子,恐怕我在这方面不是很了解。我已经把所有这些关于春天的解释都抛到了我的舒适区之外 我真的很感激。我计划最终让经理最终用户可以从组合框中选择一个月,它会显示商店在该月收到的所有发货,可能由供应商过滤(按日期,而不是 ID)。然后他们可以点击一个货件,它会显示该货件中的所有内容。这只是少数几个......呃观点之一,我猜你会这么称呼它?这将构成 UI。所以你提到的存储库是 Vaadin 认为的 DataProvider 吗?我只是对数据如何从数据库实际获取到网格感到困惑。 No vaadin dataprovider 不是那种类型,并且在较旧的 vaadin 版本中使用得更多。您仍然可以为网格设置数据提供者而不是grid.setItems(),并且在使用数据提供者时可以进行更多配置/过滤。现在只需使用setItems(),直到您的网格完成并正常工作。正如我所提到的,数据是通过@Repository 从数据库中获取的。该存储库(或@Service 又注入了存储库)可以注入到您的视图中。通过它,您可以从数据库中加载您的实体,然后将其放入网格中 在我与 Alejandro 进行视频聊天期间,他告诉我 @Entity 标签表示用于连接数据库表(也称为业务对象,您可能会在某些网站上看到它)的 JPA 方法。如果你想使用 MyBatis 来代替,就像我最初打算的那样,可以在here 找到一个如何使用 PostgreSQL 数据库中的 Company 表执行此操作的示例。如果你想键入它而不是复制和粘贴,你至少应该确保你与 Git 项目中的 pom.xml 具有所有相同的依赖项。

以上是关于如何使用 PostgreSQL 10.5 表或视图中的数据/字段填充 Vaadin 12.0.4 网格?的主要内容,如果未能解决你的问题,请参考以下文章

列出 PostgreSQL 中物化视图的授权和权限

RedHat 7 安装PostgreSQL 10.5

如何使用 eloquent 在 laravel 迁移中删除 POSTGRES 表或视图?

如何在不使用临时表或视图的情况下在多个列上使用 PIVOT [重复]

Django trigram_similar搜索没有返回结果(带有Postgresql 10.5后端的Django 2.1)

如何允许用户查看表或视图的子集