一、介绍
JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象和关系表的映射关系,并将运行期的实体对象持久化到数据库中。
二、优势
- 标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
- 容器级特性的支持
JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
- 简单方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
- 查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
- 高级特性
JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
三、代码实战
- 创建数据库/表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(20) NOT NULL,
`stu_no` BIGINT NOT NULL COMMENT '学号',
`create_time` datetime COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student`(`name`, `stu_no`) VALUES
('aaa', 1001),
('bbb', 1002),
('ccc', 1003);
- POM添加相关依赖
<!-- 添加spring-boot-starter-jdbc依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 添加mysql连接依赖
<!-- 添加spring-boot-starter-jdbc依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置数据源,新建application-db.properties,在application.properties中引用:
- application-db.properties
#数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.20:3306/first?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
spring.datasource.username=root
spring.datasource.password=meetyou
#jpa
spring.jpa.hibernate.ddl-auto=update #当value为create,每次启动工程会重新新建表
spring.jpa.show-sql=true #打印sql
- application.properties
spring.profiles.include = db
- 创建实体
@Data //lombok 注解,自动生成get/set/toString等方法
@Entity
public class Student {
@Id //标注为主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//使用自增主键
private int id;
private String name;
private Long stuNo;
private Date createTime;
}
- Dao操作类
JpaRepository泛型,T为实体类, ID为类型
public interface StudentDao extends JpaRepository<Student, Integer> {
}
- Service服务类
- StudentService
public interface StudentService {
/**
* 查询全部学生
* @return
*/
List<Student> queryList();
/**
* 根据ID查询
* @return
*/
Student getById(Integer id);
/**
* 修改全部学生
* @return id
*/
int update(Student student);
/**
* 增加学生
* @return id
*/
int add(Student student);
}
- StudentServiceImpl
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
public List<Student> queryList() {
return studentDao.findAll();
}
@Override
public Student getById(Integer id) {
return studentDao.findById(id).get();
}
@Override
public int update(Student student) {
Student result = studentDao.saveAndFlush(student);
return result.getId();
}
@Override
public int add(Student student) {
student.setStuNo(System.currentTimeMillis());
student.setCreateTime(new Date());
Student result = studentDao.save(student);
return result.getId();
}
}
- Controller
@RestController
public class StudentController {
@Autowired
StudentService studentService;
@GetMapping("stu/list")
public R.Result queryList(){
return R.success(studentService.queryList());
}
@GetMapping("stu/{id}")
public R.Result getById(@PathVariable("id") Integer id){
return R.success(studentService.getById(id));
}
@PostMapping("stu")
public R.Result add(@RequestBody Student student){
return R.success(studentService.add(student));
}
@PutMapping("stu")
public R.Result update(@RequestBody Student student){
return R.success(studentService.update(student));
}
}
资料下载
- 源码地址:my-spring-boot
- 对应分支:5-jpa
- postman测试文件目录:src\main\resources\stu\springboot.postman_collection.json