spring boot教程--集成JPA
一、JAP介绍
1.什么是JPA
全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。
为我们提供了:
- ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
如:@Entity、@Table、@Column、@Transient等注解。
2. JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
如:entityManager.merge(T t);
3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
如:from Student s where s.name = ?
JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。
2.什么是spring data jpa
spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。
Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。
二、具体配置与使用
1.配置依赖
添加Spring Data JPA 和 MySQL Connector,配置pom.xml文件,代码如下:
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- spring data jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.yml配置文件中配置jpa信息
spring:
#数据库配置信息
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/deformation?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
#jpa配置信息
jpa:
hibernate:
ddl-auto: update
show-sql: true
database: mysql
properties:
hibernate:
format_sql: true
配置信息说明 :
- hbm2ddl.auto:自动创建|更新|验证数据库表结构
- show-sql:打印sql语句,方便调试
- database:指定数据库类型,本示例指定的是mysql
hbm2ddl.auto有四个属性:
-
create:每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。[删除-创建-操作]
-
create-drop:每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。[删除-创建-操作-再删除]
-
update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。[没表-创建-操作 | 有表-更新没有的属性列-操作]
4.validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。[启动验证表结构,验证不成功,项目启动失败]
3.实体类代码
新建实体类:
在包com.core.deformation.domain下新建实体Project.java
- 实体类需要使用 @Entity 注解标注
- 需要对实体类的属性进行标注,使用 @Id 标注主键
- 使用 @Column 标注非主键
package com.core.deformation.domain;
import org.hibernate.annotations.GenericGenerator;
import sun.security.util.Length;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name = "t_project")
@GenericGenerator(name ="jpa-uuid", strategy = "uuid")
public class Project {
@Id
@GeneratedValue(generator = "jpa-uuid")
@Column(length = 32)
private String projectId;
@Column(length = 50)
private String projectName;
@Column(length = 32)
private String companyId;
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;
@Temporal(TemporalType.TIMESTAMP)
private Date modifyTime;
@Column(length = 32)
private String createId;
//get set部分省略
@Override
public String toString() {
return "Project{" +
"projectId='" + projectId + '\'' +
", projectName='" + projectName + '\'' +
", companyId='" + companyId + '\'' +
", createTime=" + createTime +
", modifyTime=" + modifyTime +
", createId='" + createId + '\'' +
'}';
}
}
4.生成数据库表结构
i.运行项目,生成数据库表结构
查看控制台日志会输出如下内容:
Hibernate:
create table t_project (
project_id varchar(32) not null,
company_id varchar(32),
create_id varchar(32),
create_time datetime,
modify_time datetime,
project_name varchar(50),
primary key (project_id)
) engine=MyISAM
ii.查看数据表信息:
5.Repository层代码
在包com.core.deformation.repository下新建接口ProjectRepository.java并继承JpaRepository<T, ID> ,JpaSpecificationExecutor,具体代码如下:
package com.core.deformation.repository;
import com.core.deformation.domain.Project;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface ProjectRepository extends JpaRepository<Project,String>,
JpaSpecificationExecutor<Project> {
}
6.测试Repository
i.测试添加
/**
* 添加单元测试
*/
@Test
public void testSave() {
//String uuid = UUID.randomUUID().toString().replace("-","");
//System.out.println(uuid);
Project project = new Project();
project.setProjectId(UUIDUtil.getUUIDDispose());
project.setCompanyId(UUIDUtil.getUUIDDispose());
project.setCreateId(UUIDUtil.getUUIDDispose());
project.setProjectName("测试项目一");
project.setCreateTime(new Date());
project.setModifyTime(new Date());
Project entity = projectRepository.save(project);
assert (entity.getProjectName().equals("测试项目一"));
}
运行添加测试方法后,数据库会添加一条相应的数据,如下图所示:
ii.测试简单查询
/**
* 根据ID查询实体
*/
@Test
public void testFindById() {
Optional<Project> optional = projectRepository.findById("4028810d7034c62b017034c636a70000");
Project project = optional.get();
System.out.println(project.toString());
assert (project.getProjectName().equals("测试项目一"));
}
iii.测试更新
@Test
public void testUpdate() {
Optional<Project> optional = projectRepository.findById("4028810d7034c62b017034c636a70000");
Project project = optional.get();
System.out.println("更新前数据:"+project.toString());
project.setProjectName("测试项目二");
projectRepository.save(project);
System.out.println("更新后数据:"+project.toString());
assert (project.getProjectName().equals("测试项目二"));
}
到止,JPA的基本使用方法已完,后续会陆续更新spring boot其他部分的内容。