Spring Boot 之Spring data JPA簡介

PA的全稱是Java Persistence API (JPA),他是一個存儲API的標準,而Spring data JPA就是對JPA的一種實現,可以讓我們方便的對數據進行存取。按照約定好的方法命名規則寫dao層接口,從而在不實現接口的情況下,實現對數據庫的訪問和操作。同時提供了很多除了CRUD之外的功能,如分頁、排序、複雜查詢等等。

Spring data JPA可以看做是對Hibernate的二次封裝。本文將會以一個具體的例子來講解,怎麼在Spring Boot中使用Spring data JPA。

添加依賴

我們要添加如下的Spring data JPA依賴,為了方便測試,我們添加一個h2的內存數據庫:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-jpa/<artifactid>
/<dependency>

<dependency>
<groupid>com.h2database/<groupid>
<artifactid>h2/<artifactid>
<scope>runtime/<scope>
/<dependency>
/<code>

添加entity bean

我們來創建一個entity bean:

<code>@Entity
@Data
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(nullable = false, unique = true)
private String title;

@Column(nullable = false)
private String author;
}
/<code>

創建 Dao

<code>public interface BookRepository extends JpaRepository<book> { 

List<book> findByTitle(String title);

@Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")
Book retrieveByTitle(@Param("title") String title);
}
/<book>/<book>/<code>

所有的Dao都需要繼承Repository接口,Repository是一個空的接口:

<code>@Indexed
public interface Repository {

}
/<code>

如果要使用默認的通用的一些實現,則可以繼承CrudRepository, PagingAndSortingRepository和JpaRepository。

上面的例子中我們繼承了JpaRepository。

上面的例子中我們創建了一個按Title查找的方法:

<code>List<book> findByTitle(String title);
/<book>/<code>

這個方法我們是不需要自己去實現的,Spring Data JPA會幫我們去實現。我們可以使用find…By, read…By, query…By, count…By,和 get…By的格式定義查詢語句,By後面接的就是Entity的屬性。除了And,我們還可以使用Or來拼接方法,下面我們再舉個例子:

<code>interface PersonRepository extends Repository<person> {

List<person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

// Enables the distinct flag for the query
List<person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);


// Enabling ignoring case for an individual property
List<person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

// Enabling static ORDER BY for a query
List<person> findByLastnameOrderByFirstnameAsc(String lastname);
List<person> findByLastnameOrderByFirstnameDesc(String lastname);
}
/<person>/<person>/<person>/<person>/<person>/<person>/<person>/<person>/<code>

當然,處理方法拼接外,我們還可以自定義sql查詢語句:

<code>    @Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")
Book retrieveByTitle(@Param("title") String title);
/<code>

自定義查詢語句給Spring data JPA提供了更大的想象空間。

Spring Data Configuration

要使用Spring Data JPA, 我們還需要在配置文件中指定要掃描的目錄,使用@EnableJpaRepositories註解來實現:

<code>@Configuration
@EnableJpaRepositories(basePackages = "com.flydean.repository")
public class PersistenceConfig {
}
/<code>

我們還需要在配置文件中指定數據源的屬性:

<code>spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
/<code>

測試

有了上面的一切,我們就可以測試我們的數據源了:

<code>@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {JpaApp.class})
public class BookRepositoryTest {

@Autowired
private BookRepository bookRepository;

@Test
@Transactional(readOnly=false)
public void testBookRepository(){
Book book = new Book();
book.setTitle(randomAlphabetic(10));
book.setAuthor(randomAlphabetic(15));

bookRepository.save(book);

bookRepository.findByTitle(book.getTitle()).forEach(e -> log.info(e.toString()));
log.info(bookRepository.retrieveByTitle(book.getTitle()).toString());
}
}
/<code>

更多內容請訪問:flydean的博客 flydean.com


Spring Boot 之Spring data JPA簡介


分享到:


相關文章: