【SpringBoot】SpringBoot JPA 基础操作(CURD)

SpringData JPA

基本介绍

Spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。

同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

Springboot配置

yml 复制代码
spring:
  # 数据源
  datasource:
    # mysql 驱动
    driver-class-name: com.mysql.jdbc.Driver
    # 数据库地址
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8
    # 数据库用户名
    username: root
    # 数据库密码
    password: 123456
  jpa:
    hibernate:
      # 启动数据库创建新的表
      ddl-auto: update
    # 控制台显示SQL
    show-sql: true

配置文件

hibernate.hbm2ddl.auto 参数的作用主要用于:自动创建、更新、验证数据库表结构,有四个值。

参数名 说明
create 每次加载 Hibernate 时都会删除上一次生成的表,然后根据 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行, 这就是导致数据库表数据丢失的一个重要原因。
create-drop 每次加载 Hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
update 最常用的属性,第一次加载 Hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库), 以后加载 Hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。 要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate 每次加载 Hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

JPA相关注解

注解 解释
@Entity 声明类为实体或表。
@Table 声明表名。
@Basic 指定非约束明确的各个字段。
@Embedded 指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id 指定的类的属性,用于识别(一个表中的主键)。
@GeneratedValue 指 定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。
@Transient 指定的属性,它是不持久的,即:该值永远不会存储在数据库中。
@Column 指定持久属性栏属性。
@SequenceGenerator 指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator 指定持久属性栏属性。
@Column 指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@AccessType 指定持久属性栏属性。
@Column 这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),则可以直接访问变量并且不需要getter和setter,但必须为public。 如果设置@AccessType(PROPERTY),通过getter和setter方法访问Entity的变量。
@JoinColumn 指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@UniqueConstraint 指定的字段和用于主要或辅助表的唯一约束。
@ColumnResult 参考使用select子句的SQL查询中的列名。
@ManyToMany 定义了连接表之间的多对多一对多的关系。
@ManyToOne 定义了连接表之间的多对一的关系。
@OneToMany 定义了连接表之间存在一个一对多的关系。
@OneToOne 定义了连接表之间有一个一对一的关系。
@NamedQueries 指定命名查询的列表。
@NamedQuery 指定使用静态名称的查询。

小栗子

新增、修改、删除、查询、分页查询等基础操作。

dao 层

java 复制代码
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

实体类

java 复制代码
@Data
@Entity
@Table(name = "book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "book_name")
    private String bookName;
    @Column(name = "author")
    private String author;
    @Column(name = "create_time")
    private Date createTime;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

新增

java 复制代码
@Test
public void saveBook(){
        Book book=new Book();
        book.setBookName("Helo");
        book.setAuthor("ddddd");
        book.setCreateTime(new Date());
        System.out.println(bookRepository.save(book));
        }

修改

java 复制代码
@Test
public void updateBook(){
        Book book=new Book();
        book.setId(1L);
        book.setBookName("Helo222");
        book.setAuthor("ddddd222");
        book.setCreateTime(new Date());
        System.out.println(bookRepository.saveAndFlush(book));
        }

删除

java 复制代码
@Test
public void deleteBookById(){
        bookRepository.deleteById(1L);
        System.out.println(bookRepository.findAll());
        }

查询数量

java 复制代码
/**
 * 统计数量
 */
@Test
public void getBookCount(){
        System.out.println(bookRepository.count());
        }

查询所有

java 复制代码
/**
 * 查询全部图书信息
 */
@Test
public void findAllBook(){
        System.out.println(bookRepository.findAll());
        }

分页查询

java 复制代码
 /**
 * 分页查询
 */
@Test
public void findBookByPage(){
        Pageable pageable=PageRequest.of(1,3,Sort.by(Sort.Order.desc("id")));//分页排序
        Page<Book> page=bookRepository.findAll(pageable);
        page.forEach(System.out::println);
        }
相关推荐
Dovis(誓平步青云)23 分钟前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
Lhappy嘻嘻8 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
To_OC8 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
伊玛目的门徒8 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇10 小时前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚11 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我1234512 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑13 小时前
Sentinel安装
java·后端·微服务
IT_陈寒13 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_49213 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端