SpringBoot入門實(shí)踐(七)-Spring-Data-JPA實(shí)現(xiàn)數(shù)據(jù)訪問

?我的博客:蘭陵笑笑生,歡迎瀏覽博客薄货!

?上一章 SpringBoot入門實(shí)踐(六)-JSR實(shí)現(xiàn)請求參數(shù)的驗(yàn)證當(dāng)中,我們介紹了如何在項(xiàng)目中優(yōu)雅的使用JSR實(shí)現(xiàn)請求參數(shù)的驗(yàn)證况褪,本章將使用 Spring Data JPA來進(jìn)行數(shù)據(jù)庫的訪問。

前言

?Sping DATA JPA 中提供了主要的功能,第一個功能是對Repository的抽象域滥,第二個功能是用于跟蹤實(shí)體類的基本審計信息的監(jiān)聽,什么叫基本審計信息蜈抓,就是實(shí)體中當(dāng)中常用的5個字段 version启绰、 createDate、 createBy 沟使、lastModifiedBy委可、 lastModifiedDate,spring date jpa 能夠根據(jù)實(shí)際的要求自動更新這個5個字段腊嗡。

一着倾、添加 Spring Data JPA的庫的依賴

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

二、Repository抽象與CrudRepository

?Repository是spring Data的主要的一個抽象概念燕少,它是spring-data-commons 項(xiàng)目中的接口卡者,CrudRepository也是spring-data-commons 項(xiàng)目中的接口,但是擴(kuò)展了Repository的接口客们,CrudRepository定義了常用的方法崇决。保存,查詢底挫、根據(jù)ID刪除等押桃。如下圖鹰霍,

file

三独柑、快速實(shí)現(xiàn):

  • 1春缕、定義實(shí)體類

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: 表示是一個實(shí)體 
* @Table: 當(dāng)項(xiàng)目啟動時,可以創(chuàng)建對應(yīng)的表涝缝,默認(rèn)是實(shí)體的英文小寫
* @Id: 如果沒有@Id注解 項(xiàng)目啟動會報錯 
* @EntityListeners:5個常用字段的更新 */

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "t_singer")
public class Singer {  
    
/**    
*@GeneratedValue 主鍵的生成策略 序列 默認(rèn)是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時間的格式   
* 默認(rèn):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;


.....

}


  • 2扑庞、注解介紹:

  • @Entity:標(biāo)識這是一個JPA的實(shí)體譬重,當(dāng)項(xiàng)目啟動時會更具這個實(shí)體創(chuàng)建相應(yīng)的表

  • @GeneratedValue(strategy = GenerationType.SEQUENCE) 主鍵自動增長拒逮,默認(rèn)是AUTO罐氨,ORACLE和PostgreSQL可以改成SEQUENCE序列

  • @Table(name = "t_singer"):相應(yīng)表的表名,默認(rèn)是實(shí)體名英文小寫滩援;

  • @EntityListeners(AuditingEntityListener.class):

    用來開啟自動更新實(shí)體的5個字段栅隐,分別是

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

注意: 要確保字段能夠自動更新在主類上添加@EnableJpaAuditingpublic注解

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

@Column(name = "fist_name") :對應(yīng)數(shù)據(jù)庫的字段玩徊,默認(rèn)是java的字段名稱租悄,可以指定為數(shù)據(jù)庫指定的字段。

當(dāng)然還可以約定字段的長度和類型

@Version @CreatedDate @CreatedBy @LastModifiedBy @LastModifiedDate :用來標(biāo)記常用的五個字段

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

  • TemporalType.TIMESTAMP 2020-01-12 14:59:56.941 恩袱,默認(rèn)的方式
  • TemporalType.DATE:2020-01-12
  • TemporalType.TIME: 15:04:27.188
  • TemporalType.TIMESTAMP 2020-01-12 15:05:25.758
  • 3泣棋、關(guān)于JPA的配置和數(shù)據(jù)庫的配置

## 數(shù)據(jù)庫設(shè)置
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  項(xiàng)目啟動時會將數(shù)據(jù)庫的表刪除,并重新創(chuàng)建,導(dǎo)致數(shù)據(jù)丟失   
       #update     
         ddl-auto: update   
     properties:    
        hibernate:       
       #方言:我這里使用的是PostgreSQL 畔塔,當(dāng)然也可以使用mysql 等其他的數(shù)據(jù)庫       
        dialect:  org.hibernate.dialect.PostgreSQL9Dialect     
        temp:        
          use_jdbc_metadata_defaults : false

ddl-auto: 對數(shù)據(jù)庫表操作的方式:

  • create:不管之前是否有數(shù)據(jù)庫潭辈,都刪除重新創(chuàng)建
  • update: 如果有變化就更新,比如一個我將字段對應(yīng)的數(shù)據(jù)庫列名修改了澈吨,那么在啟動項(xiàng)目后把敢,數(shù)據(jù)庫會寶妞原來的字段,但是會新增一個字段谅辣。這個是一個重用的配置
  • 4修赞、編寫DAO層;

?編寫一個SingerRepository接口繼承CrudRepository 接口桑阶, CrudRepository默認(rèn)實(shí)現(xiàn)了保存柏副、刪除等方法,這里編寫一個根據(jù)自定義的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 當(dāng)前查詢的主體
    */ 
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);

    
    
    .....
}

實(shí)體的創(chuàng)建人和更新人輸入

  • 5蚣录、配置AuditorAware

    實(shí)現(xiàn)AuditorAware接口搓扯,目的獲取當(dāng)前的用戶名稱,用于在更新實(shí)體時候包归,從這類獲取到用戶名稱等锨推,當(dāng)程序調(diào)用CrudRepository的save方法時,會從下面的方法getCurrentAuditor中獲取當(dāng)前的用戶信息公壤。

    實(shí)現(xiàn)保存信息時自動更新信息的創(chuàng)建人和修改人换可。

import java.util.Optional;

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

?創(chuàng)建SingerServiceImpl組件厦幅,調(diào)用singerRepository中的方法:實(shí)現(xiàn)保存沾鳄、刪除和查詢等功能,在Controller層調(diào)用SingerService的方法确憨,就可以實(shí)現(xiàn)查詢了译荞;

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;   
    
     /**  
    * 調(diào)用自定義方法查詢  
    * @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); 
    }
}
  • 7瓤的、編寫Controller層:通過POSTman就可以實(shí)現(xiàn)查詢了

@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();   
    }

四、JpaRepository

?除了CrudRepository接口之外吞歼,Spring JAP還提供JpaRepository接口圈膏,該接口提供批處理、分頁篙骡、排序等操作稽坤。JpaRepository接口擴(kuò)展了CrudRepository,因此糯俗,該接口提供了CrudRepository接口所有功能的實(shí)現(xiàn)尿褪,可以直接將CrudRepository換成JpaRepository,程序照樣可以運(yùn)行得湘,當(dāng)然我們可以更具應(yīng)用程序的復(fù)雜性選擇使用不同的接口杖玲。如下圖,

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)
      ;
}

五淘正、總結(jié)

?在實(shí)際的開發(fā)中JPA的操作對單表的操作非常的方便摆马,當(dāng)然JPA同時支持多表的關(guān)聯(lián)查詢,但是在項(xiàng)目的迭代過程中跪帝,多表的操作我都會使用springBoot+Mybatis今膊,因?yàn)镸ybatis可以在xml中定制化XML,而且隨著項(xiàng)目的迭代伞剑,查詢的需求不斷的變化斑唬,xml方式的sql其實(shí)更容易去維護(hù)。更好的方法時集合mybatis和JPA 根據(jù)需求選擇黎泣。

?本章內(nèi)容簡單介紹了Spring Boot中如何使用JPA實(shí)現(xiàn)數(shù)據(jù)的訪問操作恕刘,關(guān)于更詳細(xì)的JPA的操作,可以在本章內(nèi)容不詳細(xì)展開抒倚,后續(xù)文章會繼續(xù)講解褐着。

?以上就是本期的分享,你還可以關(guān)注本博客的#Spring Boot入門實(shí)踐系列!#

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布托呕!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末含蓉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子项郊,更是在濱河造成了極大的恐慌馅扣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件着降,死亡現(xiàn)場離奇詭異差油,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)任洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蓄喇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來发侵,“玉大人,你說我怎么就攤上這事妆偏∪婿” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵楼眷,是天一觀的道長铲汪。 經(jīng)常有香客問我熊尉,道長罐柳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任狰住,我火速辦了婚禮张吉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘催植。我一直安慰自己肮蛹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布创南。 她就那樣靜靜地躺著伦忠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稿辙。 梳的紋絲不亂的頭發(fā)上昆码,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音邻储,去河邊找鬼赋咽。 笑死,一個胖子當(dāng)著我的面吹牛吨娜,可吹牛的內(nèi)容都是我干的脓匿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼宦赠,長吁一口氣:“原來是場噩夢啊……” “哼陪毡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勾扭,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤毡琉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尺借,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊起,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年燎斩,在試婚紗的時候發(fā)現(xiàn)自己被綠了虱歪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜂绎。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笋鄙,靈堂內(nèi)的尸體忽然破棺而出师枣,到底是詐尸還是另有隱情,我是刑警寧澤萧落,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布践美,位于F島的核電站,受9級特大地震影響找岖,放射性物質(zhì)發(fā)生泄漏陨倡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一许布、第九天 我趴在偏房一處隱蔽的房頂上張望兴革。 院中可真熱鬧,春花似錦蜜唾、人聲如沸杂曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擎勘。三九已至,卻和暖如春颖榜,著一層夾襖步出監(jiān)牢的瞬間棚饵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工朱转, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟹地,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓藤为,卻偏偏與公主長得像怪与,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缅疟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容