close
close

Creëer een CRUD-applicatie in minder dan 15 minuten

CRUD-applicaties vormen tegenwoordig de ruggengraat van de meeste softwareprojecten. Als u dit artikel leest, is de kans groot dat uw project uitdagingen tegenkomt, dat u op zoek bent naar een snellere manier om deze taak uit te voeren of dat u op zoek bent naar een Java-framework om mee te beginnen. U bent niet de enige.

Nu de technische wereld voortdurend verandert, vooral met krappe budgetten, is er een duidelijke verschuiving gaande naar frameworks die alles onder één dak brengen, zodat er minder behoefte is aan grote teams.

Een goed voorbeeld van deze unified frameworks is Jmix. Laten we eens kijken hoe het de developer experience vereenvoudigt in een praktisch voorbeeld van het maken van een CRUD-applicatie.

U kunt ook de videoversie van deze gids bekijken op YouTube.

Jmix in actie

Wat vaak helpt om te begrijpen hoe goed je ontwikkelaarservaring zal zijn, is je handen vuil maken aan een praktisch project. Het is als het verschil tussen het lezen van een recept en het daadwerkelijk bakken van een cake – de een is een eitje, en de ander leert je hoe je moet bakken. 🙂

We bouwen een adminpaneel voor het beheer van werknemers met CRUD-functionaliteiten, een eenvoudige gebruikersinterface en REST API, beveiligingsfuncties en een kleine service.

Ons datamodel zal zich concentreren op twee hoofdentiteiten: werknemers en afdelingen. De entiteit Werknemer zal details bevatten zoals Werknemers-ID, Naam, Geboortedatum, Geslacht, Positie, Salaris en Afdelings-ID, waarmee een veel-op-één-relatie met de entiteit Afdeling wordt gevestigd. De entiteit Afdeling zal de Afdelings-ID, Afdelingsnaam en een korte beschrijving bevatten.

GegevensmodelentiteitenOns uitgangspunt is een reeds bestaand databaseschema met deze entiteiten en een volledig ingerichte PostgreSQL-omgeving.

Aan de slag

Persoonlijk besteed ik meer tijd aan het uitzoeken van de structuur en de beste werkwijzen op hoog niveau dan aan het schrijven van code als ik nieuw ben in een framework. Met Jmix krijg je vanaf het begin een vooraf geregeld project, waarbij de basis en de beste werkwijzen voor architectuur worden ingesteld, zodat je direct aan de slag kunt met het bouwen van onderhoudbare functies.

Hoewel de mappen op het projecttabblad u misschien doen denken aan een Spring Boot-installatie, gaat het Jmix-tabblad een stap verder en verdeelt het project in logische modules.

Mappen in het projecttabblad onderverdeeld in logische modulesOm te beginnen, verbinden we onze bestaande database. Het is net zo eenvoudig als het toevoegen van een nieuwe data store in Jmix. U typt uw ​​database-referenties in en Jmix genereert alle benodigde configuraties in het eigenschappenbestand. Het genereert zelfs een speciale config-klasse, netjes weggestopt in het configuratietabblad voor eenvoudige toegang.

Jmix voert al het routinematige werk voor u uit door uw volledige datamodel* rechtstreeks vanuit uw bestaande databasetabellen te genereren.

Model genereren uit database

Het proces stopt daar niet. Binnen dezelfde wizard kunt u ook weergaven bouwen (het deel van uw applicatie waarmee gebruikers interacteren) voor elke entiteit.

Jmix biedt twee hoofdweergaven:

  1. Lijstweergaven meerdere records tegelijk weergeven, vaak in een tabel- of lijstformaat. Deze weergave is handig om door gegevens te bladeren en snel specifieke records te vinden.
  2. Gedetailleerde weergavenaan de andere kant, tonen een enkel record in detail. Dit is waar gebruikers de volledige informatie over een bepaald item kunnen bekijken of bewerken.

Standaardweergaven makenMet deze aanpak zorgt u ervoor dat u niet alleen de backend instelt, maar in één keer ook een interactieve front-end van uw applicatie opzet.

Binnen enkele minuten hebt u uw entiteiten, hun bijbehorende controller (waarin uw bedrijfslogica zich bevindt) en XML-descriptoren gemaakt die de lay-out van uw gebruikersinterface definiëren.

U zult aangenaam verrast zijn wanneer u op de groene knop klikt en wordt begroet door een full-stack applicatie die zich direct op uw computer bevindt. localhost:8080.

Full-stack applicatie op localhost:8080

Opmerking: Jmix gebruikt JPA-entiteiten, wat Java-klassen zijn die zijn geannoteerd volgens JPA-standaarden. Deze entiteiten worden opgeslagen in een relationele database, hetzij als primaire of aanvullende gegevensopslag. Lees verder.

Beveiliging

Hoe zit het met de veiligheidsvoorzieningen? Jmix vereenvoudigt beveiligingsbeheer met twee typen rollen: resource- en rijniveau. Denk aan resourcerollen als uw sleutels tot verschillende kamers – ze laten u bepalen wie toegang krijgt tot welke delen van uw app, zoals specifieke entiteiten of weergaven. Rollen op rijniveaubieden daarentegen een nauwkeurige controle, waarmee u machtigingen kunt instellen voor afzonderlijke entiteitsinstanties (beperkingen kunt toevoegen op basis van bepaalde regels).

In ons voorbeeld stellen we een managerrol in met behulp van een resourcerol, die toegang verleent tot de werknemersweergave. Het enige wat u hoeft te doen, is met de rechtermuisknop op het tabblad ‘Beveiliging’ in Jmix Studio klikken, uw managerresourcerol maken en u bent klaar. De declaratieve benadering van Jmix om machtigingen voor uw weergaven en entiteiten te definiëren via de gebruikersinterface van uw IDE, gaat over het aangeven van wat u wilt, niet hoe u het moet doen.

Een managerrol instellenDus, met de managerrol ingesteld, kunnen managers alleen een kijkje nemen in de views die u voor hen hebt goedgekeurd. Laten we dit in de praktijk brengen.

Met elk nieuw project dat wordt aangemaakt, genereert Jmix automatisch een User entity met een complete lijst van CRUD-functionaliteit. Het aanmaken en toewijzen van rollen wordt net zo eenvoudig als het bestellen van pizza: u doet het met een paar klikken in uw applicatie en het is in no time klaar.
Gebruikersentiteit met een complete lijst van CRUD-functionaliteit

Stel dat we ervoor willen zorgen dat onze managers niet op het verkeerde kantoorfeestje terechtkomen en dat ze alleen de medewerkers van de betreffende afdeling mogen zien.

Hiervoor moeten we een ‘verantwoordelijke’ gebruikerskenmerk aan de afdeling toevoegen. Dat kunnen we handmatig doen of met behulp van Jmix Studio.

Ik weet niet hoe het met u zit, maar wanneer ik iets in mijn code wil veranderen, moet ik veranderingen in elke hoek van de lagen van mijn applicatie propageren. Jmix houdt bij wat er in uw views moet worden veranderd en verwerkt database-updates automatisch met Liquibase zonder dat u iets hoeft te configureren.

Lijst met kenmerken

Onze applicatie is al goed uitgerust om een ​​rol op rijniveau te creëren in runtime via het admin-account. Om de juiste gegevens te laden, kiezen we de entiteit en typen we een JPQL-script om alleen de werknemers op te halen waarvan de verantwoordelijke ID van de afdeling hetzelfde is als de huidige gebruiker, of manager in dit geval.

Rij-niveaubeleid

Nadat we de rol op rijniveau aan John hebben toegewezen op dezelfde manier als we dat met de resourcerol hebben gedaan, kunnen we achterover leunen en toekijken hoe John precies ziet wat hij moet doen: niets meer en niets minder.
3 medewerkers gevonden

Let op: Jmix maakt rechtstreeks gebruik van Spring Security servlet-authenticatie. Als u bekend bent met dit framework, kunt u het standaardauthenticatiemechanisme dat Jmix biedt, eenvoudig uitbreiden of overschrijven. Lees verder.

Dienst

Laten we eens kijken hoe we wat functionaliteit in onze applicatie kunnen implementeren. Onze manager, John, is toevallig op een missie om de zitplaatsindeling op kantoor te optimaliseren op basis van de grootte van de afdeling. Om zijn leven makkelijker te maken, maken we een knop die werknemers telt per afdeling in de lijstweergave van de afdeling.

Eerst maken we een Spring service bean*, DepartmentService. Daarbinnen voegen we de methode toe calculateEmployeeByDepartment.

Jmix Studio biedt een manier om nuttige context-afhankelijke code te scaffolden met behulp van de knop “Code Snippets”. Hier kunnen we “Data -> Load list of entities by query” kiezen en het menu volgen om de onderstaande methode te genereren.

public Integer calculateEmployeeByDepartment(Department department) {
    if(department == null)
        return 0;
    final List myEntityList = dataManager.load(Employee.class)
            .query("select e from Employee e where e.department = :department1")
            .parameter("department1", department)
            .list();
    return myEntityList.size();
} 

We hebben nu een methode die het aantal werknemers dat aan een specifieke afdeling is gekoppeld, laadt en telt.

Voor mijn backend-devs die al in het zweet uitbreken bij de gedachte aan frontend-codering: met Jmix is ​​alles declaratief, zelfs aan de front-end. De XML-indeling van Jmix maakt het makkelijker om je weergaven te visualiseren. Om een ​​knop toe te voegen, klik je gewoon met de rechtermuisknop op het knoppenpaneel in het tabblad UI van Jmix en selecteer je ‘Knop’.

Kies componenten om in te voegen

Onder de hoofdweergave van de knoppen biedt Jmix een heleboel mogelijke attributen, zodat u ze niet allemaal hoeft te onthouden. Geef uw knop een naam en u kunt instellen hoe deze werkt.

Jmix heeft een duidelijke scheiding tussen de declaratieve lay-out van componenten gedefinieerd in XML en programmatische initialisatie en event-handling logica geschreven in Java. In het ‘handler’ tabblad vindt u een verscheidenheid aan events die u kunt gebruiken. En voor de detailgerichte mensen, ja, u kunt kiezen tussen enkele of dubbele klikken.

Zodra u een gebeurtenis hebt gekozen, creëert Jmix op een overzichtelijke manier het skelet van de methode in uw controller, waarin alle logica plaatsvindt. Vervolgens kunt u de benodigde afhankelijkheden injecteren en uw bedrijfslogica coderen.

@Subscribe(id = "countFTEButton", subject = "clickListener")
public void onCountFTEButtonClick(final ClickEvent event) {
    Integer count = employeeService.calculateEmployeeByDepartment(departmentsDataGrid.getSingleSelectedItem());
    notifications.create(count + " employees found!").show();
} 

In deze code stelt Jmix een event listener in voor onze knop. Wanneer erop wordt geklikt, wordt de onCountEmployeesButtonClick methode. Binnen deze methode roepen we eerst onze calculateEmployeeByDepartment servicemethode. Het haalt het aantal werknemers op voor de afdeling die momenteel is geselecteerd in onze departmentsDataGridVervolgens gebruiken we de notificatiebean van Jmix om het aantal aan de gebruiker te tonen.

Wanneer John of een andere gebruiker op deze manier op de knop klikt, krijgt hij of zij een melding met het aantal medewerkers in de gekozen afdeling.

Aantal werknemers in de gekozen afdeling

Opmerking: In Spring worden de objecten die de backbone van uw applicatie vormen en die worden beheerd door de Spring IoC-container, beans genoemd. Een bean is een object dat wordt geïnstantieerd, geassembleerd en anderszins wordt beheerd door een Spring IoC-container. Lees verder.

Toevoegingen

Net zoals Spring’s ecosysteem de harten van ontwikkelaars heeft veroverd met zijn scala aan tools, heeft Jmix zijn eigen set plug-and-play componenten genaamd add-ons. Deze add-ons besparen u tijd door snel nieuwe functies aan uw app toe te voegen met vooraf gecompileerde code en resources.

Een van de veelgebruikte add-ons is bijvoorbeeld de REST API-add-on gebouwd op de top van de Spring-autorisatieserver. U kunt uw gegevens en services beheren zonder het extra werk van het schrijven van REST-controllers. Of u nu integreert met een modern JavaScript-framework voor een stijlvolle front-end of met een extern systeem, deze add-on kan uw brug zijn met minimale rompslomp.

Wanneer Jmix niet te gebruiken

Het is allemaal leuk en aardig als je het in de schijnwerpers zet, maar hoe zit het met de zwakke plekken? Zoals bij elke technologie zijn er ook nadelen verbonden aan het gebruik van Jmix.

Jmix is ​​niet de beste keuze voor u als:

  • U hebt een sterk aangepaste gebruikersinterface nodig: Hoewel je JS in Jmix kunt gebruiken om unieke UI-elementen en complexe interfaces (bijvoorbeeld AWS super admin) of een CMS te maken, kost dit meer tijd dan wanneer je een gangbare manier zou gebruiken om je front-end te bouwen met JavaScript-frameworks (zoals React of Vue).
  • Je bent aan het bouwen een toepassing met hoge belasting: De front-end van Jmix gebruikt een stateful-benadering, wat betekent dat de status aan de serverzijde wordt onderhouden. Dit kan leiden tot prestatieproblemen bij zware belasting (d.w.z. honderdduizenden verzoeken), omdat het beheren van talrijke actieve sessies op de server geheugenverslindend wordt.
  • Uw applicatie is veel te klein: Als u een admin-paneel met één pagina nodig hebt, is Jmix misschien overkill met zijn zware UI (herinnert u zich de stateful-aanpak?) en een hoop ongebruikte functies in de applicatie. Het zou een eenvoudigere oplossing zijn om een ​​template-engine te gebruiken als u alleen in Java wilt schrijven.

Conclusie

Jmix is ​​een waardevolle tool voor iedereen die zich bezighoudt met de ontwikkeling van Spring-Boot-gebaseerde bedrijfsapplicaties. Het is handig als uw applicatie een uitgebreid datamodel, niet-triviale bedrijfslogica en een functionele gebruikersinterface heeft, vaak met honderden schermen. Dankzij de eenvoud en de hulpmiddelen die het platform biedt, is het een goede manier om tijd te besparen bij het bouwen van een Line-of-Business (LOB)-webapplicatie, maar het is niet beperkt tot dat.