什麼是JPA
JPA(Java Persistence API) 和 Spring Data 是兩個範疇的概念。
想必大家都有聽過Hibernate框架。Hibernate是一個ORM框架,而JPA則是一種ORM規範,JPA和Hibernate的關係就像JDBC與JDBC驅動的關係,即JPA制定了ORM規範,而Hibernate是這些規範的實現。
Spring Data 是Spring的一個子項目,不僅支持關係型數據庫,也支持非關係型數據庫。
SpringBoot 整合Spring Data JPA 的步驟如下:
- 創建SpringBoot項目,添加PostgreSQL和Spring Data JPA 的
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>
- 數據庫配置
在application.properties文件中配置數據庫基本信息以及JPA相關配置:
#數據庫基本信息配置
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.show-sql=true
#JPA相關配置
spring.jpa.database=postgresql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
3.創建實體類
@Data
@Entity(name = "t_book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "book_name",nullable = false)
private String name;
private String author;
private Double price;
@Transient
private String description;
}
- @Entity註解表示該類是一個實體類,表的名稱爲註解中name的值,如果不配置name,表名默認爲類名。
- 所有的實體類都要有主鍵,@Id註解表示該屬性是一個主鍵,@GeneratedValue註解表示主鍵自動生成,strategy表示主鍵生成策略。
- 默認情況下,生成的表中字段的名稱就是實體類中屬性的名稱,通過@Column註解可以定製生成的字段屬性,name表示該屬性對應的數據表中字段的名稱,nullable表示該字段非空。
- @Transient註解表示在生成數據庫中的表時,該屬性可以忽略,即不生成對應的字段。
4. 創建Repository接口
@Repository
public interface BookRepository extends JpaRepository<Book,Integer> {
List<Book> getBooksByAuthorStartingWith(String author);
List<Book> getBooksByPriceGreaterThan(Double price);
@Query(value = "select * from t_book where id > :id and author = :author",nativeQuery = true)
List<Book> getBookByIdAndAuthor(@Param("author") String author, @Param("id") Integer id);
@Query("select b from t_book b where b.id < ?2 and b.name like %?1%")
List<Book> getBooksByIdAndName(String name,Integer id);
}
- 自定義BookRepository繼承自JpaRepository。JpaRepository中提供看一些基本的數據操作方法,有基本的增刪改查、分頁查詢、排序查詢等。
- 既定的方法命名規則不一定滿足所有的開發需求,因此Spring Data JPA 也支持自定義JPQL(Java Persistance Query Language)或者原生SQL。nativeQuery=true表示使用原生的SQL查詢
- 最後一個方法使用自定義JPQL,這裏使用的列名是屬性的名稱而不是數據庫中列的名稱。
5.創建BookService
@Service
public class BookServiceImpl implements BookService {
@Autowired
BookRepository bookRepository;
@Override
public void addBook(Book book) {
bookRepository.save(book);
}
@Override
public List<Book> getBookByIdAndAuthor(String author, Integer id) {
return bookRepository.getBookByIdAndAuthor(author,id);
}
@Override
public Page<Book> getBookByPage(Pageable pageable) {
return bookRepository.findAll(pageable);
}
}
6.創建Controller