Spring Boot (6) Spring Data JPA

JPAjava

  全稱Java Persistence API,JPA經過JDK 5.0註解或xml描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中mysql

  JPA是sun官方提出的java持久化規範,它爲java開發人員提供了一種對象/關係映射工具來管理java應用中的關係數據。程序員

    持久化:把數據(內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要做用是將內存中的對象存儲在數據庫中,或磁盤文件中,xml文件中等。jdbc,io都是持久化機制。web

    規範:所謂的規範就是明文規定或約定俗成的標準,如道德規範,技術規範等。spring

    持久化規範就是sun針對持久化這一層操做指定的規範。sql

 

Hibernate數據庫

  hibernate是一個開源的對象關係映射框架,它對jdbc進行了封裝,將pojo與數據庫表創建映射關係,是一個全自動的orm框架,hibernate能夠自動生成sql語句,自動執行,使java程序員能夠像操做對象同樣操做數據庫。瀏覽器

 

Spring Data緩存

  spring data 是一個用於簡化數據庫訪問,並支持雲服務的開源框架,主要目標是使數據庫的訪問變的方便快捷,並支持map-reduce框架和雲計算數據服務,此外,他還支持基於關係型數據庫的數據服務,如Oracle RAC等。對於擁有海量數據的項目,可使用Spring Data 來簡化項目的開發,就如spring framework 對jdbc 、orm的支持同樣,spring data會讓數據的訪問變的更加方便。app

 

Spring Data JPA

  能夠極大簡化JPA的寫法,能夠在幾乎不用寫實現的狀況下,實現對數據的訪問和操做。除了增刪改查外,還包括分頁、排序等一些經常使用功能。

  spring data 是一個開源框架,在這個框架中spring data jpa 只是這個框架中的一個模塊,因此名稱才叫 spring data jpa。若是單獨使用jpa開發,你會發現這個代碼量和jdbc開發同樣有點煩人,因此spring data jpa的出現就是爲了簡化jpa的寫法,讓你只須要編寫一個接口繼承一個類就能夠實現增刪改查操做了。

 

JPA/Hibernate關係

  JPA是一種規範,而hibernate是它的一種實現。因此使用JPA的一個好處是,能夠更換實現而沒必要改動太多代碼。

 

使用Spring Data JPA進行數據庫持久化操做:

首先在pom.xml中添加依賴

       <!--mysql數據驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--spring data jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

 

在application.properties中配置鏈接

# mysql鏈接
spring.datasource.url=jdbc:mysql://localhost:3306/david2018_db?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

# jpa配置
spring.jpa.database = MYSQL
# 顯示sql語句
spring.jpa.show-sql = true
# Hibernate 語句策略 (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# 建立表結構
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

編寫實體類

package com.david.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

//當JPA檢測到咱們的實體類當中有@Entity時,會在數據庫中生成對應的表結構信息
@Entity
public class Cat {
    //使用@Id指定主鍵 @GeneratedValue指定主鍵的生成策略(mysql中自增)
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String catName;
    private Integer catAge;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCatName() {
        return catName;
    }

    public void setCatName(String catName) {
        this.catName = catName;
    }

    public Integer getCatAge() {
        return catAge;
    }

    public void setCatAge(Integer catAge) {
        this.catAge = catAge;
    }
}

運行啓動類,會自動在數據庫中生成cat表,根據駝峯命名catName 會轉換爲cat_name

編寫CatRepository.java 接口

package com.david.repository;

import com.david.bean.Cat;
import org.springframework.data.repository.CrudRepository;

//繼承CrudRepository類 第二個參數id的類型 便可繼承經常使用方法save update findAll等
public interface CatRepository extends CrudRepository<Cat,Integer> {

}

編寫CatService.java

package com.david.service;

import com.david.bean.Cat;
import com.david.repository.CatRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class CatService {
    @Resource
    private CatRepository catRepository;

    @Transactional
    public void save(Cat c){
        catRepository.save(c);
    }

    @Transactional
    public void delete(int id){
        catRepository.delete(id);
    }

    public Iterable<Cat> getAll(){
        return catRepository.findAll();
    }
}

編寫CatController.java

package com.david.controller;

import com.david.bean.Cat;
import com.david.service.CatService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/cat")
public class CatController {

    @Resource
    private CatService catService;

    @RequestMapping("/save")
    public String save(){
        Cat cat = new Cat();
        cat.setCatName("tom");
        cat.setCatAge(3);
        catService.save(cat);
        return "save";
    }

    @RequestMapping("/delete")
    public String delete(){
        catService.delete(1);
        return "delete";
    }

    @RequestMapping("/getall")
    public Iterable<Cat> getAll(){
        return catService.getAll();
    }
}

完整框架

瀏覽器訪問 localhost:8088/cat/save delete getall方法進行測試

 

Repository

咱們的CatRepository.java接口繼承了CrudRepository接口,CrudRepository接口又繼承了Repository接口,Repository是一個空接口,若是咱們定義的接口繼承了Repository,則該接口會被IOC容器識別爲一個Repository Bean歸入到IOC容器中,今兒能夠在該接口中定義知足必定規範的方法,實際上也能夠經過@RepositoryDefinition註解來替代繼承Repository接口。

查詢方法以find | read | get開頭,設計查詢條件時,條件的屬性用條件關鍵字鏈接,要注意的是條件屬性以首字母大寫,使用@Query註解能夠自定義JPQL語句實現更靈活的查詢。

 

CrudRepository

  該接口提供了最基本的對實體類的增刪改查操做

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.repository;

import java.io.Serializable;

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1); //保存單個實體

    <S extends T> Iterable<S> save(Iterable<S> var1); //保存集合

    T findOne(ID var1); //根據id查找一個

    boolean exists(ID var1); //根據id判斷是否存在

    Iterable<T> findAll(); //查找全部

    Iterable<T> findAll(Iterable<ID> var1); //查詢全部 根據條件

    long count(); //查詢實體數量

    void delete(ID var1); //根據id刪除實體

    void delete(T var1); //刪除一個實體

    void delete(Iterable<? extends T> var1); //刪除一個實體集合

    void deleteAll(); //刪除全部實體
}

 

PagingAndSortingRepository

  該接口提供了分頁與排序功能

  Iterable<T> findAll(Sort sort); //排序

  Page<T> findAll(Pageable pageable) //分頁查詢(包含排序)

 

其餘接口

  JpaRepository:查找全部實體、排序、查找全部實體,執行緩存與數據庫同步

  JpaSpecificationExecutor:不屬於Repository體系,實現一組JPA Criteria 查詢相關的方法,封裝JPA Criteria 查詢條件,一般使用匿名內部類的方式來建立該接口的對象。

  自定義Repository:能夠自定義一個MyRepository接口。

相關文章
相關標籤/搜索