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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值