サーチ…


前書き

Spring Bootを使用すると、最小限の手間でSpringベースのプロダクションレベルのアプリケーションとサービスを簡単に作成できます。これは設定よりも慣例に有利です。

Spring Data JPAは、より大きなSpring Dataファミリの一部であり、JPAベースのリポジトリの実装を容易にします。これにより、データアクセス技術を使用するアプリケーションを簡単に構築できます。

備考

注釈

@Repository :アノテートされたクラスがオブジェクトのコレクションをエミュレートするストレージ、検索、および検索動作をカプセル化するメカニズムである「リポジトリ」であることを示します。 「データアクセスオブジェクト」などの従来のJ2EEパターンを実装しているチームも、このステレオタイプをDAOクラスに適用することがありますが、その前にデータアクセスオブジェクトとDDDスタイルリポジトリの区別を理解するように注意する必要があります。このアノテーションは汎用的なステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用することができます。

@RestController :この注釈を@Controllerする@Controller@ResponseBody.Typesで注釈された便利な注釈は、 @ResponseBody.Types @RequestMappingメソッドがデフォルトで@ResponseBodyセマンティクスを取るコントローラとして扱われます。

@Service :注釈付きクラスが「サービス」(たとえば、ビジネスサービスファサード)であることを示します。このアノテーションは@Component特殊化として機能し、クラスパスのスキャンによって実装クラスを自動検出することができます。

@SpringBootApplication :多くのSpring Boot開発者は、 @EnableAutoConfiguration @Configuration@EnableAutoConfiguration 、および@ComponentScan注釈を付けられたメインクラスを常に持っています。これらの注釈は頻繁に一緒に使用されるので(特に上記のベストプラクティスに従えば)、Springブートは便利な@SpringBootApplication代替手段を提供します。

@Entity :クラスがエンティティであることを指定します。このアノテーションはエンティティクラスに適用されます。

公式文書

Pivotal Softwareは、Spring Frameworkに関する豊富なドキュメントを提供しています。

SpringブートとSpringデータJPA統合の基本的な例

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()メソッドは、Spring起動のSpringApplication.run()メソッドを使用してアプリケーションを起動します。 1行のXMLは存在しないことに注意してください。 web.xmlファイルもありません。このWebアプリケーションは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. */
}

ここでは、 idtext 2つの属性を持つGreetingクラスがありtext 。また、2つのコンストラクタがあります。デフォルトコンストラクタは、JPAのためだけに存在します。それを直接使用することはないので、 protectedされたものとして指定することができます。もう1つのコンストラクタは、データベースに保存するGreetingインスタンスを作成するために使用するコンストラクタです。

Greetingクラスには、JPAエンティティであることを示す@Entityアノテーションが付けられます。 @Tableアノテーションがないため、このエンティティは「Greeting」という名前のテーブルにマップされると見なされます。

Greetingのidプロパティには@Idというアノテーションが付けられているため、JPAはそれをオブジェクトのIDとして認識します。 idプロパティには@GeneratedValueアノテーションも付けられ、IDが自動的に生成されることを示します。

もう1つのプロパティは、 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. */
}

ここには、同じGreetingクラスがあり、一時的なプロパティ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);
}

GreetingRepositoryCrudRepositoryインターフェースを拡張します。 GreetingLongで動作するエンティティとIDのタイプは、 CrudRepository汎用パラメータで指定されます。 CrudRepository拡張することにより、 GreetingRepositoryは、 Greetingエンティティの保存、削除、検索方法など、 Greeting永続性を扱ういくつかのメソッドを継承します。
CrudRepositoryPagingAndSortingRepositoryJpaRepository比較についてはこのディスカッションを参照してください。

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);

}

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);
    }

}

コントローラクラス

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を実行してアプリケーションを実行します。あるいは、. ./mvnw clean packageを使ってJARファイルをビルドすることもでき./mvnw clean package 。次に、JARファイルを実行します。

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow