【快學springboot】7.使用Spring Boot Jpa

jpa簡介

Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化規範。它爲 Java 開發人員提供了一種對象/關聯映射工具來管理 Java 應用中的關係數據。它的出現主要是爲了簡化現有的持久化開發工做和整合 ORM 技術。值得注意的是,JPA只是一套規範,不是具體的實現。Java很喜歡本身去定義規範,而後讓廠商本身去實現,好比JMS等。java

Spring Data JPA

Spring Data JPA是 Spring 基於 ORM(hibernate) 框架、Jpa 規範的基礎上封裝的一套 Jpa 應用框架,按照約定好的【方法命名規則】寫數據庫(DAO)層接口,就能夠在不寫接口實現的狀況下,實現對數據庫的訪問和操做。同時提供了不少除了CRUD以外的功能,如分頁、排序、複雜查詢等等。mysql

springboot整合JPA

  • maven依賴
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-starter</artifactId>
 <version>1.1.10</version>
</dependency>
複製代碼

這裏我引入了阿里巴巴的druid數據庫鏈接池。spring

在application.properties配置數據庫鏈接

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
複製代碼

這裏基本是固定的寫法了,不一樣的是,這裏的數據庫鏈接池我使用了阿里巴巴的鏈接池。sql

在application.properties配置spring data jpa一些信息

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
複製代碼

spring.jpa.database-platform主要是指定生成表名的存儲引擎爲 InnoDBD數據庫

show-sql 是否打印出自動生成的 SQL,方便調試的時候查看springboot

spring.jpa.hibernate.ddl-auto參數的做用主要用於:自動建立更新驗證數據庫表結構,有五個值bash

  1. create: 每次加載 hibernate 時都會刪除上一次的生成的表,而後根據你的 model 類再從新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是致使數據庫表數據丟失的一個重要緣由。
  2. create-drop :每次加載 hibernate 時根據 model 類生成表,可是 sessionFactory 一關閉,表就自動刪除。
  3. update:最經常使用的屬性,第一次加載 hibernate 時根據 model 類會自動創建起表的結構(前提是先創建好數據庫),之後加載 hibernate 時根據 model 類自動更新表結構,即便表結構改變了但表中的行仍然存在不會刪除之前的行。要注意的是當部署到服務器後,表結構是不會被立刻創建起來的,是要等 應用第一次運行起來後纔會。
  4. validate :每次加載 hibernate 時,驗證建立數據庫表結構,只會和數據庫中的表進行比較,不會建立新表,可是會插入新值。
  5. none:什麼都不作

添加一個實體類UserEntity

@Entity
@Table(name = "user")
@Data
public class User {
 @Id
 @GeneratedValue(strategy = GenerationType.SEQUENCE)
 private Integer id;
 @Column(name = "username", unique = true, nullable = true, length = 50)
 private String username;
 private String password;
}
複製代碼

可使用Column註解來定義一些數據庫表結構的東西,若是不使用,會自動使用駝峯的命名規則映射默認值。服務器

啓動springboot項目,自動生成數據庫表

【快學springboot】7.使用Spring Boot Jpa

這裏生成了User表,能夠看下它的表結構:session

【快學springboot】7.使用Spring Boot Jpa

這裏還生成了一個hibernate_sequence表:app

【快學springboot】7.使用Spring Boot Jpa

主要是由於我設置了主鍵的值策略爲GenerationType.SEQUENCE,它是根據這個表來實現自增的。

添加一個UserRepo接口

public interface UserRepo extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
 
}
複製代碼

這裏繼承了PagingAndSortingRepository和JpaSpecificationExecutor兩個接口,前者幫咱們實現了CRUD、排序和分頁等簡單查詢,後者是用來構造一些比較複雜的查詢用的。

UserRepo默認給咱們提供的方法

userRepo.findById(1);
userRepo.findAll();
userRepo.findAll(PageRequest.of(0, 10));
userRepo.deleteById(1);
User user = new User();
userRepo.save(user);
複製代碼

這裏是基礎的CRUD的使用方法了。須要注意的是,修改實體的話,是根據save方法來判斷的,若是save的實體是從數據庫裏查出來的,save的時候就是修改。

自定義查詢方法

User findUserByUsername(String username);
User findUserByUsernameAndPassword(String username,String password);
複製代碼

spring data jpa有一套映射到sql查詢的方法命名規則。整理以下:

【快學springboot】7.使用Spring Boot Jpa

【快學springboot】7.使用Spring Boot Jpa

【快學springboot】7.使用Spring Boot Jpa

使用這些提供的查詢方法,基本上能夠應付咱們須要的單表查詢了。

分頁查詢

Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);
複製代碼

可使用PageRequest.of(0, 10)來構建一個pageable。須要注意的是,這裏分頁從0開始。

自定義SQL查詢

在UserRepo上,自定義方法。在 SQL 的方法上面使用@Query註解來寫SQL,如涉及到刪除和修改在須要加上@Modifying.也能夠根據須要添加 @Transactional對事物的支持

@Transactional
@Modifying
@Query("update User u set u.username= ?1 where u.id = ?2")
int modifyByIdAndUserId(String username, Integer id);
 
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
複製代碼
相關文章
相關標籤/搜索