個人博客:蘭陵笑笑生,歡迎瀏覽博客!java
上一章 SpringBoot入門實踐(六)-JSR實現請求參數的驗證當中,咱們介紹瞭如何在項目中優雅的使用JSR實現請求參數的驗證,本章將使用 Spring Data JPA來進行數據庫的訪問。mysql
Sping DATA JPA 中提供了主要的功能,第一個功能是對Repository的抽象,第二個功能是用於跟蹤實體類的基本審計信息的監聽,什麼叫基本審計信息,就是實體中當中經常使用的5個字段 version、 createDate、 createBy 、lastModifiedBy、 lastModifiedDate,spring date jpa 可以根據實際的要求自動更新這個5個字段。spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
Repository是spring Data的主要的一個抽象概念,它是spring-data-commons 項目中的接口,CrudRepository也是spring-data-commons 項目中的接口,可是擴展了Repository的接口,CrudRepository定義了經常使用的方法。保存,查詢、根據ID刪除等。以下圖,sql
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
## 數據庫設置 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
create:無論以前是否有數據庫,都刪除從新建立
update: 若是有變化就更新,好比一個我將字段對應的數據庫列名修改了,那麼在啓動項目後,數據庫會寶妞原來的字段,可是會新增一個字段。這個是一個重用的配置
編寫一個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接口,目的獲取當前的用戶名稱,用於在更新實體時候,從這類獲取到用戶名稱等,當程序調用CrudRepository的save方法時,會從下面的方法getCurrentAuditor中獲取當前的用戶信息。
實現保存信息時自動更新信息的建立人和修改人。
import java.util.Optional; @Configuration public class AuditorAwareBean implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { return Optional.of("admin"); } }
建立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); } }
@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(); }
除了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) ; }
在實際的開發中JPA的操做對單表的操做很是的方便,固然JPA同時支持多表的關聯查詢,可是在項目的迭代過程當中,多表的操做我都會使用springBoot+Mybatis,由於Mybatis能夠在xml中定製化XML,並且隨着項目的迭代,查詢的需求不斷的變化,xml方式的sql其實更容易去維護。更好的方法時集合mybatis和JPA 根據需求選擇。
本章內容簡單介紹了Spring Boot中如何使用JPA實現數據的訪問操做,關於更詳細的JPA的操做,能夠在本章內容不詳細展開,後續文章會繼續講解。
以上就是本期的分享,你還能夠關注本博客的#Spring Boot入門實踐系列!#
本文由博客一文多發平臺 OpenWrite 發佈!
個人博客地址蘭陵笑笑生,歡迎瀏覽!