SpringBoot2學習記錄(七)——SpringDataJPA的使用
1、JPA
JPA(Java Persistence API)是Sun官方提出的,JPA本身並不是一種框架,是一種規範。它為Java開發人員提供了一種物件/關聯對映工具來管理Java應用中的關係資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate,TopLink,JDO等ORM框架各自為營的局面。值得注意的是,JPA是在充分吸收了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具有易於使用,伸縮性強等優點。JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,如果說這些產品實現了這個JPA規範,那麼我們就可以叫他們為JPA的實現產品。
2、Spring Data JPA的概述
Spring Data JPA是Spring基於ORM框架(Object Relation Mapping)、JPA規範的基礎上封裝的一套JPA應用框架,可以使開發者用極簡的程式碼即可實現對資料庫的訪問與操作。它提供了包括增刪改查在內的常用功能,且易於擴充套件,學習與使用。Spring Data JPA可以極大的提高開發效率!Spring Data JPA 讓我們解脫了DAO層的操作,基本上所有CRUD都可以依賴於它來實現,在實際的工作工程中,推薦使用Spring Data JPA + ORM(如:hibernate)完成操作,這樣在切換不同的ORM框架時提供了極大的方便,同時也使資料庫層操作更加簡單,方便解耦。
3、Repository統一介面
Spring data JPA提供給我們的統一Repository介面,主要有以下幾個介面:
- Repository: 最頂層的介面,是一個空介面,目的是為了統一所有的Repository的型別,且能讓元件掃描時自動識別
- CrudRepository: 繼承Repository,提供CRUD 的功能。
- PagingAndSortingRepository:繼承CrudRepository, 新增分頁排序功能。
- JpaRepository: 繼承PagingAndSortingRepository,增加批量操作等。
- JpaSpecificationExecutor: 用來做複雜查詢的介面。
4、簡單使用
在pom檔案中需要新增以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
application.yml屬性配置檔案需要配置資料庫連線,用的是MySQL。
server:
port: 8080
spring:
datasource:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1/db_user?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
jpa:
database: mysql
show-sql: true
hibernate:
ddl-auto: update
spirng.jpa.hibernate.ddl-auto: (自動建立|更新|驗證資料庫表結構)
- create:每次載入Hibernate都會刪除上次的實體類表,如果表中沒有任何變化也會刪除
- create-drop:載入Hibernate就會根據實體類生成表,SessionFactory關閉,表被刪除
- update:最常用的屬性,載入Hibernate根據實體類自動生成表,以後再載入實體類時候,自動更新表
- validate:不會建立表,當新增資料時,會新增資料
建立實體類:
實體類中常用註解:
- @Entity :宣告這個類是一個實體類
- @Table:指定對映到資料庫的表格,如果省略預設表名就是小寫的類名
- @Id :對映到資料庫表的主鍵屬性,一個實體只能有一個屬性被對映為主鍵
- @GeneratedValue:主鍵的生成策略
- @GeneratedValue(strategy = GenerationType.IDENTITY) :自增主鍵
- @Column配置單列屬性
/**
* @author Tang Haorong
* @name
*/
//這個註解是處理Json資料
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
@Entity
@Table(name = "t_user")
public class User implements Serializable {
@Id
@Column(name = "id",nullable = false)
@GeneratedValue
private Integer id;
@Column(name = "name",length = 64)
private String name;
@Column(name = "password",length = 64)
private String password;
編寫介面,建立Repository:
不用加任何註解,Spring會自動識別加到容器中,其中泛型中的User表示該Repository與實體User關聯,主鍵型別為Integer
public interface UserRepository extends JpaRepository<User,Integer> {
}
這樣就完成了一個基本Repository的建立,可以直接使用其中的方法,而不需要去寫實現類。
Controller程式碼如下:
/**
* @author Tang Haorong
* @name
*/
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
//查詢一個使用者
@GetMapping(value = "getOneUser/{id}")
public User getOneUser(@PathVariable Integer id){
User user = userRepository.findById(id).get();
return user;
}
//查詢所有使用者
@GetMapping(value = "getUser")
public List<User> getUesr(){
return userRepository.findAll();
}
//單個新增
@PostMapping(value = "addUser")
public User addUser(User user){
User users=new User();
users.setId(1);
users.setName("java");
users.setPassword("123");
User user1=userRepository.save(users);
return users;
}
//批量新增
@PostMapping(value = "addAllUser")
public List<User> addAllUser(){
List<User> userList=new ArrayList<User>();
User user1=new User();
user1.setId(2);
user1.setName("admin2");
user1.setPassword("123456");
User user2=new User();
user1.setId(3);
user1.setName("admin3");
user1.setPassword("123456");
User user3=new User();
user1.setId(4);
user1.setName("admin4");
user1.setPassword("123456");
userList.add(user1);
userList.add(user1);
userList.add(user1);
return userRepository.saveAll(userList);
}
@PutMapping("/updateUser/{id}")
public User updUserById(@PathVariable Integer id){
User user = userRepository.findById(id).get();//先根據id查詢出要修改的資料
user.setName("admin--update");
return userRepository.save(user);//與儲存是同一個方法
}
@DeleteMapping(value = "/deleteUser/{id}")
public String delete(@PathVariable Integer id){
userRepository.deleteById(id);
return "Delete Succec";
}
}
這裡是findOne和getOne的區別:
getOne API:返回對具有給定識別符號的實體的引用。當我查詢一個不存在的id資料時,直接丟擲異常,因為它返回的是一個引用,簡單點說就是一個代理物件。
findOne API:按ID查詢實體。當我查詢一個不存在的id資料時,返回的值是null.
詳細對比參考這裡。
但是新版本的JPA中,已經不存在用ID查詢實體的findOne方法了,取而代之的是:findById().get()方法。
程式碼編寫完成後,用PostMan對請求進行測試:
1、查詢:
2、 新增:
3、更新:
4、刪除:
成功將id為5的刪除。
SpringDataJPA內部封裝的方法就到這裡,後面再慢慢學習自定義查詢和高階查詢部分!!!。