spring-boot
Весенняя загрузка + Spring Data JPA
Поиск…
Вступление
Spring Boot упрощает создание весенне-летних приложений и услуг с абсолютной минимальной суетой. Он поддерживает соглашение по конфигурации.
Spring Data JPA , часть большого семейства Spring Data , упрощает реализацию репозиториев на базе JPA. Это упрощает сбор приложений, использующих технологии доступа к данным.
замечания
Аннотации
@Repository
: указывает, что аннотированный класс является «репозиторием», механизмом инкапсуляции хранения, поиска и поиска, который эмулирует коллекцию объектов. Команды, реализующие традиционные шаблоны J2EE, такие как «Объект доступа к данным», также могут применять этот стереотип к классам DAO, хотя перед этим следует позаботиться о том, чтобы понять различия между объектом доступа к данным и хранилищами в стиле DDD. Это аннотирование является стереотипом общего назначения, и отдельные команды могут сузить семантику и использовать по мере необходимости.
@RestController
: Удобный аннотаций , который сам с аннотацией @Controller
и @ResponseBody.Types
, которые несут эту аннотацию трактуются как контроллеры , где @RequestMapping
методы предполагают @ResponseBody
семантики по умолчанию.
@Service
: указывает, что аннотированный класс - это «Сервис» (например, фасад бизнес-сервиса). Это аннотирование служит специализацией @Component
, позволяющей автоопределять классы реализации через сканирование классов.
@SpringBootApplication
: у многих разработчиков Spring Boot всегда есть свой основной класс, аннотированный с @Configuration
, @EnableAutoConfiguration
и @ComponentScan
. Поскольку эти аннотации часто используются вместе (особенно если вы следуете лучшим практикам выше), Spring Boot предоставляет удобную альтернативу @SpringBootApplication
.
@Entity
: указывает, что класс является сущностью. Эта аннотация применяется к классу сущности.
Официальная документация
Pivotal Software предоставила довольно обширную документацию по Spring Framework, и ее можно найти на
Весенняя загрузка и весна.
Мы собираемся создать приложение, которое хранит POJO в базе данных. Приложение использует Spring Data JPA для хранения и извлечения данных в реляционной базе данных. Его наиболее привлекательной особенностью является возможность создания реализаций репозитория автоматически во время выполнения из интерфейса репозитория.
Основной класс
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);
}
}
Метод main()
использует метод SpringApplication.run()
Spring Boot для запуска приложения. Обратите внимание, что нет ни одной строки XML. Нет файла web.xml. Это веб-приложение представляет собой 100% чистую Java, и вам не нужно заниматься настройкой любой сантехники или инфраструктуры.
Класс сущности
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. */
}
Здесь у вас есть класс Greeting
с двумя атрибутами, id
и text
. У вас также есть два конструктора. Конструктор по умолчанию существует только для JPA. Вы не будете использовать его напрямую, поэтому его можно назначить protected
. Другой конструктор - тот, который вы будете использовать для создания экземпляров Greeting
для сохранения в базе данных.
Класс Greeting
аннотируется с @Entity
, указывая, что это объект JPA. Из-за отсутствия аннотации @Table
предполагается, что этот объект будет сопоставлен с таблицей «Приветствие».
Свойство id
приветствия аннотируется с @Id
так что JPA распознает его как идентификатор объекта. Свойство id
также аннотируется с помощью @GeneratedValue
чтобы указать, что идентификатор должен генерироваться автоматически.
Другое свойство, text
остается неаннотированным. Предполагается, что он будет сопоставлен с столбцом, который имеет то же имя, что и само свойство.
Свойства переходного процесса
В классе сущности, аналогичном описанному выше, мы можем иметь свойства, которые мы не хотим сохранять в базе данных или создавать в качестве столбцов в нашей базе данных, возможно, потому что мы просто хотим установить их во время выполнения и использовать их в нашем приложении, поэтому мы можем иметь это свойство, аннотированное аннотацией @Transient.
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. */
}
Здесь у вас есть тот же класс приветствия, который теперь имеет свойство переходного textInSomeLanguage
которое можно инициализировать и использовать во время выполнения и не будет сохраняться в базе данных.
Класс DAO
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
расширяет интерфейс CrudRepository
. Тип объекта и идентификатор, с которым он работает, Greeting
и Long
, указаны в общих параметрах на CrudRepository
. Расширяя CrudRepository
, GreetingRepository
наследует несколько методов работы с постоянством Greeting
, включая методы сохранения, удаления и поиска объектов Greeting
.
См. Это обсуждение для сравнения CrudRepository
, PagingAndSortingRepository
, JpaRepository
.
Spring Data JPA также позволяет вам определять другие методы запроса, просто объявляя свою подпись метода. В случае GreetingRepository
это показано с помощью findByText()
.
В типичном приложении Java вы должны написать класс, реализующий GreetingRepository
. Но это делает Spring Data JPA настолько мощным: вам не нужно писать реализацию интерфейса репозитория. Spring Data JPA создает реализацию «на лету» при запуске приложения.
Класс обслуживания
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);
}
Сервисный компонент
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);
}
}
Класс контроллера
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);
}
}
Файл свойств приложения для базы данных MySQL
#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
drop table if exists greeting;
create table greeting (
id bigint not null auto_increment,
text varchar(100) not null,
primary key(id)
);
Файл pom.xml
<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>
Создание исполняемого JAR
Вы можете запустить приложение из командной строки с помощью Maven. Или вы можете создать один исполняемый JAR-файл, содержащий все необходимые зависимости, классы и ресурсы, и запустите его. Это упрощает отправку, версию и развертывание службы в виде приложения на протяжении всего жизненного цикла разработки, в разных средах и т. Д.
Запустите приложение, используя ./mvnw spring-boot:run
. Или вы можете создать JAR-файл с ./mvnw clean package
. Затем вы можете запустить JAR-файл:
java -jar target/springboot-0.0.1-SNAPSHOT.jar