[Java][Spring Boot][JPA] 数据库应用 – 使用NetBeans开始Spring Boot (6)

摘要
一句话描述整个事物或情况的简洁概述。

Spring Boot使用Spring Data进行数据库访问。
Spring Data是一个抽象化访问JPA和MongoDB等数据存储的层。

我会使用JPA。

必须制作的东西

实体类 (Shí tǐ

这是与数据库表相对应的类。

如果已经准备好了数据库,使用NetBeans的功能进行生成是很简单的。

从[文件]>[新文件]菜单中,可以通过[Persistence]>[从数据库生成实体类]来从数据库的表中生成Entity类。

存储库接口

这是一个用来操作实体的接口。它是org.springframework.data.repository.Repository<T, ID extends Serializable>接口的派生接口。

作为派生接口,下面的内容已经提前准备好了。

インターフェース解説CrudRepository一般的なCread/Read/Update/Delete操作が定義されていますPagingAndSortingRepositoryソートとページング付きの全検索が定義されています。CrudRepositoryを継承しています。

使用方法

如果使用@Autowired等依赖注入到Repository接口上,Spring会自动创建代理实例。

@Component
public class SomeClass {
  // ...
  @Autowired
  private SomeRepository someRepository;
  // ...
}

只需要调用已定义的方法即可。

我想要进行除了CRUD之外的操作。

这是关于如何执行除了CRUD操作之外的其他操作的方法,在CrudRepository中事先准备。

方法1- 按照命名规约实现方法。

实现符合以下命名约定的方法,将为方法名称提供相应的行为。

    • find…By

 

    • read…By

 

    • get…By

 

    • query…By

stream…By Java 8のStreamを返します。
count…By
exists…By
delete…By
remove…By

出现在 “By” 之后的部分将会变成搜索表达式。

副查询部分包括Distinct以及关联实体的名称等。

多种搜索方式

提前准备了各种物品。

在2016/11/11的追记里,解释了关于【Spring Data JPA】自动生成的方法命名规则。

検索式例2項目をAndで結ぶfindByFirstnameAndLastname(String lastname)2項目をOrで結ぶfindByFirstnameOrLastname(String firstname, String lastname)2項目の間findByCreateDateBetween(Date since, Date to)After/GreaterThan
GreaterThanEqual
Before/LessThan
LessThanEqual
IsNull
IsNotNull
NotIn
In
StartingWith/EndingWith/Containing
NotContaining
Like
NotLike
大文字小文字を無視findByFirstnameIgnoreCase(String firstname)ソートfindAllOrderByFirstnameAsc() findAllOrderByFirstnameDesc()

进入……的事物

副式解説DistinctSQLのDISTINCTと一緒です。Top<数字> / First<数字>先頭から<数字>レコード分を返します。エンティティ名リレーション先のエンティティを返します。

方案2 – 实现带有 @Query 注解的方法

比如说,可以像这样。

@Query("SELECT u FROM User WHERE u.firstname = :firstname")
List<User> findByFirstname(String firstname);

@Query的内容可以使用JPQL吗?

也可以使用Spring表达式语言。

第三种方法-创建一个自定义的类

在实现命名约定和JPQL无法满足的功能时,需要创建自定义类。

假设原先存在这样一个“Repository”接口,

public interface UserRepository extends CrudRepository<User, Long> {}

首先,我们将创建一个具有独特功能的界面。

public interface UserRepositoryCustom {
  public void executeSomeOperation(User user);
}

将原先存在的接口进行继承。

public interface UserRepository extends CrudRepository<User, Long>, UserRepositoryCustom {}

我会进一步制作实施方案。

public class UserRepostitoryImpl implements UserRepositoryCustom {
    public void executeSomeOperation(User user) {
       // なにか特別な処理
    }
}

我写得再详细一些。
使用 Custom 类来访问数据库。

考试

测试Repository接口。

我会使用HSQL数据库进行考试。

修改pom.xml

在您的项目中,将测试启动器、JDBC驱动程序和常用的JUnit作为依赖库添加进去。

2016/11/11的版本中,由于junit和hamcrest已经被包含在起始代码中,所以不再需要它们了。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>test</scope>
        </dependency>

创建一个用于测试的应用程序类

如果没有应用程序类,则创建一个。

package com.example;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@EnableJpaRepositories("com.example.repository")
public class TestApplication {

}

通常使用@SpringBootApplication就足够了,但由于存在单独的Repository类,所以添加@EnableJpaRepositories。

编写测试类

在注解中添加@RunWith,指定测试运行器。

我不明白@SpringBootTest和@Transactional在做什么。

2016/11/17 补充说明:@SpringBootTest和@Transactional是不必要的。只需添加@DataJpaTest即可。添加后,它将为我们输出SQL日志。

package com.example.repository;

import com.example.entity.User;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository instance;

    @Before
    public void setUp() {
       // 初期データの用意等
    }

    @Test
    public void testFindSomething() {
       // テストを書く
    }
}

请提供参考网址。

    • Spring Data JPA でのクエリー実装方法まとめ

 

    • 【Spring Data JPA】自動実装されるメソッドの命名ルール

 

    • Spring Data JPAリファレンスマニュアル

 

    • Spring Bootリファレンスマニュアル – JPA

Spring Data JPAソースコードレポジトリ

org.springframework.data.repository.query.parser.PartTree.java

Spring Frameworkリファレンスマニュアル – 統合テスト
Testing improvements in Spring Boot 1.4

广告
将在 10 秒后关闭
bannerAds