一、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。
本文精炼介绍了SpringDataJPA的基本概念、在SpringBoot项目中的应用及关键注解,如@Entity、@Table、@Id、@GeneratedValue、@Column、@Temporal、级联操作、mappedby和@OneToOne,帮助读者快速掌握核心知识点。
6475

被折叠的 条评论
为什么被折叠?



