Spring Data JPA学习
一、Spring Data JPA
1、简介
(1)官网地址:
https://spring.io/projects/spring-data-jpa
参考文档:
https://docs.spring.io/spring-data/jpa/docs/2.2.3.RELEASE/reference/html/#preface
(2)基本介绍:
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范封装的一套 JPA 框架。使开发者通过极简的代码实现对数据库的访问和操作。
注:
ORM 框架:指的是 Object Relational Mapping,即对象关系映射。采用元数据来描述对象和关系映射的细节。
元数据:一般采用 XML 文件的形式。常见 ORM 框架如:mybatis、Hibernate。
JPA:指的是 Java Persistence API,即 Java 持久层 API。通过 xml 或注解的映射关系将运行期的实体对象持久化到数据库中。
2、sping boot 项目中使用
(1)在 pom.xml 文件中引入依赖
【pom.xml】 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
(2)在 application.properties 中配置
【application.properties】 # jpa 配置 # 配置数据库为 mysql spring.jpa.database=mysql # 在控制台打印 sql 语句 spring.jpa.show-sql=true # 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新 spring.jpa.hibernate.ddl-auto=update # 每次运行该程序,没有表格会新建表格,表内有数据会清空 #spring.jpa.hibernate.ddl-auto=create
二、基本注解
1、@Entity
@Entity 写在类上,用于指明一个类与数据库表相对应。 属性: name,可选,用于自定义映射的表名。若没有,则默认以类名为表名。 【举例1:默认类名为表名】 import javax.persistence.Entity; @Entity public class Blog { } 【举例2:自定义表名】 import javax.persistence.Entity; @Entity(name="t_blog") public class Blog { }
2、@Table
@Table 写在类上,一般与 @Entity 连用,用于指定数据表的相关信息。 属性: name, 对应数据表名。 catalog, 可选,对应关系数据库中的catalog。 schema,可选,对应关系数据库中的schema。 【举例:】 import javax.persistence.Entity; import javax.persistence.Table; @Entity(name = "blog") @Table(name = "t_blog") public class Blog { } 注:若 @Entity 与 @Table 同时定义了 name 属性,那以 @Table 为主。
3、@Id、@GeneratedValue
@Id 写在类中的变量上,用于指定当前变量为主键 Id。一般与 @GeneratedValue 连用。 @GeneratedValue 与 @Id 连用,用于设置主键生成策略(自增主键,依赖数据库)。 注: @GeneratedValue(strategy = GenerationType.AUTO) 主键增长方式由数据库自动选择,当数据 库选择AUTO方式时就会自动生成hibernate_sequence表。 @GeneratedValue(strategy = GenerationType.IDENTITY) 要求数据库选择自增方式,oracle不 支持此种方式,mysql支持。 @GeneratedValue(strategy = GenerationType.SEQUENCE) 采用数据库提供的sequence机制生 成主键,mysql不支持。 【举例:】 package com.lyh.blog.bean; import lombok.Data; import javax.persistence.*; @Entity @Table(name = "t_blog") @Data public class Blog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; }
4、@Column
@Column 写在类的变量上,用于指定当前变量映射到数据表中的列的属性(列名,是否唯一,是否允许为空,是否允许更新等)。 属性: name: 列名。 unique: 是否唯一 nullable: 是否允许为空 insertable: 是否允许插入 updatable: 是否允许更新 length: 定义长度 【举例:】 import lombok.Data; import javax.persistence.*; @Entity @Table(name = "t_blog") @Data public class Blog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name", length = 36, unique = false, nullable = false, insertable = true, updatable = true) private String name; }
5、@Temporal
@Temporal 用于将 java.util 下的时间日期类型转换 并存于数据库中(日期、时间、时间戳)。 属性: TemporalType.DATE java.sql.Date日期型,精确到年月日,例如“2019-12-17” TemporalType.TIME java.sql.Time时间型,精确到时分秒,例如“2019-12-17 00:00:00” TemporalType.TIMESTAMP java.sql.Timestamp时间戳,精确到纳秒,例如“2019-12-17 00:00:00.000000001” 【举例:】 package com.lyh.blog.bean; import lombok.Data; import javax.persistence.*; import java.util.Date; @Entity @Table(name = "t_blog") @Data public class Blog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name", length = 36, unique = false, nullable = false, insertable = true, updatable = true) private String name; @Temporal(TemporalType.TIMESTAMP) private Date createTime; @Temporal(TemporalType.DATE) private Date updateTime; }
6、级联(cascade)
对于 @OneToOne、@ManyToMany、@OneToMany等映射关系,涉及到级联的操作。 CascadeType[] cascade() default {}; 定义级联用于 给当前设置的实体 操作 另一个关联的实体的权限。 【级联的类型:】 package javax.persistence; public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH; private CascadeType() { } } CascadeType.ALL 拥有所有级联操作的权限。 CascadeType.PERSIST 当前实体类进行保存操作时,同时保存其关联的实体。 CascadeType.MERGE 当前实体数据合并时,会影响其关联的实体。 CascadeType.REMOVE 删除当前实体,与其相关联的实体也会被删除。 CascadeType.REFRESH 刷新当前实体,与其相关联的实体也会被刷新。 CascadeType.DETACH 去除外键关联,当删一个实体时,存在外键无法删除,使用此级联可以去除外键。
7、mappedby
只有 @OneToOne, @OneToMany, @ManyToMany上才有 mappedBy 属性,@ManyToOne不存在该属性。 该属性的作用: 设置关联关系。单向关联关系不需要设置,双向关系必须设置,避免双方都建立外键字段。 对于 一对多 的关系,外键总是建立在多的一方(用到@JoinColumn),而 mappedBy 存在相反的一方。 比如: 部门(department)与 员工(Employee) 一个部门对应多个员工。一个员工属于一个部门。 即部门与员工间的关系是 一对多 的关系。 【举例:】 public class Department { @OneToMany(mappedBy = "bookCategory", cascade = CascadeType.ALL) private List<Employee> employee; } public class Employee { @ManyToOne private Department department; }
8、@OneToOne
@OneToOne 用于描述两个数据表间 一对一的关联关系。 【属性:】 cascade, 用于定义级联属性 fetch, 用于定义 懒加载(LAZY,不查询就不加载)、热加载(EAGER,默认) mappedBy, 用于定义 被维护的表(相关联的表) optional, 用于定义 是否允许对象为 null。