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
JPQL
)查詢數據,避免程序的SQL語句緊密耦合
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,它將POJO與數據庫表創建映射關係,是一個全自動的orm框架,hibernate能夠自動生成SQL語句,自動執行,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。mysql
JPA全稱是Java Persistence API,即java持久化API,是sun公司推出的一套基於ORM的規範,內部由一系列的接口和抽象類構成git
JPA和Hibernate的關係就像JDBC和JDBC驅動的關係,JPA是規範,Hibernate除了做爲ORM框架以外,它也是一種JPA實現。JPA怎麼取代Hibernate呢?JDBC規範能夠驅動底層數據庫嗎?答案是否認的,也就是說,若是使用JPA規範進行數據庫操做,底層須要hibernate做爲其實現類完成數據持久化工做。程序員
Spring Data JPA 讓咱們解脫了DAO層的操做,基本上全部CRUD均可以依賴於它來實現,在實際的工做工程中,推薦使用Spring Data JPA + ORM(如:hibernate)完成操做,這樣在切換不一樣的ORM框架時提供了極大的方便,同時也使數據庫層操做更加簡單,方便解耦github
導入依賴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
create
:每次運行程序時,都會從新建立表,故而數據會丟失create-drop
:每次運行程序時會先建立表結構,而後待程序結束時清空表upadte
:每次運行程序,沒有表時會建立表,若是對象發生改變會更新表結構,原有數據不會清空,只會更新(推薦使用)validate
:運行程序會校驗數據與數據庫的字段類型是否相同,字段不一樣會報錯none
: 禁用DDL處理Spring Data Jpa UML類圖spring
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的默認值
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); } }
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