SpringBoot入門實踐(七)-Spring-Data-JPA實現數據訪問

 個人博客:蘭陵笑笑生,歡迎瀏覽博客!java

 上一章 SpringBoot入門實踐(六)-JSR實現請求參數的驗證當中,咱們介紹瞭如何在項目中優雅的使用JSR實現請求參數的驗證,本章將使用 Spring Data JPA來進行數據庫的訪問。mysql

前言

 Sping DATA JPA 中提供了主要的功能,第一個功能是對Repository的抽象,第二個功能是用於跟蹤實體類的基本審計信息的監聽,什麼叫基本審計信息,就是實體中當中經常使用的5個字段 version、 createDate、 createBy 、lastModifiedBy、 lastModifiedDate,spring date jpa 可以根據實際的要求自動更新這個5個字段。spring

1、添加 Spring Data JPA的庫的依賴

<dependency>    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2、Repository抽象與CrudRepository

 Repository是spring Data的主要的一個抽象概念,它是spring-data-commons 項目中的接口,CrudRepository也是spring-data-commons 項目中的接口,可是擴展了Repository的接口,CrudRepository定義了經常使用的方法。保存,查詢、根據ID刪除等。以下圖,sql

file

3、快速實現:

  • 一、定義實體類

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;import java.util.Date;

/**
*@Entity: 表示是一個實體 
* @Table: 當項目啓動時,能夠建立對應的表,默認是實體的英文小寫
* @Id: 若是沒有@Id註解 項目啓動會報錯 
* @EntityListeners:5個經常使用字段的更新 */

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "t_singer")
public class Singer {  
    
/**    
*@GeneratedValue 主鍵的生成策略 序列 默認是AUTO    
*/  
@Id    
@GeneratedValue(strategy = GenerationType.SEQUENCE)      
@Column(name = "singerId")   
private Long singerId;   
    
@Column(name = "fist_name")    
@NotNull(message = "名稱不能爲空")   
@Size(min = 2, max = 5)   
private String fistName;  
    
@Column(name = "LAST_NAME") 
private String lastName;  
    
@Phone  
private String phone;  
    
@Version   
@Column(name = "version")
private int version;   
    
    
/**Temporal時間的格式   
* 默認:2020-01-12 14:59:56.941   
*TemporalType.DATE:2020-01-12  
*TemporalType.TIME: 15:04:27.188     
* TemporalType.TIMESTAMP 2020-01-12 15:05:25.758   
*/   
@CreatedDate  
@Temporal(TemporalType.DATE)  
private Date createDate; 

@CreatedBy  
private String createBy; 
    
@LastModifiedBy    
private String lastModifiedBy;  
    
@LastModifiedDate  
private Date lastModifiedDate;


.....

}
  • 二、註解介紹:

  • @Entity:標識這是一個JPA的實體,當項目啓動時會更具這個實體建立相應的表數據庫

  • @GeneratedValue(strategy = GenerationType.SEQUENCE) 主鍵自動增加,默認是AUTO,ORACLE和PostgreSQL能夠改爲SEQUENCE序列mybatis

  • @Table(name = "t_singer"):相應表的表名,默認是實體名英文小寫;app

  • @EntityListeners(AuditingEntityListener.class):dom

    用來開啓自動更新實體的5個字段,分別是ide

private int version;   
private Date createDate;
private String createBy; 
private String lastModifiedBy;  
private Date lastModifiedDate;

注意: 要確保字段可以自動更新在主類上添加@EnableJpaAuditingpublic註解spring-boot

@SpringBootApplication
@EnableJpaAuditing
public class Chapter2Application {  
    public static void main(String[] args) { 
        SpringApplication.run(Chapter2Application.class, args);  
    }
}

@Column(name = "fist_name") :對應數據庫的字段,默認是java的字段名稱,能夠指定爲數據庫指定的字段。

固然還能夠約定字段的長度和類型

@Version @CreatedDate @CreatedBy @LastModifiedBy @LastModifiedDate :用來標記經常使用的五個字段

@Temporal(TemporalType.DATE) :時間的格式

  • TemporalType.TIMESTAMP 2020-01-12 14:59:56.941 ,默認的方式

  • TemporalType.DATE:2020-01-12

  • TemporalType.TIME: 15:04:27.188

  • TemporalType.TIMESTAMP 2020-01-12 15:05:25.758

  • 三、關於JPA的配置和數據庫的配置

## 數據庫設置
spring: 
    datasource: 
    username: postgres  
    password: 123456    
    url: jdbc:postgresql://localhost:5432/test  
    driver-class-name:  org.postgresql.Driver  
   jpa:   
     database : postgresql  
     show-sql: true   
     hibernate:  
      #create  項目啓動時會將數據庫的表刪除,並從新建立,致使數據丟失   
       #update     
         ddl-auto: update   
     properties:    
        hibernate:       
       #方言:我這裏使用的是PostgreSQL ,固然也可使用mysql 等其餘的數據庫       
        dialect:  org.hibernate.dialect.PostgreSQL9Dialect     
        temp:        
          use_jdbc_metadata_defaults : false

ddl-auto: 對數據庫表操做的方式:

  • create:無論以前是否有數據庫,都刪除從新建立

  • update: 若是有變化就更新,好比一個我將字段對應的數據庫列名修改了,那麼在啓動項目後,數據庫會寶妞原來的字段,可是會新增一個字段。這個是一個重用的配置

  • 四、編寫DAO層;

 編寫一個SingerRepository接口繼承CrudRepository 接口, CrudRepository默認實現了保存、刪除等方法,這裏編寫一個根據自定義的sql查詢的方法:

package com.miroservice.chapter2.repository;
import com.miroservice.chapter2.pojo.Singer;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
 /**  
    *   Singer 當前查詢的主體
    */ 
public interface SingerRepository extends CrudRepository<Singer, Long> {   
    /**  
    * 查詢  
    * @param fistName  
    * @return    
    */   
    @Query(value = " select * from t_singer where fist_name=:fistName",
           nativeQuery = true)   
    List<Singer> findByFistName(String fistName);

    
    
    .....
}

實體的建立人和更新人輸入

  • 五、配置AuditorAware

    實現AuditorAware接口,目的獲取當前的用戶名稱,用於在更新實體時候,從這類獲取到用戶名稱等,當程序調用CrudRepository的save方法時,會從下面的方法getCurrentAuditor中獲取當前的用戶信息。

    實現保存信息時自動更新信息的建立人和修改人。

import java.util.Optional;

@Configuration
public class AuditorAwareBean implements AuditorAware<String> {   
   @Override    
   public Optional<String> getCurrentAuditor() {     
      return Optional.of("admin");      
     }
}
  • 六、編寫service層:

 建立SingerServiceImpl組件,調用singerRepository中的方法:實現保存、刪除和查詢等功能,在Controller層調用SingerService的方法,就能夠實現查詢了;

import com.miroservice.chapter2.pojo.Singer;
import com.miroservice.chapter2.repository.SingerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class SingerServiceImpl implements SingerService {  
    @Autowired   
    SingerRepository singerRepository;   
    
     /**  
    * 調用自定義方法查詢  
    * @param fistName  
    * @return    
    */ 
    @Override    
    public List<Singer> findByFistName(String fistName) {  
        
        return singerRepository.findByFistName(fistName);  
    }  
     /**  
    * 保存歌手 
    * @param fistName  
    * @return    
    */ 
    @Override   
    public void save(Singer singer) {    
        singerRepository.save(singer);  
    }   
     /**  
    * 刪除歌手 
    * @param fistName  
    * @return    
    */ 
    
    @Override  
    public void delete(Long id) {    
        singerRepository.deleteById(id); 
    }
}
  • 七、編寫Controller層:經過POSTman就能夠實現查詢了

@RestController
public class SingerController {    
    @Autowired    
    SingerService singerService;  
    
    
    @GetMapping("/get")    
    private HttpResponse get(@RequestParam("fistName") String fistName) {      
        return HttpResponse.ok().setData(singerService.findByFistName(fistName)); 
    }    
    
    @PostMapping("/save")   
    private HttpResponse add(@Valid @RequestBody Singer singer) {   
        singerService.save(singer);       
        return HttpResponse.ok();   
    }    
    
    @GetMapping("/delete/{id}") 
    private HttpResponse delete(@PathVariable Long id) {  
        singerService.delete(id);      
        return HttpResponse.ok();   
    }

4、JpaRepository

 除了CrudRepository接口以外,Spring JAP還提供JpaRepository接口,該接口提供批處理、分頁、排序等操做。JpaRepository接口擴展了CrudRepository,所以,該接口提供了CrudRepository接口全部功能的實現,能夠直接將CrudRepository換成JpaRepository,程序照樣能夠運行,固然咱們能夠更具應用程序的複雜性選擇使用不一樣的接口。以下圖,

import com.miroservice.chapter2.pojo.Singer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface SingerRepository extends JpaRepository<Singer, Long> { 
    /**   
    *     
    * @param fistName   
    * @return   
    */  
    @Query(value = " select * from t_singer where fist_name=:fistName",
           nativeQuery = true)  
    List<Singer> findByFistName(String fistName)
      ;
}

5、總結

 在實際的開發中JPA的操做對單表的操做很是的方便,固然JPA同時支持多表的關聯查詢,可是在項目的迭代過程當中,多表的操做我都會使用springBoot+Mybatis,由於Mybatis能夠在xml中定製化XML,並且隨着項目的迭代,查詢的需求不斷的變化,xml方式的sql其實更容易去維護。更好的方法時集合mybatis和JPA 根據需求選擇。

 本章內容簡單介紹了Spring Boot中如何使用JPA實現數據的訪問操做,關於更詳細的JPA的操做,能夠在本章內容不詳細展開,後續文章會繼續講解。

 以上就是本期的分享,你還能夠關注本博客的#Spring Boot入門實踐系列!#

本文由博客一文多發平臺 OpenWrite 發佈!

個人博客地址蘭陵笑笑生,歡迎瀏覽!

相關文章
相關標籤/搜索