一,什麼是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 查詢條件。一般使用匿名內部類的方式來建立該接口的對象。