SpringBoot使用Spring Data JPA 操作 postgreSQL数据库

什么是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 的步骤如下:

  1. 创建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>
  2. 数据库配置

 在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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章