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接口。