spring jpa入门 常用api和注解

介绍常用的api和表关联、查询,本项目使用的springboot创建的。

一、在pom文件中添加


二、创建一个yml文件


三、创建一个jpa类继续JpaRepository接口,user是实体类。


四、发起请求获得数据


五、常用jpa

1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
2:CrudRepository :是Repository的子接口,提供CRUD的功能
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用来做负责查询的接口

6:Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可

六、常用的查询(关联查询)

在springjpa中如果名称用的规范,可以不用写实现类。



Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。
1:先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2:从右往左截取第一个大写字母开头的字符串此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user为查询实体的一个属性;
3:接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
4:可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDep_uuid()"
特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如:
Page<UserModel> findByName(String name, Pageable pageable);
List<UserModel> findByName(String name, Sort sort);

使用@Query
可以在自定义的查询方法上使用@Query来指定该方法要执行的查询语句,比如:
@Query("select o from UserModel o where o.uuid=?1")
public List<UserModel> findByUuidOrAge(int uuid);
注意:
1:方法的参数个数必须和@Query里面需要的参数个数一致
2:如果是like,后面的参数需要前面或者后面加“%”,比如下面都对:
@Query("select o from UserModel o where o.name like ?1%")
public List<UserModel> findByUuidOrAge(String name);
 
@Query("select o from UserModel o where o.name like %?1")
public List<UserModel> findByUuidOrAge(String name);
 
@Query("select o from UserModel o where o.name like %?1%")
public List<UserModel> findByUuidOrAge(String name);

六、表与表之间的关联

fetch属性是该实体的加载方式,有两种:LAZY和EAGER。
optional属性表示关联的实体是否能够存在null值。默认为true,表示可以存在null值。如果为false,则要同时配合使用@JoinColumn标记。
mappedBy  属性用于双向关联实体时,标注在不保存关系的实体中。
关联指定列(@JoinColumn)
@JoinColumn用于注释表中的字段,与@Column不同的是它要保存表与表之间关系的字段;
name属性是用来标记表中对应的字段的名称。如果不设置name的值,默认情况下,name的取值规则如下:
name=关联的表的名称 + "_" + 关联表主键的字段名
默认情况下,关联的实体的主键一般用来做外键的。如果不想用主键作为外键,则需要设置referencedColumnName属性,如:
@JoinColumn(name="address_id", referencedColumnName="ref_id")
@JoinColumn可以与@OneToOne、@ManyToOne或@ManyToMany标记同时使用。

@PrimaryKeyJoinColumn 主键关联表

一对一查询

@Entity
@Table(name="customer") //主表
public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;


        @OneToOne(casade={CascadeTypeType.ALL})
        @JoinColumn(name="address_id")//关联的表为address表,其主键是id
        private AddressEO address;
}
表结构如下
TABLE customer(id int, name varcher, address_id int, PRIMARY KEY id)//在customer中多了一个address_id属性

TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)

一对多(@OneToMany和@ManyToOne)
公司(组织)表相对于部门表是被控方,只需在被控方写mappedBy,其值为主控方中引用的外键对象的名称。
@Entity
@Table(name = "costume_organization")
public class Organization extends AbstractEntity {
    private static final long serialVersionUID = 1L;


    @Column(nullable = false, length = 50)
    private String name; // 组织名称


    @OneToMany(mappedBy = "organization")
    private Set<Department> departmentSet; // 部门集合

}

部门表相对于公司(组织)表是主控方,在主控方只需写@ManyToOne即可,其对象名为被控表中mappedBy中的值。
@Entity
@Table(name = "costume_department")
public class Department extends AbstractEntity {
    private static final long serialVersionUID = 1L;


    @Column(nullable = false, length = 50)
    private String name; // 部门名称


    @ManyToOne(optional = false)
    private Organization organization; // 组织外键


    @ManyToMany
    private Set<Member> memberSet; // 用户表外键


    public Organization getOrganization() {
        return organization;
    }


    @JsonBackReference
    public void setOrganization(Organization organization) {
        this.organization = organization;
    }
}
多对多(@ManyToMany)
@Entity
@Table(name = "costume_member")
public class Member extends AbstractEntity {
    private static final long serialVersionUID = 1L;


    @Column(nullable = false, length = 20)
    private String name;


    @ManyToMany
    @JoinTable(joinColumns = { @JoinColumn(name = "member_id") }, inverseJoinColumns = {
            @JoinColumn(name = "department_id") }) //被控方表字段名
    private Set<Department> departmentSet; // 部门表外键


    public Set<Department> getDepartmentSet() {
        return departmentSet;
    }


    @JsonBackReference
    public void setDepartmentSet(Set<Department> departmentSet)
    {
        this.departmentSet = departmentSet;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值