spring-boot
スプリングブート+スプリングデータJPA
サーチ…
前書き
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. */
}
ここでは、 id
とtext
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);
}
GreetingRepository
はCrudRepository
インターフェースを拡張します。 Greeting
とLong
で動作するエンティティとIDのタイプは、 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);
}
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