Spring Boot整合Spring Data JPA操作数据
一、 Sping Data JPA 簡介
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規范的基礎上封裝的一套 JPA 應用框架,底層使用了 Hibernate 的 JPA 技術實現,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易于擴展!學習并使用 Spring Data JPA 可以極大提高開發效率!
二、 將Spring Data JPA集成到Spring Boot
第一步:引入maven依賴包,包括Spring Data JPA和Mysql的驅動
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
第二步:修改application.yml,配置好數據庫連接和jpa的相關配置
spring:datasource:url: jdbc:mysql://192.168.1.91:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: testpassword: 4rfv$RFVdriver-class-name: com.mysql.jdbc.Driverjpa:hibernate:ddl-auto: updatedatabase: mysqlshow-sql: true
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動根據實體類的定義創建、更新、驗證數據庫表結構。該參數的幾種配置如下:
- create:每次加載hibernate時都會刪除上一次的生成的表,然后根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因。
- create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
- update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以后加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到服務器后,表結構是不會被馬上建立起來的,是要等應用第一次運行起來后才會。
- validate:每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。
三、 基礎核心用法
我們來實現一個簡單的使用JPA操作數據庫的例子。
3.1.實體Model類
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="article")
public class Article {@Id@GeneratedValueprivate Long id;@Column(nullable = false,length = 32)private String author;@Column(nullable = false, unique = true,length = 32)private String title;@Column(length = 512)private String content;private Date createTime;
}
- @Entity 表示這個類是一個實體類,接受JPA控制管理,對應數據庫中的一個表
- @Table 指定這個類對應數據庫中的表名。如果這個類名和數據庫表名符合駝峰及下劃線規則,可以省略這個注解。如FlowType類名對應表名flow_type。
- @Id 指定這個字段為表的主鍵
- @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主鍵的生成方式,一般主鍵為自增的話,就采用GenerationType.IDENTITY的生成方式
- @Column 注解針對一個字段,對應表中的一列。nullable = false表示數據庫字段不能為空, unique = true表示數據庫字段不能有重復值,length = 32表示數據庫字段最大程度為32.
關于更多注解的詳細用法,請參考: Hibernate Annotations 參考文檔
3.2.數據操作接口
public interface ArticleRepository extends JpaRepository<Article,Long> {
}
XxxRepository繼承 JpaRepository<T,ID>為我們提供了各種針對單表的數據操作方法:增刪改查。只要你不是完全英語小白,通過調用接口的方法名稱就能知道方法是做什么操作的。
3.3.service層接口:
public interface ArticleRestService {ArticleVO saveArticle(ArticleVO article);void deleteArticle(Long id);void updateArticle(ArticleVO article);ArticleVO getArticle(Long id);List<ArticleVO> getAll();
}
3.4.service層接口實現
@Service
public class ArticleJPARestService implements ArticleRestService {//將JPA倉庫對象注入@Resourceprivate ArticleRepository articleRepository;@Resourceprivate Mapper dozerMapper;public ArticleVO saveArticle( ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO); //保存一個對象到數據庫,insertreturn article;}@Overridepublic void deleteArticle(Long id) {articleRepository.deleteById(id); //根據id刪除1條數據庫記錄}@Overridepublic void updateArticle(ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO); //更新一個對象到數據庫,仍然使用save方法}@Overridepublic ArticleVO getArticle(Long id) {Optional<Article> article = articleRepository.findById(id); //根據id查找一條數據return dozerMapper.map(article.get(),ArticleVO.class);}@Overridepublic List<ArticleVO> getAll() {List<Article> articleLis = articleRepository.findAll(); //查詢article表的所有數據return DozerUtils.mapList(articleLis,ArticleVO.class);}
}
注意:雖然新增和修改都是使用的save方法,但是完成的功能是不一樣的。當保存的對象有主鍵id的時候,save方法會根據id更新記錄;當保存的對象沒有主鍵id的時候,save方法會向數據庫里面insert一條記錄。
然后大家可以在控制層調用一下service層方法,用postman測試一下.
四、關鍵字查詢接口
除了上文中JpaRepository為我們提供的增刪改查的方法。我們還可以自定義方法,非常簡單。把下面的方法名放到ArticleRepository 里面,它就自動為我們實現了通過author字段查找article表的所有數據。也就是說,我們使用了find(查找)關鍵字,JPA就自動將方法名為我們解析成數據庫操作,太智能了。
//注意這個方法的名稱,jPA會根據方法名自動生成SQL執行Article findByAuthor(String author);
其他具體的關鍵字,使用方法和生產成 SQL 如下表所示
| Keyword | Sample | JPQL snippet |
|---|---|---|
| And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
| Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
| Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
| Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
| LessThan | findByAgeLessThan | … where x.age < ?1 |
| LessThanEqual | findByAgeLessThanEqual | … where x.age ? ?1 |
| GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
| GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
| After | findByStartDateAfter | … where x.startDate > ?1 |
| Before | findByStartDateBefore | … where x.startDate < ?1 |
| IsNull | findByAgeIsNull | … where x.age is null |
| IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
| Like | findByFirstnameLike | … where x.firstname like ?1 |
| NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
| StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
| EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
| Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
| OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
| Not | findByLastnameNot | … where x.lastname <> ?1 |
| In | findByAgeIn(Collection ages) | … where x.age in ?1 |
| NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
| TRUE | findByActiveTrue() | … where x.active = true |
| FALSE | findByActiveFalse() | … where x.active = false |
| IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
可以看到我們這里沒有任何類SQL語句就完成了兩個條件查詢方法。這就是Spring-data-jpa的一大特性:通過解析方法名創建查詢。針對單表的數據查詢簡單到令人發指,怎么可以這么簡單,照這個趨勢發展,程序員早晚失業。
五、測試關鍵字查詢
@RunWith(SpringRunner.class)
@SpringBootTest
public class JPAKeyWordTest {@Resourceprivate ArticleRepository articleRepository;@Testpublic void userTest() {Article article = articleRepository.findByAuthor("54188");System.out.println(article);}}
六、其他
Spring-data-jpa的能力遠不止本文提到的這些,由于本文主要以整合介紹為主,對于Spring-data-jpa的使用只是介紹了常見的使用方式。
總結
以上是生活随笔為你收集整理的Spring Boot整合Spring Data JPA操作数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javabean实体类与实体类之间的快速
- 下一篇: html+spring boot简单的a