Spring Data JPA相关知识点

现在版本?

本文参考了Spring Data JPA官方文档,引用了部分文档的代码

据文章编辑时,Springboot的版本已经是v2.1.7.RELEASE,Spring Data的版本已经是Lovelace-SR10

Springboot

Spring Data
  • 使用Springboot,springboot将会替你选择最新的spring data模块(Spring Boot selects a recent version of Spring Data modules for you. If you still want to upgrade to a newer version, configure the property spring-data-releasetrain.version to the train name and iteration you would like to use.)。
image

image

Spring Data Jpa 是什么?

Spring Data JPA是更大的Spring Data系列的一部分,可以轻松实现基于JPA的存储库。此模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦。必须编写太多样板代码来执行简单查询以及执行分页和审计。Spring Data JPA旨在通过减少实际需要的工作量来显着改善数据访问层的实现。作为开发人员,您编写存储库接口,包括自定义查找器方法,Spring将自动提供实现。

代码层面

实体类

package me.superning.tmall.pojo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
@Entity
@Table(name = "category")
//表名(严格区分大小写)
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class Category  implements Serializable {

    @Id
//    主键使用这个注解
    @GeneratedValue(strategy = GenerationType.IDENTITY)
//    自增长策略
    @Column(name = "id")
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  • 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表
  • 2.@Table:设置实体类在数据库所对应的表名
  • 3.@Id:标识类里所在变量为主键
  • 4.@GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库
  • 5.@Basic:表示简单属性到数据库表字段的映射(几乎不用)
  • 6.@Column:表示属性所对应字段名进行个性化设置
  • 7.@Transient:表示属性并非数据库表字段的映射,ORM框架将忽略该属性(在与密码有关的实体类会用到这个注解,后续详解于另一篇文章)

常用的注解如上,其他注解可能会以独立文章讲解。

持久层

Spring data的中央接口是Repository,
它还提供了扩展了持久层技术的接口例如
CrudRepository
MongoRepository
JpaRepository
中央接口

CrudRepository和JpaRepository之间的区别

image

从上图你可以看出JpaRepository 继承了PagingAndSortingRepository,相应的也继承了CrudRepository

  • CrudRepository 主要提供了CRUD的方法功能
  • PagingAndSortingRepository,提供了分页和排序记录的方法
  • JpaRepository 则拥有了它们两个所有的方法功能,并扩展了其他方法

用法

public interface OrderItemDAO 
extends JpaRepository<OrderItem,Integer>
{
    List<OrderItem> findByOrderOrderByIdDesc(Order order);
}
由代码可知,Dao接口首先继承一个JpaRepository接口,
JpaRepository<T, ID> T是泛型,ID是主键的类型。
接口本身已经为我们提供了基础的CRUD方法,但有时我们有
一些特殊的查询,接口无法为我们提供,这时就需要我们进行特殊参数处理。
特殊参数处理
Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

关于使用@Query("sql语句")在dao层的方法上写原生sql语句,
以后以独立文章介绍

关系映射

借鉴这位先生的csdn博客以及自我理解结合而成

  • 一对一
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="addressID")//注释本表中指向另一个表的外键。
public Address getAddress() { 
    return address;
}
现假设有Person表和Address表,是一对一的关系,
在Person中有一个指向Address表主键的字段addressID,
所以主控方一定是Person,所谓主控方就是能改变关联关系的一方,
Person只要改变addressID就改变了关联关系,所以Person是主控方,
所以@JoinColumn写在Person类中
  • 一对多单向

假如现在有Person表和Country表,那么一定是Person表中有country_id字段,由于我们是一对多的关系,所以站在一的角度,也就是Country的角度,在Country类中加入@JoinColumn


@OneToMany(cascade=CascadeType.ALL) 
@JoinColumn(name="country_id")//注释的是另一个表指向本表的外键。 
public List<Person> getPersons() {
    return persons; 
}

在一对多单向关系中,多的一方(Person)没有注解,一的一方(Country)有注解,如果一的一方不加@JoinColumn指定外键字段的话,Hibernate会自动生成一张中间表Country_PERSON来对Person和Country进行绑定。

  • 多对一单向

一个产品可以属于多个分类,因此@JoinColumn放在Product类中

image

看看数据库

image

可以看到在Product表出现了一个对应Category表的外键
但是Category表中却没有外键,因此这就是单向的多对一
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容