發布時間: 2020-07-13 10:34:37
?一、 Spring Data JPA簡介
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規范的基礎上封裝的一套 JPA 應用框架,底層使用了Hibernate 的 JPA 技術實現,可使開發者用極簡的代碼即可實現對數據的訪問和操作。
它提供了包括增刪改查等在內的常用功能接口,且易于擴展!學習并使用 Spring Data JPA 可以極大提高開發效率!
由于微服務系統的廣泛應用,服務粒度逐漸細化,多表關聯查詢的場景一定程度減少。單表查詢和單表的數據操作正是JPA的優勢。
二、 Spring Data JPA特點
1. 標準化 JPA 是 JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問API,這保證了基于JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。
2. 容器級特性的支持 JPA框架中支持大數據集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用。
3. 簡單方便 JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創建實體和創建Java類一樣簡單,沒有任何的約束和限制,只需要使用javax.persistence.Entity進行注釋,JPA的框架和接口也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易地掌握。JPA基于非侵入式原則設計,因此可以很容易地和其它框架或者容器集成。
4. 查詢能力 JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。
5. 高級特性 JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的復雜關系,這樣的支持能夠讓開發者較大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關系數據庫的持久化。
三、 在SpringBoot項目中引入JPA依賴實現對數據庫的操作
1. 引入必須的依賴包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2. 修改application.yml編寫配置文件
server:
port: 9004
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
url: jdbc:mysql://localhost:3306/springbootjpa?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456aB
jpa:
hibernate:
ddl-auto: validate # 自動建表用update 成功后換成validate
database: mysql
show-sql: true
# create:每次加載hibernate時都會刪除上一次的生成的表,然后根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因。
# create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
# update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以后加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。
#要注意的是當部署到服務器后,表結構是不會被馬上建立起來的,是要等應用第一次運行起來后才會。
# validate:每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。
3. 編寫與數據庫對應的實體類
@Data
@Entity
@Table(name="tb_user")
public class TbUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotEmpty(message = "不能為空,不能為null")
@Column(name = "username",nullable = false, length = 20)
private String username;
@Column(name = "password",nullable = false, length = 100)
private String password;
@Column(name = "role",nullable = false, length = 100)
private String role;
private Date createTime;
}
4. 編寫dao接口
public interface TbUserDao extends JpaRepository<TbUser,Integer> {
}
5. 編寫service接口
public interface TbUserService {
TbUser addUser(TbUser tbUser);
void deleteUserById(Integer id);
TbUser findUserById(Integer id);
List<TbUser> users();
}6. 編寫service實現類
@Service
public class TbUserServiceImpl implements TbUserService {
@Resource
TbUserDao userDao;
@Override
public TbUser addUser(TbUser tbUser){
TbUser user = userDao.save(tbUser);
return user;
}
@Override
public void deleteUserById(Integer id) {
userDao.deleteById(id);
}
@Override
public TbUser findUserById(Integer id) {
TbUser user = userDao.findById(id).get();
return user;
}
@Override
public List<TbUser> users() {
List<TbUser> users = userDao.findAll();
return users;
}
}
7. 編寫controller
@RestController
public class TbUserController {
@Resource
TbUserService userService;
@PostMapping("/add")
public TbUser addUser(TbUser tbUser){
TbUser user = userService.addUser(tbUser);
user.setCreateTime(new Date());
System.out.println("user = " + user);
return user;
}
@PostMapping("/delete/{id}")
public void deleteUserById(@PathVariable(value = "id") Integer id){
userService.deleteUserById(id);
}
@GetMapping("/user/{id}")
public TbUser findUserById(@PathVariable(value = "id") Integer id){
TbUser user = userService.findUserById(id);
return user;
}
@GetMapping("/findAll")
public List<TbUser> users(){
List<TbUser> users = userService.users();
System.out.println("users = " + users);
return users;
}
}
上一篇: SQL語句的分類之DDL