このチュートリアルでは、才能のあるクラスの小さな鋭いUは見に行くことができます春データJPAをどのようにDAOは完全な抽象化レイヤを提供します。私たちに不要になったDAOを実装層を書き、春データは自動的に達成するために生成されたDAOの実装を。
コンフィギュレーションに依存
このチュートリアルでは、私がしますのMySQL でデータベースを春データを一緒に使用します。 これは、build.gradle ファイル:
buildscript {
EXT {
springBootVersion = '2.1.0.RELEASE'
}
リポジトリ{
mavenCentral()
}
依存関係{
クラスパス( "org.springframework.boot:スプリングブートのGradle-プラグイン:$ {springBootVersion}")
}
}
プラグインを適用する:「Javaの
プラグインを適用する:「日食」
プラグインを適用する:「org.springframework.boot」
プラグインを適用する:「io.spring.dependency、経営者
グループ= 'com.amitph.spring'
バージョン= '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
リポジトリ{
mavenCentral()
}
依存関係{
実装(「org.springframework.boot:春・ブート・スターター・ウェブ」)
コンパイル( "org.springframework.boot:春・ブート・スターター・データ-JPA")
コンパイル( 'mysqlの:mysqlのコネクタ-javaの:8.0.13')
testImplementation(「org.springframework.boot:春・ブート・スターターテスト」)
}
データ・ソース構成
今、私たちは、依存関係を設定していること。今、データソースに接続するためにどの教えていません。これは、と私です春ブーツ、データ・ソース・エントリ・application.yml 。
春:
情報源:
URLます。jdbc:mysqlの:// localhostを:33099 /犬
パスワード:<HERE _ _パスワードを入力します>
ユーザ名:ルート
ドライバー・クラス名:「はcom.mysql.jdbc.Driver」
JPA:
データベース・プラットフォーム:org.hibernate.dialect.MySQL5InnoDBDialect
休止状態:
DDL-オート:アップデート
ここでは、指定したJDBCのURL 、ユーザ名、パスワード、およびドライバクラス名、(MySQLの)。
また、そこにJPAの具体的な構成。最初はそれがあることを教えてくれる、データベースプラットフォームであるMySQLの次の方言の問い合わせのための基礎を検討するHibernateの機能を。このように、すべてのデータベース操作がしますMySQLの特定の構文処理を。第JPAの構成があるDDLオート指示、休止状態を(まだ存在していない場合)独自のデータベースやテーブル構造を作成します。
有効にすると、Hibernateは、エンティティに基づいて行われます豆データベースの構造とデータソースを作成します。
エンティティBean
我々は最初のレベルのコードがで書かれているでしょうエンティティBean 。これがあるのOracle エンティティのドキュメント豆コンテンツ。
使用JPA 、あなたはどんな使用できるPOJOのように、クラスをJPAのエンティティ-使用してからのJPA (中永続プロバイダのJava EE EJB 非transientフィールドでエンティティマネージャサービスを、得るために、コンテナまたは外部の内部に)関係を永続化する必要がありますデータベースのJava オブジェクト。Java SEのアプリケーションのEJB コンテナ)。
簡単な言葉では、JPAのエンティティは、任意のあるJavaのPOJO 、基礎となる表の構造を示すことができます。「に基づき、当社のサービスなのでDog
、」テーブル、我々が作成されます「Dog
」 物理的なオブジェクトを。
パッケージcom.amitph.spring.dogs.repo。
輸入javax.persistence.Entity。
輸入javax.persistence.GeneratedValue;
輸入javax.persistence.Id;
@エンティティ
パブリッククラス犬{
@Id
@GeneratedValue
プライベート長いID。
プライベート文字列名;
プライベートint型の年齢;
公衆ロングのgetId(){
IDを返します。
}
公共ボイドSETID(長いID){
this.id = ID。
}
パブリック文字列のgetName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
上面的POJO用@Entity
注释,表示这是表名Dog的实体对象。
然后,有三个字段代表数据表列。字段ID是我们的主键,因此被标记为@Id。
字段ID也用@GeneratedValue
标记,表示这是一个自动增量列,Hibernate将负责输入下一个值。Hibernate首先将查询基础表以了解该列的最大值,并在下一次插入时对其进行递增。这也意味着我们不需要为Id列指定任何值,可以将其留空。
仓库接口
存储库代表DAO层,通常执行所有数据库操作。感谢Spring Data,他提供了这些方法的实现。让我们看看我们的DogsRepoisitory
,它扩展了CrudRepository
:
package com.amitph.spring.dogs.repo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface DogsRepository extends CrudRepository<Dog, Long> {}
DogsRepository
中这里没有方法声明。这是因为Spring Data的CrudInterface
已经声明了基本的CRUD方法。
在这里,我们完成了JPA和Spring数据工作——换句话说,就是DAO层。现在,让我们编写一个简单的服务层和一个控制器。
控制器和服务层
完成数据访问层后,我们将编写控制器和服务层。请注意,DogsRepository
带有@Repository
注释,这也将其添加到Spring Context中。现在,我们可以在Service
中自动连线存储库。
Dogs Service
此类具有简单的CRUD方法。还将Entity Bean转换为DTO(数据传输对象)。DTO还是一个简单的Java POJO,用于在系统之间传输数据。在这里,我们从REST端点返回DTO。
package com.amitph.spring.dogs.service;
import com.amitph.spring.dogs.model.DogDto;
import com.amitph.spring.dogs.repo.Dog;
import com.amitph.spring.dogs.repo.DogsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
@Component
public class DogsService {
@Autowired DogsRepository repository;
public void add(DogDto dto) {
repository.save(toEntity(dto));
}
public void delete(long id) {
repository.deleteById(id);
}
public List<Dog> getDogs() {
return (List<Dog>) repository.findAll();
}
public Dog getDogById(long id) {
Optional<Dog> optionalDog = repository.findById(id);
return optionalDog.orElseThrow(() -> new DogNotFoundException("Couldn't find a Dog with id: " + id));
}
private Dog toEntity(DogDto dto) {
Dog entity = new Dog();
entity.setName(dto.getName());
entity.setAge(dto.getAge());
return entity;
}
}
Dogs控制器
Dogs Controller是具有简单CRUD端点的标准REST控制器。控制器的工作是处理HTTP请求并调用Service类方法。
package com.amitph.spring.dogs.web;
import com.amitph.spring.dogs.model.DogDto;
import com.amitph.spring.dogs.repo.Dog;
import com.amitph.spring.dogs.service.DogsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/dogs")
public class DogsController {
@Autowired DogsService service;
@GetMapping
public List<Dog> getDogs() {
return service.getDogs();
}
@PostMapping
public void postDogs(@RequestBody DogDto dto) {
service.add(dto);
}
@GetMapping("/{id}")
public Dog getById(@PathVariable(required = true) long id) {
return service.getDogById(id);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable(required = true) long id) {
service.delete(id);
}
}
现在,Dogs Service已准备好运行。启动应用程序并执行HTTP端点。
结论
Spring数据和JPA教程的Spring Boot到此结束。我们看到了如何将Spring Data的抽象用于数据访问层。我们看到了如何以Entity Bean的形式表示数据库表,以及如何使用Spring Data的自动生成的存储库实现。此外,我们还看到了如何使用Spring Boot进行自动数据源配置。
在Spring Boot Rest Service帖子中,我们已经看到了使用Spring Boot创建RESTful Web服务。在当前文章中,我们不关心异常处理。访问Spring Rest Service异常处理以了解有关处理异常的信息。我们还跳过了这里的单元测试部分,这将在以后的文章中介绍。