1. 程式人生 > 其它 >spring data(暫時寫下jpa的部分,後續繼續更新,jpa的多對多之類的就不再玩了,可以回看之前的jpa部分)

spring data(暫時寫下jpa的部分,後續繼續更新,jpa的多對多之類的就不再玩了,可以回看之前的jpa部分)

技術標籤:spring data

文章目錄

springdata

springdata(這玩意是spring家族成員)簡介

現代的開發技術中,redis用於快取熱點資料,mongodb用於儲存文件資料,elasticsearch用於支援強大的搜尋功能。

在Java的訪問技術中有針對關係型資料庫的mybatis、jpa、針對redis的jedis等等。每個技術的api都不一樣,springdata將這些不同的api統一起來,也就是說springdata支援關係型和非關係型資料庫。

因此,spring data jpa(把jpa封裝了一次)只是springdata中的一個模組。

springdata的主要模組

  • spring data jpa

    對jpa的spring data儲存庫支援

  • spring data mongodb

    對mongodb的基於spring物件文件的儲存庫支援

  • spring data common

    spring data的核心模組,定義了spring data的核心功能

  • spring data jdbc

    對jdbc的spring data儲存庫支援

  • spring data redis

    封裝jedis技術,訪問redis

  • spring data elasticsearch

    訪問elasticsearch

spring data jpa

搭建環境

  1. 建立maven工程

  2. 新增springboot、spring data jpa、mysql的依賴

    maven開始

     <!--springboot-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</
    version
    >
    </parent> <dependencies> <!-- springBoot JPA的起步依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--單元測試--> <!--springboot整合junit測試的起步依賴 junit-vintage-engine 是 JUnit 4 中使用的測試引擎。 junit-jupiter-engine 是 JUnit 5 中使用的測試引擎。--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--lombok外掛--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!--依賴不會被傳遞--> <scope>provided</scope><!--無需參與專案的編譯--> </dependency> </dependencies>

    ps:springboot2.1.6.RELEASE中@SpringBootTest註解不起作用,原因未知,改成springboot2.2.2.RELEASE,就ok了

    熱部署:https://www.cnblogs.com/zhukf/p/12672180.html

    熱部署小問題:熱部署之後,原先能訪問的連結,都Whitelabel Error Page,暫時沒找到解決辦法

  3. 編寫實體類

    package com.yyh.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.*;
    import java.util.Date;
    
    @Entity//掃描該實體類
    @Getter//Lombok的註解
    @Setter//Lombok的註解
    @ToString//Lombok的註解
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        @Column(name = "hiredate")
        @Temporal(TemporalType.DATE)
        private Date hireDate;
    }
    
  4. 編寫啟動類

    package com.yyh;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringbootUserCRUDApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootUserCRUDApplication.class,args);
        }
    }
    
  5. 編寫dao類

    package com.yyh.dao;
    
    import com.yyh.domain.User;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UserRepository extends JpaRepository<User,Long> {//JpaRepository:jpa提供的介面,介面當中定義了實體的基本操作
     //只是單表簡單的增刪改查的話,我啥都不用寫,而且不用寫實現類,因為動態代理已經生成了一個實現類。
    }
    
  6. 編寫controller類

    package com.yyh.controller;
    
    import com.yyh.dao.UserRepository;
    import com.yyh.domain.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
    
        @Autowired
        UserRepository userRepository;
    
        @GetMapping("/user/{id}")
        public User findById(@PathVariable("id") Long id){
            //userRepository.findById(id)會返回一個Optional物件是java8的新特性,主要是為了避免空值
            //也可以userRepository.findById(id).get()
            User user = userRepository.findById(id).orElse(null);
            return user;
        }
    
        @GetMapping("/user")//應該用post方式的,但為了測試方便,使用get
        public User saveUser(User user){
            User saveUser = userRepository.save(user);
            //對於spring data jpa的save方法
            //如果沒有指定id欄位,就是新增操作
            //如果指定了id欄位,就是修改操作(先查詢記錄是否存在,若存在,則更新,不存在就是新增操作)
            return saveUser;
        }
        @GetMapping("/user/delete/{id}")
        public void deleteById(@PathVariable("id") Long id){
            userRepository.deleteById(id);
        }
    }
    
  7. 編寫啟動類

    途中遇到個小問題,建立的表不是InnoDB引擎,解決辦法:

    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #指定mysql資料庫版本5,且引擎是innodb
    

    注意InnoDB字樣

  8. 測試

    • http://localhost:8080/user?name=sansan&age=3&hireDate=2021/02/07

      ps:日期一定要斜線分割,不然無法轉換,報錯

      在這裡插入圖片描述

    • http://localhost:8080/user/1

      在這裡插入圖片描述

    • http://localhost:8080/user?id=1&name=pangpang&age=6&hireDate=2021/02/08

      在這裡插入圖片描述

      ps:有帥得發光的同學要問了,日期沒改掉啊,事實上日期改掉了,圖中是標準時間,而我們是東八區,16+8=24,是不是對上了?有資料庫圖為證:

      在這裡插入圖片描述

    • http://localhost:8080/user/delete/1

      在這裡插入圖片描述

      在這裡插入圖片描述

      原來只有一個,刪除了一個還剩一個,因為我在中途又加了一個,發現沒,圖中的id是2.