meleto 2020-05-30
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方面的技术:
JPQL)查询数据,避免程序的SQL语句紧密耦合

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
JPA全称是Java Persistence API,即java持久化API,是sun公司推出的一套基于ORM的规范,内部由一系列的接口和抽象类构成

JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦
导入依赖
<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
ddl-auto
create:每次运行程序时,都会重新创建表,故而数据会丢失
create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
none: 禁用DDL处理
Spring Data Jpa的使用
Spring Data Jpa UML类图
简单的REST CRUD示例
实体类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型的
JPA自带的几种主键生成策略
TABLE: 使用一个特定的数据库表格来保存主键
SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)
IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
AUTO: 主键由程序控制,也是GenerationType的默认值
dao层
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
成功查询

是一个替代hibernate的一个作用于数据库的框架。 这里整合后不需要写一些简单的sql语句。 2、在resources下创建templates文件夹,在其下就可以书写页面了,和HTML的风格相似。