JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。
注意:JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现。
CREATE DATABASE IF NOT EXISTS springboot_project DEFAULT CHARSET utf8;
首先我们在pom.xml中引入jpa的依赖:
org.springframework.boot
spring-boot-starter-data-jpa
然后引入mysql连接和druid连接池:
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.0.29
当然我们最后需要Controller层做个简单的测试,所以把web依赖也引入进来:
org.springframework.boot
spring-boot-starter-web
在application-dev.properties文件配置mysql的驱动类、数据库连接地址、账号、密码以及ddl策略:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_project
spring.datasource.username=root
spring.datasource.password=Anbang713
spring.jpa.hibernate.ddl-auto:create
spring.jpa.show-sql:true
通过@Entity表明这是一个映射的实体类,@Id表明这是主键id,@GeneratedValue表明主键自动生成。
@Entity
public class Student {
@Id
@GeneratedValue
private Integer id;
private String name;
private String cardNum;
// 省略getter和setter
}
数据访问层,通过编写一个继承自 JpaRepository 的接口就能完成数据访问,其中包含了几本的单表查询的方法,非常的方便。值得注意的是,这个Student是对象名,而不是具体的表名,另外Interger是主键的类型,一般为Integer或者Long。
public interface StudentDao extends JpaRepository {
}
public interface StudentService {
List findAll();
Student findById(Integer id);
Integer save(Student entity) throws Exception;
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public List findAll() {
return studentDao.findAll();
}
@Override
public Student findById(Integer id) {
Optional students = studentDao.findById(id);
if (students.isPresent() && students.get() != null) {
return students.get();
}
return null;
}
@Override
public Integer save(Student entity) throws Exception {
if (entity.getId() != null) {
Student perz = studentDao.saveAndFlush(entity);
return perz.getId();
}
Student perz = studentDao.save(entity);
return perz.getId();
}
}
@RestController
@RequestMapping("/student/*")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("findAll")
public List findAll() {
return studentService.findAll();
}
@RequestMapping(value = "{id}", method = RequestMethod.GET)
public Student findById(@PathVariable("id") Integer id) {
return studentService.findById(id);
}
@RequestMapping(value = "save", method = RequestMethod.POST)
public Integer save(@RequestBody Student entity) throws Exception {
return studentService.save(entity);
}
}
至此,我们所有的编码都已经实现了,我们的整个代码结构看起来是这样的:
启动springboot入口类,可以看到日志输出,由于我们配的ddl策略是create,所以会先删除表再创建相关表。
源代码地址:https://gitee.com/chengab/SpringBoot/tree/master/springboot/src/main/java/com/study/springboot/jpa
参考博客: SpringBoot非官方教程 | 第四篇:SpringBoot 整合JPA