Pobieranie danych z MySQL

Witam Wszystkich!

Na początku chciałem powiedzieć, że dopiero zaczynam przygodę z Vaadinem i Javą. Pracowałem już w innych językach, takich jak C++, PHP, Python, Bash.

Mam problem z połączeniem się z bazą danych w MySQL.
To mój kod:

package com.example.database;

import javax.servlet.annotation.WebServlet;

import java.sql.SQLException;

import com.vaadin.data.util.sqlcontainer.SQLContainer;
import com.vaadin.data.util.sqlcontainer.connection.SimpleJDBCConnectionPool;
import com.vaadin.data.util.sqlcontainer.query.TableQuery;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
@Theme("database")


public class DatabaseUI extends UI {

    private SQLContainer person= null;
    private SQLContainer medicine= null;
    SimpleJDBCConnectionPool connectionPool;  
    
    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = DatabaseUI.class, widgetset = "com.example.database.widgetset.DatabaseWidgetset")
    public static class Servlet extends VaadinServlet {
    }
    
    private void initcontainer(){
        TableQuery q1 = new TableQuery("persont",connectionPool);
        try {
            person= new SQLContainer(q1);
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        TableQuery q2 = new TableQuery("Medicine",connectionPool);
        try {
            medicine = new SQLContainer(q2);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    

    @Override
    protected void init(VaadinRequest request) {
        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        setContent(layout);
                
        try {
            connectionPool = new SimpleJDBCConnectionPool(
                     "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:port/das",
                     "user", "password", 2, 2);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Button button = new Button("Click Me");
        button.addClickListener(new Button.ClickListener() {
            public void buttonClick(ClickEvent event) {
                layout.addComponent(new Label("Thank you for clicking"));
            }
        });
        layout.addComponent(button);
        initcontainer();
        

    }

}

Kompiluje się w porządku, ale wyrzuca błąd na witrynie:

HTTP Status 500 - com.vaadin.server.ServiceException: java.lang.RuntimeException: Specified JDBC Driver: com.mysql.jdbc.Driver - initialization failed. Kompletnie mi to nic nie mówi, szukałem rozwiązania na różnych stronach, lecz bez skutku.

Pozdrawiam,
Sylwester

Masz problem z driverem od Mysql. Byc może w twoim classpath nie ma tej bibloteki. Nie wiem czego używasz do budowania aplikacji, bo jesli IDE to moze tutaj jest problem.

Generalnie, aby ci oszczedzic bólu to powiem, że zabierasz sie od złej strony - bardzo niskopoziomowo. Moja rekomendacja, użyj
gradle
jako narzedzia do budowania,
jpacontainer
i
jpa
do odczytu danych

Wczoraj byl nighthacking jak napisac aplikacje dobierającą sie do danych, poniżej link do źródeł:


https://github.com/jojule/rating

Dzięki za szybką odpowiedź! (Nie)stety jestem zmuszony do używania Vaadina i jego bibliotek.
A co do pierwszego problemu to już sobie poradziłem! Dodałem do:
Project > Properties > Libraries > Add JARs…
Bibliotekę
mysql-connector-java-5.0.8-bin.jar
i wrzuciłem ją jeszcze do katalogu “WebContent > WEB-INF > lib”

Tylko teraz może ktoś by mi pomógł wyciągnąć dane np. w tabelę albo po prostu w jakiegoś labela?

PS: Wiem, że wygląda to jakbym się Wami wyręczał, ale Wasze wskazówki będą bardzo pomocne, zwłaszcza, że studiuję na tyle ile pozwala czas “Book of Vaadin”.

Użyj JPAContainer. To najprostszy sposób w Javie. Tutaj opis:
https://vaadin.com/download/jpacontainer-tutorial/

Jeśli jednak upierasz sie na czysty sql to masz SQLContainer:

Dziękować! Obczaję w poniedziałek!

Pozdrawiam!

Czy byłbyś w stanie znaleźć chwilę i sklecić mi jakieś najprostszy example/tutorial używając JPAContainer i SQLContainer?
Nie jestem w stanie sam tego zmusić do działania. Zawsze jest jakiś błąd.

SQLContainer to chyba przestarzała sprawa, prawda? Do tego wyczytałem na Vaadin Directory, że jest obsługiwany tylko w Vaadinie do wersji 6.

JPAContainer:
https://github.com/vaadin/jpacontainer/tree/master/jpacontainer-addressbook-demo

SQLContainer:
https://github.com/javadev/vaadin-sqlcontainer-demo

Dzięki, widziałem te przykłady jednak nie są tak proste dla osoby niezaznajomionej z Javą. Zauważyłem, że posty w Internecie odnośnie SQLContainer były publikowane dosyć dawno, więc nie mam pewności, czy to jest dobry (aktualny) sposób na pobieranie danych.

Zastanawia mnie, czy nie ma wbudowanego mechanizmu podobnego do PHP. Mam tu na myśli proste funkcje tj.
mysql_connect, mysql_fetch_array
.

Myśle, że najpierw powinieneś opanować podstawy. Vaadin nie ma nic wspolnego z PHP, nie znajdziesz tu rozwiązań podobnych lub zbieżnych z tym co spotkałes wcześniej. W Javie bardzo rzadko dobieramy się do danych poprzez interfejs drivera. Nie ma to kompletnie sensu, bo aplikacje dzialaja w inny sposob. To nie sąskrypty odpalane przy każdym żądaniu do serwera. Aplikacja oparta na Vaadinie pracuje cały czas, trzyma dane w pamięci więc opłaca się cachować i optymalizować dostęp.
Standardem dostępu do bazy w Javie jest JPA 2.x. JPA pracuje ponad driverem i jest klasycznym ORM (coś jak ActuveRecord w Rubym). Istnieje kilka implementacji JPA. Vaadin najlepiej moim zdaniem dziala z EclipseLink.
tutaj masz kasiążke na temat JPA
. Opanowanie JPA jest podstawą bez której będziesz się tylko dalej
męczył
.
JPAContainer wspólpracuje idealnie z Vaadinem. Ma swoje wade, które ujawniają sie w momencie jak wzrasta ruch i potrzeba skalować aplikacje. Jednak na sam początek jest idealny. Opanuj JPA, JPAContainer i przeczytaj ksiązke o Book of Vaadin, szcególnie rozdziały o Containerach, Tabeli i JPAContainer.

Wszytskiego lub prawie wszytskiego co nauczyłes się w PHP, mozesz w tym momencie wywalic na smietnik. Nic tu sie nie przyada. Java rządzi sie innymi prawami. Vaadin ma za zadania odseparowac na tyle ile sie da, klepanie UI w HTML od programisty, dlatego narzuca wlasnym model niekompatybilny z tym co umiales w PHP. Jak chesz być w środowisku bardziej podobym do PHP to są lepsze rozwiązania: GRAILS, Play Framework.

Milej nauki,

Dziękuję, rzeczywiście porwałem się z motyką na księżyc.

Pozdrawiam serdecznie!

Ja się od JPAContainer trzymam z daleka ponieważ jest do komercyjnych zastosowań płatny. Wolę nauczyć się obchodzić bez tego, a jest to jak najbardziej możliwe i nie uciążliwe. Zwykłe JPA wystarczy.

JPAContainer jest bezplatny juz od jakiegos czasu.

Dobrze wiedzieć. W sieci za dużo jest o Vaadinie starych informacji, nie po raz pierwszy się na to natknąłem.

To jak to jest ogólnie z tymi dodatkami: JPA container i Vaadin Charts?
Chyba dore informacje znalazłem: “Vaadin JPAContainer is available under two licenses: Affero General Public License (AGPL) and Commercial Vaadin Add-on License (CVAL). If your project is compatible with the open-source AGPL, you can use the add-on for free.”

Ale co dokladnie oznacza dla mnie:
​"If your project is compatible with the open-source AGPL"
bo nie znalazłem informacji konkretnych czy napisana przeze mnie komercyjna aplikacja jest zgodna z AGPL. Przyjąłem, że nie, a mówisz że nie ma obecnie z tym problemu. Mógłbyś się ustosunkować do tego, bo to dość istotna sprawa.

Official JPA Container Addon:
https://vaadin.com/directory#addon/vaadin-jpacontainer:vaadin

Natomiast co do CVAL addons, czyli np. Charts. Są one dostępne w dwóch licencjach.
AGPL - dla projektów z dostępnym kodem źródłowym - bezpłatnie
CVAL - dla komercyjnych przy wyłączeniu, że licencje musi posiadać developer, który realnie pracuje nad tym kodem.
Więc jeśli wydelegujesz 1 osobę do pisania Chartsów to tylko ona musi mieć licencje.

Witajcie, to mój pierwszy tutaj post.
Nie umiem takich niuansów wypowiedzieć po angielsku

Jak JPAContainer się ma do kanonicznego (w projektach typu korporacyjnego przynajmniej) modelu czterowarstwowym
UI-apliakcja(biznes)-perzystencja(domain)-system?
Jeśli zacznę budować z DAO, to JPAContainer nie znajdzie zastosowania?

Nie jestem religijnym zwolennikiem takiego modelu, mam świadomość że np tzw Controler (z modelu MVC) się często lokuje w kodzie warstwy wizualnej, i to jest akceptowalne, tylko tzreba się na to zgodzić wewnętrznie.
Uprawiam od lat Wicket, tam jest nawet stosowne pouczenie w oficjalnym Wiki, że Controler jest właśnie taki.

Więc wracając do pytania, czy preferowana architektura pod vaadin jest nie cztery a trójwartwowa?

Szczerze mówiąc, nawet w nie-korporacyjnym projekcie (klasy intranet) chciałbym architekturę “trzy i pół warstwową” *), choćby po to, by backend nadawał się pod vaadina i wicketa w rodzinie projektów


*) nawiązanie do postaci bazy danych “dwa i pół”, bardzo dobrej w wielu projektach

JPAContainer sięga bezpośrednio do bazy. W wypadku Vaadina zauważyliśmy że często całkiem nieźle sprawdza się wzorzec Model-View-Presenter (MVP), w takim wypadku architektura jest bliżej 4 warstw niż 3 :slight_smile: Więcej można przeczytać
w dokumentacji
. Prawdopodobnie następne webinarium po polsku będzie poświęcone właśnie MVP w Vaadinie, ale nie mogę podać terminu.

Generalnie najlepszą praktyką jest trzymania z dala od Vaadina wszelkich niuansów persystencji. W skrócie w warstwa od dostępu do bazy danych nie transmituje swoich niuansów do Vaadina (lazy, eager, one to many, itp).

Prosta architektura powinna mieć jasny podział kompetencji serwisów:

  • backend używa czego chce do odczytu z bazy
  • dostęp do backendu możliwy jest za pomocą resta, akki, itp
  • encje powinny byc w prosty sposób serializowane (bez adnotacji od JPA)

Frontend:

  • używa rest/akki/itp do pytania backendu
  • Virtin jest pomocny w zapewnieniu lazy loadingu
  • zamiast MVC, MVP i innych wiekowych rozwiązań, staraj sie mysleć o UI jako o zbiorze komponentów
  • eventBus jest bardzo pomocny w powiadamianiu róznych częsci UI o zmianach

I na koniec trzymaj jak najmniej danych w pamięci.