作者:谭东
JPA全称是Java Persistence API,即JAVA持久层API。可以讲JDK注解的类或者XML关系表映射对象,将运行期的实体对象持久化到数据库中,是一个ORM框架。
JPA用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个,应该说无人能出其右。从功能上来说,JPA就是Hibernate功能的一个子集。Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的JPA(Java Persistence API) 兼容认证。只要熟悉Hibernate或者其他ORM框架,在使用JPA时会发现其实非常容易上手。
好,接下来我们讲解如何使用。
pom.xml添加如下的spring-boot-starter-data-jpa库,因为我们是基于Spring Boot的,所以我们使用这个库。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
相应的Spring对应的库是:spring-data-jpa。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
接下来,我们这里采用yml文件配置,在resources文件夹下新建application.yml,相关配置信息写在这里。
server:
port: 8082 # HTTP (Tomcat) port
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/student?serverTimezone=GMT=&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: Mysql123456
jpa:
hibernate:
ddl-auto: update # 第一次建表create 后面用update
show-sql: true
然后我们重新编写个实体Product。
package com.tandong.testjavaweb.entity;
import javax.persistence.*;
import java.util.Date;
@Entity
public class Product {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private int id;
@Column
private String name;
@Column
private long price;
@Column
private String description;
@Column
private Date date;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPrice() {
return price;
}
public void setPrice(long price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
如果不指定表名,那么默认就是product这个表名。接下来编写ProductDao类。
package com.tandong.testjavaweb.dao;
import com.tandong.testjavaweb.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductDao extends JpaRepository<Product, Integer> {
}
继承JpaRepository这个类,里面封装了很多CURD的操作,当然也可以自定义自己的操作,详细用法大家可以搜索下JpaRepository的注解操作。
接下来再写ProductService。
package com.tandong.testjavaweb.service;
import com.tandong.testjavaweb.dao.ProductDao;
import com.tandong.testjavaweb.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class ProductService {
@Autowired
ProductDao productDao;
public List<Product> getProducts() {
return productDao.findAll();
}
public Optional<Product> getProductById(int id) {
return productDao.findById(id);
}
public void addProduct(Product product) {
productDao.saveAndFlush(product);
}
}
最后编写ProductController类。
package com.tandong.testjavaweb.controller;
import com.tandong.testjavaweb.entity.Product;
import com.tandong.testjavaweb.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@RestController
@SpringBootApplication
@RequestMapping("/product")
public class ProductController {
@Autowired
ProductService productService;
@ResponseBody
@GetMapping(value = "/addProduct")
public Object addProduct() {
Product product = new Product();
product.setDate(new Date());
product.setDescription("描述");
product.setName("名字");
product.setPrice(20);
productService.addProduct(product);
return "插入成功";
}
@GetMapping(value = "/getList")
public List<Product> getList() {
return productService.getProducts();
}
@GetMapping(value = "/{id}")
public Optional<Product> getProductById(@PathVariable Integer id) {
return productService.getProductById(id);
}
}
这样,我们重新编译运行即可。
访问:http://localhost:8082/product/addProduct 进行插入数据操作。
访问:http://localhost:8082/product/getList 获取数据库列表,返回的是JSON格式。
访问:http://localhost:8082/product/2 后面的是id,可以获取对应id的Product信息。
注意,如果表没创建,那么我们会自动创建表。
完整项目Github地址:https://github.com/jaychou2012/Spring-Boot-Web
参考文献:
【1】JPA.https://baike.baidu.com/item/JPA/5660672?fr=aladdin
【2】Spring Data JPA.http://projects.spring.io/spring-data-jpa/