Spring Data Jpa

Spring Data Jpa 簡介

  JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0後提出的Java持久化規範(JSR 338,這些接口所在包爲javax.persistence,詳細內容可參考https://github.com/javaee/jpa-spec

  JPA的出現主要是爲了簡化持久層開發以及整合ORM技術,結束Hibernate、TopLink、JDO等ORM框架各自爲營的局面。JPA是在吸取現有ORM框架的基礎上發展而來,易於使用,伸縮性強。總的來講,JPA包括如下3方面的技術:html

  • ORM映射元數據: 支持XML和註解兩種元數據的形式,元數據描述對象和表之間的映射關係
  • API: 操做實體對象來執行CRUD操做
  • 查詢語言: 經過面向對象而非面向數據庫的查詢語言(JPQL)查詢數據,避免程序的SQL語句緊密耦合
 

Spring Data Jpa官方解釋

  鏈接:https://spring.io/projects/spring-data-jpa#overviewjava

  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
  
  
  Spring Data JPA是Spring Data家族的一部分,能夠輕鬆實現基於JPA的存儲庫。 此模塊處理對基於JPA的數據訪問層的加強支持。 它使構建使用數據訪問技術的Spring驅動應用程序變得更加容易。
  在至關長的一段時間內,實現應用程序的數據訪問層一直很麻煩。 必須編寫太多樣板代碼來執行簡單查詢以及執行分頁和審計。 Spring Data JPA旨在經過減小實際須要的工做量來顯著改善數據訪問層的實現。 做爲開發人員,您編寫repository接口,包括自定義查找器方法,Spring將自動提供實現。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hibernate、Jpa、Spring Data Jpa三者之間的關係

 Hibernate

  Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,它將POJO與數據庫表創建映射關係,是一個全自動的orm框架,hibernate能夠自動生成SQL語句,自動執行,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。mysql

 JPA

  JPA全稱是Java Persistence API,即java持久化API,是sun公司推出的一套基於ORM的規範,內部由一系列的接口和抽象類構成git

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JPA與Hibetnate的關係

  JPA和Hibernate的關係就像JDBC和JDBC驅動的關係,JPA是規範,Hibernate除了做爲ORM框架以外,它也是一種JPA實現。JPA怎麼取代Hibernate呢?JDBC規範能夠驅動底層數據庫嗎?答案是否認的,也就是說,若是使用JPA規範進行數據庫操做,底層須要hibernate做爲其實現類完成數據持久化工做。程序員

Spring Data jpa

  Spring Data JPA 讓咱們解脫了DAO層的操做,基本上全部CRUD均可以依賴於它來實現,在實際的工做工程中,推薦使用Spring Data JPA + ORM(如:hibernate)完成操做,這樣在切換不一樣的ORM框架時提供了極大的方便,同時也使數據庫層操做更加簡單,方便解耦github

 總結:

  JPA是一種規範,Hibernate實現了JPA規範,即Hibernate爲JPA的一種實現;而Spring Data JPA是對JPA進行更高級的封裝,讓其dao編碼變得更簡單。
 

Spring Boot整合Spring Data Jpa

  導入依賴web

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

 

相關配置

server:
  port: 9001
spring:
  application:
    name: service-product
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/practice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
  jpa:
    database: mysql
    show-sql: true
    open-in-view: true
    hibernate:
      ddl-auto: update

   ddl-auto

  • create:每次運行程序時,都會從新建立表,故而數據會丟失
  • create-drop:每次運行程序時會先建立表結構,而後待程序結束時清空表
  • upadte:每次運行程序,沒有表時會建立表,若是對象發生改變會更新表結構,原有數據不會清空,只會更新(推薦使用)
  • validate:運行程序會校驗數據與數據庫的字段類型是否相同,字段不一樣會報錯
  • none: 禁用DDL處理

Spring Data Jpa的使用

  Spring Data Jpa UML類圖spring

 

 

簡單的REST CRUD示例

   實體類
package com.jpa.product.entity;

        import lombok.Data;

        import javax.persistence.*;
        import java.math.BigDecimal;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:17
 */
@Data
@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "price")
    private BigDecimal price;

    @Column(name = "description")
    private String description;

    @Column(name = "status")
    private Integer status;

    @Column(name = "caption")
    private String caption;

    @Column(name = "stock")
    private Integer stock;
}

 

  通常簡單的Demo示例中只會使用@GeneratedValue(strategy = GenerationType.IDENTITY)這種主鍵自增的策略,而實際數據庫中表字段主鍵類型不多是int型的sql

JPA自帶的幾種主鍵生成策略數據庫

  • TABLE: 使用一個特定的數據庫表格來保存主鍵
  • SEQUENCE: 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。這個值要與generator一塊兒使用,generator 指定生成主鍵使用的生成器(多是orcale中本身編寫的序列)
  • IDENTITY: 主鍵由數據庫自動生成(主要是支持自動增加的數據庫,如mysql)
  • AUTO: 主鍵由程序控制,也是GenerationType的默認值

  dao層
package com.jpa.product.dao;

import com.jpa.product.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/**
 * @author: MR.LIU
 * @description: 數據層
 * @date: 2020/5/29
 * @time: 22:34
 */
public interface ProductDao extends JpaRepository<Product,Long>, JpaSpecificationExecutor<Product> {
}

 

  service層

package com.jpa.product.service;

import com.jpa.product.entity.Product;

/**
 * @author: MR.LIU
 * @description: 接口層
 * @date: 2020/5/29
 * @time: 22:37
 */
public interface ProductService {
    /**
     * 根據id查詢
     * @param id
     * @return
     */
    Product findById(Long id);

    /**
     * 保存
     * @param product
     * @return
     */
    void save(Product product);

    /***
     * 修改
     * @param product
     * @return
     */
    void update(Product product);

    /**
     * 刪除
     * @param id
     * @return
     */
    void delete(Long id);
}

  

  impl層

package com.jpa.product.service.impl;

import com.jpa.product.dao.ProductDao;
import com.jpa.product.entity.Product;
import com.jpa.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:41
 */
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductDao productDao;

    @Override
    public Product findById(Long id) {
        return productDao.findById(id).get();
    }

    @Override
    public void save(Product product) {
         productDao.save(product);
    }

    @Override
    public void update(Product product) {
        productDao.save(product);
    }

    @Override
    public void delete(Long id) {
        productDao.deleteById(id);
    }
}

 

  controller層
 
package com.jpa.product.controller;

import com.jpa.product.entity.Product;
import com.jpa.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author: MR.LIU
 * @description:
 * @date: 2020/5/29
 * @time: 22:47
 */
@RestController
@RequestMapping(value = "/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping(value = "/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.findById(id);
    }

    @PostMapping(value = "/save")
    public String saveProduct(@RequestBody Product product){
        productService.save(product);
        return "保存成功";
    }

}

 

  測試
http://localhost:9001/product/1

  成功查詢

 

模糊查詢

 

  自定義DAO接口

@Query(value = "select * from product where product_name like concat('%',:name,'%')",nativeQuery = true)
    List<Product> findByNameMatch(@Param("name") String name);

 

  上的SQL語句必定要按照Query的格式來。以上都是寫在DAO層(respository層裏面)

  @Query註解的用法(Spring Data JPA)  這裏參考:http://www.cnblogs.com/zj0208/p/6008627.html

相關文章
相關標籤/搜索