Sök…


Introduktion

Spring Boot gör det enkelt att skapa vårdrivna applikationer och tjänster i produktionskvalitet med absolut minimalt krångel. Det gynnar konvention över konfiguration.

Spring Data JPA , en del av den större Spring Data- familjen, gör det enkelt att implementera JPA-baserade förvar. Det gör det lättare att bygga appar som använder datatillgångsteknologier.

Anmärkningar

anteckningar

@Repository : Indikerar att en kommenterad klass är en "Repository", en mekanism för att kapa in lagring, hämtning och sökbeteende som emulerar en samling objekt. Lag som implementerar traditionella J2EE-mönster som "Data Access Object" kan också tillämpa denna stereotyp på DAO-klasser, men man bör se till att förstå skillnaden mellan Data Access Object och DDD-stil förråden innan de gör det. Den här anteckningen är en generell stereotyp och enskilda team kan begränsa sin semantik och använda vid behov.

@RestController : En bekvämhetsanteckning som i sig själv är kommenterad med @Controller och @ResponseBody.Types som bär denna kommentar behandlas som kontroller där @RequestMapping metoder antar @ResponseBody semantik som standard.

@Service : Indikerar att en kommenterad klass är en "tjänst" (t.ex. en affärstjänstfasad). Den här anteckningen fungerar som en specialisering av @Component , vilket gör att implementeringsklasser kan autodetekteras genom klassvägsskanning.

@SpringBootApplication : Många Spring Boot-utvecklare har alltid sin huvudklass antecknade med @Configuration , @EnableAutoConfiguration och @ComponentScan . Eftersom dessa kommentarer används så ofta tillsammans (särskilt om du följer bästa praxis ovan), ger Spring Boot ett bekvämt @SpringBootApplication alternativ.

@Entity : Anger att klassen är en enhet. Den här anteckningen tillämpas på entitetsklassen.

Officiell dokumentation

Pivotal Software har tillhandahållit en ganska omfattande dokumentation om Spring Framework, och den finns på

Spring Boot och Spring Data JPA grundläggande exempel

Vi kommer att bygga en applikation som lagrar POJO: er i en databas. Programmet använder Spring Data JPA för att lagra och hämta data i en relationsdatabas. Dess mest övertygande funktion är förmågan att skapa förvarsimplementeringar automatiskt, vid körning, från ett arkivgränssnitt.

Huvudklass

package org.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

Den main() metoden använder Spring Boot s SpringApplication.run() metod för att starta ett program. Observera att det inte finns en enda XML-rad. Ingen web.xml-fil heller. Denna webbapplikation är 100% ren Java och du behöver inte ta itu med att konfigurera VVS eller infrastruktur.

Enhetsklass

package org.springboot.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String text;

    public Greeting() {
        super();
    }

    public Greeting(String text) {
        super();
        this.text = text;
    }

    /* In this example, the typical getters and setters have been left out for brevity. */
}

Här har du en Greeting med två attribut, id och text . Du har också två konstruktörer. Standardkonstruktorn finns bara för JPA: s skull. Du kommer inte att använda det direkt, så det kan betecknas som protected . Den andra konstruktören är den du använder för att skapa instanser av Greeting som ska sparas i databasen.

Greeting kommenteras med @Entity , vilket indikerar att det är en JPA-enhet. Avsaknad av en @Table anteckning antas att denna enhet kommer att kartläggas till en tabell med namnet "Hälsning".

Hälsningens id egenskap antecknas med @Id så att JPA kommer att känna igen den som objektets ID. id egenskapen kommenteras också med @GeneratedValue att indikera att ID ska genereras automatiskt.

Den andra egenskapen, text lämnas obemärkt. Det antas att det kommer att kartläggas till en kolumn som har samma namn som egenskapen själv.

Övergående egenskaper

I en enhetsklass som liknar den ovan, kan vi ha egenskaper som vi inte vill ha kvar i databasen eller skapas som kolumner i vår databas kanske för att vi bara vill ställa in dem vid körning och använda dem i vår applikation, därmed kan vi få den egenskapen kommenterad med @Transient-anteckningen.

package org.springboot.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String text;
    @Transient
    private String textInSomeLanguage;
    
    public Greeting() {
        super();
    }
 
    public Greeting(String text) {
        super();
        this.text = text;
        this.textInSomeLanguage = getTextTranslationInSpecifiedLanguage(text);
    }

    /* In this example, the typical getters and setters have been left out for brevity. */
}

Här har du samma hälsning klass som nu har en övergående egenskap textInSomeLanguage som kan initieras och användas vid körning och kommer inte att framhärdade i databasen.

DAO klass

package org.springboot.repository;

import org.springboot.model.Greeting;
import org.springframework.data.repository.CrudRepository;

public interface GreetingRepository extends CrudRepository<Greeting, Long> {

    List<Greeting> findByText(String text);
}

GreetingRepository utökar gränssnittet CrudRepository . Typ av enhet och ID som det fungerar med, Greeting och Long , anges i de generiska parametrarna på CrudRepository . Genom att utvidga CrudRepository ärver GreetingRepository flera metoder för att arbeta med Greeting , inklusive metoder för att spara, ta bort och hitta Greeting .
Se denna diskussion för jämförelse av CrudRepository , PagingAndSortingRepository , JpaRepository .

Spring Data JPA låter dig också definiera andra frågeställningsmetoder genom att helt enkelt deklarera deras metodsignatur. När det gäller GreetingRepository visas detta med en findByText() -metod.

I en typisk Java-applikation kan du förvänta dig att skriva en klass som implementerar GreetingRepository . Men det är det som gör Spring Data JPA så kraftfull: Du behöver inte skriva en implementering av arkivgränssnittet. Spring Data JPA skapar en implementering när du kör applikationen.

Serviceklass

package org.springboot.service;

import java.util.Collection
import org.springboot.model.Greeting;

public interface GreetingService {

    Collection<Greeting> findAll();
    Greeting findOne(Long id);
    Greeting create(Greeting greeting);
    Greeting update(Greeting greeting);
    void delete(Long id);

}

Service Bean

package org.springboot.service;

import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.repository.GreetingRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GreetingServiceBean implements GreetingService {

    @Autowired
    private GreetingRepository greetingRepository;

    @Override
    public Collection<Greeting> findAll() {
        Collection<Greeting> greetings = greetingRepository.findAll();
        return greetings;
    }

    @Override
    public Greeting findOne(Long id) {
        Greeting greeting = greetingRepository.findOne(id);
        return greeting;
    }

    @Override
    public Greeting create(Greeting greeting) {
        if (greeting.getId() != null) {
            //cannot create Greeting with specified Id value
            return null;
        }
        Greeting savedGreeting = greetingRepository.save(greeting);
        return savedGreeting;
    }

    @Override
    public Greeting update(Greeting greeting) {
        Greeting greetingPersisted = findOne(greeting.getId());
        if (greetingPersisted == null) {
            //cannot find Greeting with specified Id value
            return null;
        }
        Greeting updatedGreeting = greetingRepository.save(greeting);
        return updatedGreeting;
    }

    @Override
    public void delete(Long id) {
         greetingRepository.delete(id);
    }

}

Controller Class

package org.springboot.web.api;

import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api")
public class GreetingController {

    @Autowired
    private GreetingService greetingService;

    // GET [method = RequestMethod.GET] is a default method for any request. 
    // So we do not need to mention explicitly

    @RequestMapping(value = "/greetings", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Collection<Greeting>> getGreetings() {
        Collection<Greeting> greetings = greetingService.findAll();        
        return new ResponseEntity<Collection<Greeting>>(greetings, HttpStatus.OK);
    }

    @RequestMapping(value = "/greetings/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> getGreeting(@PathVariable("id") Long id) {
        Greeting greeting = greetingService.findOne(id);
        if(greeting == null) {
            return new ResponseEntity<Greeting>(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<Greeting>(greeting, HttpStatus.OK);
    }
    
    @RequestMapping(value = "/greetings", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> createGreeting(@RequestBody Greeting greeting) {
        Greeting savedGreeting = greetingService.create(greeting);
        return new ResponseEntity<Greeting>(savedGreeting, HttpStatus.CREATED);
    }

    @RequestMapping(value = "/greetings/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> updateGreeting(@PathVariable("id") Long id, @RequestBody Greeting greeting) {
        Greeting updatedGreeting = null;
        if (greeting != null && id == greeting.getId()) {
            updatedGreeting = greetingService.update(greeting); 
        }
        if(updatedGreeting == null) {
            return new ResponseEntity<Greeting>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<Greeting>(updatedGreeting, HttpStatus.OK);
    }

    @RequestMapping(value = "/greetings/{id}", method = RequestMethod.DELETE)
    public ResponseEntity<Greeting> deleteGreeting(@PathVariable("id") Long id) {
        greetingService.delete(id);
        return new ResponseEntity<Greeting>(HttpStatus.NO_CONTENT);
    }

}

Programegenskaper för MySQL-databas

#mysql config
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=Welcome@123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto = update

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy

#initialization
spring.datasource.schema=classpath:/data/schema.sql

SQL-fil

drop table if exists greeting;
create table greeting (
    id bigint not null auto_increment, 
    text varchar(100) not null, 
    primary key(id)
);

pom.xml-fil

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Bygga en körbar JAR

Du kan köra applikationen från kommandoraden med Maven. Eller så kan du bygga en enda körbar JAR-fil som innehåller alla nödvändiga beroenden, klasser och resurser och köra det. Detta gör det enkelt att skicka, versionera och distribuera tjänsten som en applikation under hela utvecklingslivscykeln, över olika miljöer och så vidare.

Kör applikationen med ./mvnw spring-boot:run . Eller så kan du bygga JAR-filen med ./mvnw clean package . Sedan kan du köra JAR-filen:

java -jar target/springboot-0.0.1-SNAPSHOT.jar


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow