Spring Data JPA学习笔记


Spring Data JPA

JPA字面意思是JAVA持久层API,JPA定义了一系列标准,建立了实体类和数据库中表的一个映射关系,使得开发人员只需要操作实体类就能够起到操作数据库的效果,比如Hibernate就是一个实现了JPA
的一个持久层框架,而Spring Data JPA则再Hibernate的基础之上进行了进一步封装实现,开发人员只需遵循规范便可以轻易的操作数据库,极大提高了开发效率

环境搭建

  • 通过DBeaver连接本地创建pg数据库test,创建若干表,插入模拟数据
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 创建springboot项目,导入spring data jpa 核心依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
  • 编写配置文件
# 配置服务端口
server.port=8080   

# 配置PG数据库连接信息
spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password=rainhey123456
spring.datasource.driver-class-name=org.postgresql.Driver

# 当服务首次启动会在数据库中生成相应表,后续启动服务时如果实体类有增加属性会在数据中添加相应字段,原来数据仍在
spring.jpa.hibernate.ddl-auto=update
# 执行数据库操作的时候会在控制台打印 sql 语句
spring.jpa.show-sql=true

  • 创建对应数据库user表的实体类 User,Blog
package com.rainhey.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@AllArgsConstructor
@NoArgsConstructor


//用来注解该类是一个实体类用来进行和数据库中的表建立关联关系,首次启动项目的时候,默认会在数据中生成一个同实体类相同名字的表
@Entity

// 该注解可以用来关联数据库中对应的表
@Table(name = "user",schema = "public")

public class User {
    @Id  //表明该属性字段对应数据库主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 主键生成策略,IDENTITY为主键自增策略
    private Integer id;
    
    private String username;
    
    private String password;
    
    private String address;
    
    private Integer salary;
}

@Entity
@Table(name = "blog",schema = "public")
@Data
public class Blog {

    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String content;

    @Temporal(TemporalType.TIMESTAMP)  // Temporal用来设置Date类型的属性映射到对应精度的字段
    private Date updateTime;
}

基本CRUD

  • 编写自己的接口 UserRepository 继承 JpaRepository,其中 JpaRepository 的第一个泛型类型对应其要操作的实体类的类型,第二个泛型类型对应要操作的实体类的主键类型
@Component
public interface UserRepository extends JpaRepository<User,Integer> {

}

  • 框架底层已经做好了基本CURD的实现,测试
	@Test
    public void insert(){
        Blog blog = new Blog();
        blog.setId(8L);
        blog.setContent("hello");
        blog.setTitle("this is title");
        blog.setUpdateTime(new Date());
        Blog save = blogRepository.save(blog);
        System.out.println(save);
    }

    @Test
    public void delete(){
        blogRepository.deleteById(12L);
    }

    @Test
    public void update(){
        Blog blog = new Blog();
        blog.setId(4L);
        blog.setContent("test");
        blog.setTitle("this is title");
        blog.setUpdateTime(new Date());
        Blog save = blogRepository.save(blog);
        System.out.println(save);
    }

    @Test
    public void find(){
        List<Blog> all = blogRepository.findAll();
        System.out.println(all);
    }

分页,排序

public void userPage(Integer page,Integer size){

        Sort sort= Sort.by(Sort.Direction.DESC,"salary");
        Iterable<User> users = userPageRepository.findAll(sort);
        System.out.println(users);

        System.out.println("=================");

        Pageable pageable= PageRequest.of(page, size, sort);
        Page<User> all = userPageRepository.findAll(pageable);
        List<User> content = all.getContent();
        System.out.println(content);
    }

基于规则自定义方法

Spring Data JPA允许开发者通过遵循一定的规则在接口内自己定义具有某种功能的方法,由Spring Data JPA根据方法名来推测开发者想要实现的功能,并进行自动实现,如以下自定义的方法

@Component
public interface UserRepository extends JpaRepository<User,Integer> {

    List<User> findUserByAddress(String string);

    List<User> findByAddressAndUsername(String address,String username);

    List<User> findByAddressOrUsername(String address,String username);

    List<User> findDistinctUserByAddress(String address);

    List<User> findUserByAddressOrderBySalaryDesc(String address);

    Page<User> findUserByAddress(String address,Pageable pageable);

    List<User> findUserByaddress(String address, Sort sort);

    List<User> findTop2ByAddressOrderBySalaryDesc(String address);

    List<User> findByAddressLike(String a);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基于Query注解方法

  • 基本用法
@Component
public interface UserRepository extends JpaRepository<User,Integer> {

    @Query(value = "select u from User u where u.id = ?1")
    List<User> finds(Integer id);
    
	@Query(value = "SELECT * FROM user WHERE id=?1",nativeQuery = true)
    List<User> find11(Integer id);
}

  • @query注解详解,一般value、countQuery、nativeQuery三个的值用的较多
public @interface Query {
    String value() default "";  // 指定JPQL的查询语句。(nativeQuery=true的时候,是原生的Sql语句)

    String countQuery() default "";   // 指定count的JPQL语句,如果不指定将根据query自动生成。如果当nativeQuery=true的时候,指的是原生的Sql语句)

    String countProjection() default "";

    boolean nativeQuery() default false;  // 默认是false,表示value里面是不是原生的sql语句

    String name() default "";

    String countName() default "";
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值