1. 程式人生 > >SpringBoot2學習記錄(七)——SpringDataJPA的使用

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內部封裝的方法就到這裡,後面再慢慢學習自定義查詢和高階查詢部分!!!。