什么是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