4,JPA

一,什麼是JPA java

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

JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它爲Java開發人員提供了一種對象/關係映射工具來管理Java應用中的關係數據。 web

二,什麼是Spring Data spring

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

三,Spring Data JPA 數據庫

在Spring Data這個框架中Spring Data JPA只是這個框架中的一個模塊,因此名稱才叫Spring Data JPA。若是單獨使用JPA開發,你會發現這個代碼量和使用JDBC開發同樣有點煩人,因此Spring Data JPA的出現就是爲了簡化JPA的寫法,讓你只須要編寫一個接口繼承一個類就能實現CRUD操做了。 json

四,JPA/Hibernate 關係 緩存

JPA是一種規範,而Hibernate是它的一種實現。除了Hibernate,還有EclipseLink(曾經的toplink),OpenJPA等可供選擇,因此使用Jpa的一個好處是,能夠更換實現而沒必要改動太多代碼。 app

五,使用步驟 框架

建立一個實體類

package com.zh.jpa.demo.bean;
 
import java.util.Date;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
import com.alibaba.fastjson.annotation.JSONField;
//使用@Entity進行實體類的持久化操做,當JPA檢測到咱們的實體類當中有
@Entity
public class Persion {
    /**
     * 使用@Id指定主鍵
     * 使用代碼@GeneratedValue(strategy=GenerationType.AUTO)
     * 指定主鍵的生成策略,mysql默認的是自增加。
     */
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int pid;
    private String pname;
    private int age;
    
    @JSONField(format="yyyy-MM-dd HH:mm")
    private Date date;
    
    /*省略get/set方法*/
}

(1)在pom.xml添加mysql,spring-data-jpa依賴;

<!-- 添加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>

(2)在application.properties文件中配置mysql鏈接配置文件;

########################################################
###datasource -- 指定mysql數據庫鏈接信息.
########################################################
spring.datasource.url = jdbc:mysql://192.168.23.129:3306/test1
spring.datasource.username = root
spring.datasource.password = 123456
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

3)在application.properties文件中配置JPA配置信息;

########################################################
### Java Persistence Api --  Spring jpa的配置信息.
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy  #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

到這步後,右鍵菜單Run As-->Java Application spring-data-jpa會自動幫咱們在數據庫自動建立persion這張表

(4)編寫測試例子

1)建立jpa repository類,操做持久化(CrudRepository)。

package com.zh.jpa.demo.repository;
 
import org.springframework.data.repository.CrudRepository;
 
import com.zh.jpa.demo.bean.Persion;
 
//CrudRepository第一個參數:實體類的名稱
//CrudRepository第二個參數:主鍵id類型
public interface PersionRepository extends CrudRepository<Persion, Integer> {
 
}

2)建立PsersionService類。

package com.zh.jpa.demo.service;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.repository.PersionRepository;
 
@Service
public class PsersionService {
    
    @Resource
    private PersionRepository pr;
    
    /**
     * save,update ,delete 方法須要綁定事務.
     * 使用@Transactional進行事務的綁定.
     */
    // 保存數據.
    @Transactional
    public void save(Persion p) {
        pr.save(p);
    }
 
    // 刪除數據
    @Transactional
    public void delete(int id) {
        pr.delete(id);
    }
 
    // 查詢數據.
    public Iterable<Persion> getAll() {
        Iterable<Persion> p = pr.findAll();
        return p;
    }
}

3)建立PersionController請求類。

package com.zh.jpa.demo.controller;
 
import javax.annotation.Resource;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.service.PsersionService;
 
@RestController
@RequestMapping("/persion")
public class PersionController {
    
    @Resource
    private PsersionService ps;
    
    @RequestMapping("/save")
    public String save(){
        Persion p = new Persion(1, "zender", 19);
        ps.save(p);
        return "save-OK";
    }
    @RequestMapping("/delete")
    public String delete(){
        ps.delete(1);
        return "delete-OK";
    }
    
    @RequestMapping("/getAll")
    public Iterable<Persion> getAll(){
        return ps.getAll();
    }
}

4)測試

右鍵菜單Run As-->Java Application,

向數據庫插入一條數據:http://localhost:8080/persion/save

刪除數據:http://localhost:8080/persion/delete

獲取全部插入數據:http://localhost:8080/persion/getAll

插入4條數據:

   

六,Spring Boot JPA 步驟總結:

一、須要添加相應的依賴包;

二、須要在application.properties文件添加配置信息;

三、須要建立一個實體類,好比Cat;

四、須要建立一個接口繼承CrudRepository;

五、須要建立一個Service;

六、須要建立一個Controller;

七、代碼測試;

七,Spring Boot JPA接口介紹

1,Repository接口

Repository 接口是 Spring Data 的一個核心接口,它不提供任何方法,開發者須要在本身定義的接口中聲明須要的方法 :

public interface Repository<T, ID extends Serializable> { }

有這麼幾點須要強調下:

1. Repository是一個空接口,便是一個標記接口;

2. 若咱們定義的接口繼承了Repository,則該接口會被IOC容器識別爲一個Repository Bean歸入到IOC容器中,進而能夠在該接口中定義知足必定規範的方法。

3. 實際上也能夠經過@RepositoryDefinition,註解來替代繼承Repository接口。

4. 查詢方法以find | read | get開頭;

5. 涉及查詢條件時,條件的屬性用條件關鍵字鏈接,要注意的是條件屬性以首字母大寫。

6.使用@Query註解能夠自定義JPQL語句實現更靈活的查詢。

Repository:

package com.zh.jpa.demo.repository;
 
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
 
import com.zh.jpa.demo.bean.Persion;
 
public interface PersionTwoRepository extends Repository<Persion, Integer> {
    /**
     * 查詢方法 以 get | find | read 開頭.
     */
    //根據name進行查詢
    public Persion findBypname(String name);
    //根據id進行查詢
    @Query("from Persion where pid=:cn")
    public Persion findMypid(@Param("cn")int id);
}

Service:

package com.zh.jpa.demo.service;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.repository.PersionTwoRepository;
@Service
public class PersionTwoService {
    @Autowired
    private PersionTwoRepository ptr;
    
    public Persion findByName(String name){
        return ptr.findBypname(name);
    }
    
    public Persion findByID(int id){
        return ptr.findMypid(id);
    }
}

Controller:

package com.zh.jpa.demo.controller;
 
import javax.annotation.Resource;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.service.PersionTwoService;
 
@RestController
@RequestMapping("/persion2")
public class PersionTwoController {
    @Resource
    private PersionTwoService pts;
    
    @RequestMapping("/findByName")
    public Persion findByName(String name){
        System.out.println(name);
        return pts.findByName(name);
    }
    
    @RequestMapping("/findByID")
    public Persion findByName(int id){
        System.out.println(id);
        return pts.findByID(id);
    }
}

根據name查詢:

根據id查詢:

表數據:

2,CrudRepository接口

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

T save(T entity);

保存單個實體   

Iterable<T> save(Iterable<? extends T> entities);

保存集合         

T findOne(ID id);

根據id查找實體          

boolean exists(ID id);

根據id判斷實體是否存在          

Iterable<T> findAll();

查詢全部實體,不用或慎用!          

long count();

查詢實體數量          

void delete(ID id);

根據Id刪除實體          

void delete(T entity);

刪除一個實體   

void delete(Iterable<? extends T> entities);

刪除一個實體的集合          

void deleteAll();

刪除全部實體,不用或慎用!

3,PagingAndSortingRepository接口

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

Iterable<T> findAll(Sort sort);

排序

Page<T> findAll(Pageable pageable);

分頁查詢(含排序功能)

PersionPageRepository:

package com.zh.jpa.demo.repository;
 
import org.springframework.data.repository.PagingAndSortingRepository;
 
import com.zh.jpa.demo.bean.Persion;
 
public interface PersionPageRepository extends PagingAndSortingRepository<Persion, Integer> {
 
}

PersionPageService:

package com.zh.jpa.demo.service;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.repository.PersionPageRepository;
 
@Service
public class PersionPageService {
    @Autowired
    private PersionPageRepository ppr;
    //分頁查詢
    public Iterable<Persion> pagePersion(int pageNumber,int pageSize){
        return ppr.findAll(new PageRequest(pageNumber, pageSize));
    }
}

PersionPageController:

package com.zh.jpa.demo.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.zh.jpa.demo.bean.Persion;
import com.zh.jpa.demo.service.PersionPageService;
 
@RestController
@RequestMapping("page")
public class PersionPageController {
    @Autowired
    private PersionPageService pps;
    @RequestMapping("/pagePersion")
    public Iterable<Persion> pagePersion(int pageNumber, int pageSize){
        return pps.pagePersion(pageNumber, pageSize);
    }
}

分頁查詢:

4,其餘接口

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

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

相關文章
相關標籤/搜索