SpringBoot整合Spring Data JPA
本篇要點
-
簡單介紹JPA。
-
介紹快速SpringBoot快速整合JPA
JPA是啥?
The Java Persistence API is a standard technology that lets you “map” objects to relational databases. The spring-boot-starter-data-jpa POM provides a quick way to get started.
- JPA是
The Java Persistence API
標準,Java持久層API,是一種能讓物件能夠快速對映到關係型資料庫的技術規範。 - JPA只是一種規範,它需要第三方自行實現其功能,在眾多框架中
Hibernate
是最為強大的一個。
Spring Data JPA
Spring Data JPA
是採用基於JPA規範的Hibernate
框架基礎下提供了Repository
層的實現。Spring Data Repository
極大地簡化了實現各種持久層的資料庫訪問而寫的樣板程式碼量,同時CrudRepository
提供了豐富的CRUD功能去管理實體類。SpringBoot框架為Spring Data JPA提供了整合,spring-boot-starter-data-jpa
- Hibernate:最流行的JPA實現之一。
- Spring Data JPA:幫助你去實現JPA-based repositories。
- Spring ORM:Spring Framework提供的核心ORM支援。
快速SpringBoot快速整合JPA
引入依賴
<!--SpringBoot對jpa的封裝--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--mysql驅動,8.x版本--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
配置yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8
username: root
password: 123456
hikari:
maximum-pool-size: 20
minimum-idle: 5
jpa:
#在建表的時候,將預設的儲存引擎切換為 InnoDB
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
# 配置在日誌中打印出執行的 SQL 語句資訊。
show-sql: true
# 配置指明在程式啟動的時候要刪除並且建立實體類對應的表。
hibernate:
ddl-auto: create #update
值得注意的是:spring.jpa.hibernate.ddl-auto
第一建表的時候可以create,指明在程式啟動的時候要刪除並且建立實體類對應的表。後續使用就需要改為update。
ddl-auto的幾種屬性值
- create:每次載入hibernate時都會刪除上一次的生成的表,再重新根據model生成表,因此可能會導致資料丟失。
- create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
- update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,原有資料不會清空,只會更新。
- validate :每次載入hibernate時,會校驗資料與資料庫的欄位型別是否相同,欄位不同會報錯。
實體類
JPA規範定義在javax.persistence
包下,注意導包的時候不要導錯。
@Entity(name = "t_user")
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@Transient
private String email;
}
-
@Entity標註保證實體能夠被SpringBoot掃描到,對應表名為
t_user
。 -
@Id表明id。
-
@GeneratedValue中標註主鍵生成策略。
-
@Transient表示不需要對映的欄位。
常見的主鍵生成策略
- TABLE: 使用一個特定的資料庫表格來儲存主鍵
- SEQUENCE: 根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。
- IDENTITY: 主鍵由資料庫自動生成(主要是支援自動增長的資料庫,如mysql)
- AUTO: 主鍵由程式控制,也是GenerationType的預設值。
啟動專案,生成表
首先在資料庫中建立jpa庫,庫名無所謂,和配置對應上就可以。
啟動專案,你會發現控制檯輸出日誌如下:
Hibernate: drop table if exists t_user
Hibernate: create table t_user
(id bigint not null auto_increment, password varchar(255), username varchar(255), primary key (id)) engine=InnoDB
此時我們配置的create效果已經顯現,我們之後將它改為update,不然每次啟動程式,資料表又得重建咯。
資料訪問層
Spring Data JPA repositories是你可以定義訪問資料的介面,JPA查詢是根據你的方法名稱自動建立的。
這裡我們編寫一個介面,繼承JpaRepository即可。User是物件名,不是表名,Long為主鍵的型別。
public interface UserDao extends JpaRepository<User, Long> {
/**
* 根據使用者名稱和密碼查詢使用者
*/
User findByUsernameAndPassword(String username, String password);
}
JPA預設支援常見的增刪改查,也支援findByUsernameAndPassword
這種以欄位命名的方法,對於更復雜的查詢,您可以使用Spring Data的Query註解對方法進行註解。
測試JPA
@SpringBootTest
class SpringBootJpaApplicationTests {
@Resource
UserDao userDao;
@Test
void testJPA() {
User user = userDao.save(new User(null, "summerday", "123456", "hangzhou"));
System.out.println("新增使用者: " + user);
User u = userDao.findByUsernameAndPassword("summerday", "123456");
System.out.println("根據使用者名稱和密碼查詢使用者: " + u);
long count = userDao.count();
System.out.println("當前使用者數量: " + count);
PageRequest page = PageRequest.of(0, 5, Sort.by(Sort.Order.desc("id")));
Page<User> all = userDao.findAll(page);
System.out.println("分頁 + 根據id逆序 查詢結果: " + all.getContent());
if(userDao.existsById(u.getId())) {
userDao.deleteById(u.getId());
System.out.println("刪除id為" + u.getId()+ "的使用者成功");
}
long c = userDao.count();
System.out.println("剩餘使用者數為: " + c);
}
}
控制檯輸出如下:
五、原始碼下載
本文內容均為對優秀部落格及官方文件總結而得,原文地址均已在文中參考閱讀處標註。最後,文中的程式碼樣例已經全部上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn,另有其他SpringBoot的整合哦。