0%

Spring Data JPA的Repository操作数据库

Repository

  • 注解:@EnableJpaRepositories,在SpringBoot项目的Main函数上添加该注解,SpringBoot就会自动的查找实现了Jpa的Repository<T, ID>接口并将其托管

  • Repository<T, ID>接口

    1. CrudRepository<T, ID>
    2. PagingAndSortingRepository<T, ID>
    3. JpaRepository<T, ID>

    在这里实现了这三个接口,只需要指定仓储的实体类型和ID类型,Jpa就会自动地帮我们实现对应实体类的操作数据库的方法。

定义查询

  • 根据方法名定义查询
    1. find…By…/read…By…/query…By…/get…By…,用于查询
    2. count…By…,用于计数
    3. …OrderBy…[Asc/Desc],用于排序
    4. And/Or/IgnoreCase,多条件Sql
    5. Top+数字/First/Distinct,Top/First查询

分页查询

  • PagingAndSortingRepository<T, ID>:用于分页的Repository接口
  • Pageable/Sort:分页信息实体和排序信息实体
  • Slice/Page

常用注解

  • @Entity,标记被注解的类是实体类,可被ORM框架用于持续化,常与@Table一起使用,指定关联的数据库表。该注解仅包含name属性,用于指明实体的名字,不指定时默认是实体类的名字,实体名可用于查询语句中。

  • @Table,该属性与@Entity一起使用,用来描述实体对应的数据库表,其name属性指定实体对应的数据库名,name属性用的较多,catalog和schema属性指定数据表所在目录名或数据库名,跟具体使用数据库相关,uniqueConstraints属性用来对数据表列唯一性做限制,index属性用来描述索引字段,实际使用根据具体需求来配置。

  • @Id,被该属性标注的实体字段被标记为数据表的主键,与@Column, @GeneratedValue一起配合使用用来描述主键字段,如下实例,People类的id被映射成主键,对应字段名为pid,ORM框架依据具体使用的数据库使用对应的主键生成策略。

  • @Column,用来描述实体属性对应数据表字段,其中name、nullable、unique、length属性用的较多,分别用来描述字段名、字段是否可以null、字段是否唯一、字段的长度,实际开发中需要用其他属性时,可从参考文献获取api文档地址,查阅文档配置。

  • @GeneratedValue,用来描述主键生成策略,包含如下策略:GenerationType.TABLE:ORM框架通过数据库的一张特定的表格来生成主键,该策略一般与另外一个注解@TableGenerator一起使用,@TableGenerator对这张特定的表进行描述,该策略的好处就是不依赖于外部环境和数据库的具体实现,在不同数据库间可以很容易的进行移植,但由于其不能充分利用数据库的特性,一般不会优先使用。

  • @OneToOne,两实体一对一关系,例如雇员和工作证就是一对一关系,一个雇员只能有一个工作证,一个工作证只能属于一个雇员。

    单向关联:查询包含关联属性的实体对象时,能同步从数据库中获取关联的实体对象,反过来不行。

    双向关联:包含外键定义的实体是拥有关系实体,在关联的非拥有关联实体中,需要用注解的mappedBy属性指明拥有关系实体的关联属性名

    顺带说明下@OneToOne注解中的fetch、cascade属性的意义,@OneToMany、@ManyToOne、@ManyToMany同样具有这两个属性,意义是相同的。fetch属性指明数据抓取策略,EAGER即立即抓取,LAZY延迟加载,指明关联实体对象获取策略。

    cascade属性指明级联特性:

    CascadeType.PERSIST:级联持久化操作,当将实体保存至数据库时,其对应的关联实体也会被保存至数据库;

    CascadeType.REMOVE:级联删除操作,从数据库删除当前实体时,关联实体也会被删除;

    CascadeType.DETACH:级联脱管,当前实体被ORM框架脱管,关联实体也被同步脱管,处于脱管状态的实体,修改操作不能持久化到数据库;

    CascadeType.MERGE:级联合并操作,脱管实体状态被复制ORM框架管理的对应同一条数据库记录的实体中,关联的实体同样执行复制操作。

  • @OneToMany和@ManyToOne,两实体一对多关系,例如人和电话就是一对多关系,一个人可以有多个电话,一个电话只能属于一个人。

    单向关联:例如电话实体类包含人实体类属性,在查询电话实体对象时,能获取到对应的人实体,相反是不行的,查询人实体对象时不能获取到其电话实体;

    当实体间关系是双向的:每个实体类都有一个属性指向关联的实体对象,one端实体可以用@OneToMany注解many端实体属性,many端实体可以通@ManyToOne注解one端实体属性。

  • @ManyToMany,两实体多对多关系,例如学生和所选课程的关系,一个学生可选多个课程,一个课程可被多个学生选,单向关联类同@OneToOne、@OneToMany,查询拥有关系的实体时,才能获取关联实体对象,反之不行;双向关联,任何一方都可以成为关系拥有方法,非关系拥有方需要用mapped属性标明关系拥有方实体对应属性字段,ManyToMany关系数据库层是通过关联表的方式连接两实体对应的数据表,在用@ManyToMany时,可同步用@JoinTable注解指明关联表名及其字段。

  • @Temporal

    用于将java.util.Date和java.util.Calendar的实体属性的持久化,其属性参数value包含如下三种取值:

    TemporalType.DATE,持久化时按照java.sql.Date类型来持久化,即只保存年月日yyyy-MM-dd;

    TemporalType.TIME,持久化时按照java.sql.Time类型来持久化,即只保存时分秒HH:MM:SS;

    TemporalType.TIMESTAMP,持久化时按照java.sql.Timestamp类型来持久化,即保存年月日时分秒yyyy-MM-dd hh:MM:ss。

-------------本文结束感谢您的阅读-------------