快速入门Spring Data JPA

news2024/11/18 4:33:31

Spring Data JPA是Spring Data框架的一小部分,它能够让开发者能够更加简单的对数据库进行增删改查。

由于Spring Data JPA可以自动生成SQL代码所以一般情况下,简单的增删查改就可以交给Spring Data JPA来完成,而复杂的动态SQL等用MyBatis来完成。

Spring Data JPA的入门非常简单,接下来请看正文(我使用的是MySQL数据库):

快速入门Spring Data JPA

首先我们先创建一个数据库和表,创建数据库和表的SQL代码如下:

-- 如果存在text数据库就删除该数据库
drop database if exists text;
-- 创建名为text的数据库
create database text charset utf8;

use text;

-- 用户表
create table user_info(
    id INT(11) primary key AUTO_INCREMENT,
    user_name VARCHAR(20) NOT NULL,
    gender INT(1) NOT NULL COMMENT '0.男;1.女',
    create_time DATETIME
);

创建一个空的Spring项目,我使用的是Spring Boot创建的项目。pom文件中引入的依赖如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--lombook:用来自动生成get,set,toString和构造方法等-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--MySQL驱动-->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--Spring Data JPA依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

</dependencies>

因为Spring Boot默认支持的数据库是H2,所以如果想要使用其他的数据库就必须配置application.properties文件,所以在依赖引入之后还需要修改配置文件,配置文件中除了设置数据库的配置之外还需要设置JPA的配置,但是这个配置也非常简单,只有一行,代码如下:

spring.jpa.hibernate.ddl-auto=update
#设置显示SQL代码
spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto的取值值有4种:

  • none: MySQL默认的配置。不能修改数据库结构;
  • update: Hibernate能够根据给定实体类结构来修改数据库;
  • create: 每次都创建数据库,但是在关闭后并不进行删除;
  • create-drop: 创建数据库,并且当SessionFactory关闭时删除它。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。

创建JAVA实体类:

package com.example.spring.jpa;

import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

@Data
@Entity
@Table(name = "user_info")
public class UserInfo {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name="user_name")
    private String userName;

    @Column(name="gender")
    private Integer gender;

    @Column(name="create_time")
    private Date createTime;
}

@Data: 该注解是Lombook的注解,添加这个注解后程序会在编译阶段自动生成get,set,toString,无参构造方法等基础方法。

@Entity: 该注解表示这个类是一个JPA实体。

@Table: 该注解表示这个实体和数据库中表的对应关系。如果没有该注解就默认对应的数据库中表的名称为类名即:UserInfo。name属性的值为数据库中对应的表名。

@Id: 表示该属性为主键。

@Column: 该注解表示这个属性和数据库中字段的对应关系。name属性的值为数据库中对应的字段名。如果没有该注解则默认属性名就是字段名。

@GeneratedValue: 提供主键值的生成策略规范。有四种取值默认为AUTO即自动生成ID。

编写持久层的代码,只需要加上@Repository注解并继承CrudRepository接口,接口传的类型为<实体类型,主键类型>:

package com.example.spring.jpa;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<UserInfo, Integer> {
}

编写业务逻辑层代码:

package com.example.spring.jpa;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class JpaService {
    @Resource
    private UserRepository userRepository;
    //添加数据
    public Object insertUserInfo(UserInfo userInfo) {
        return userRepository.save(userInfo);
    }
    //根据id删除数据
    public void deleteUserInfo(Integer id) {
        userRepository.deleteById(id);
    }
    //修改数据
    public Object update(UserInfo userInfo) {
        return userRepository.save(userInfo);
    }
    //查找数据
    public Object selectUserInfo() {
        return userRepository.findAll();
    }
}

这些方法都是来自CrudRepository接口,它里面定义了常用CRUD接口。

如果你仔细观察就会发现插入数据和修改数据使用的是同一个接口,它会根据主键值是否存在于数据库中来判断是修改还是插入。

编写控制层接口:

package com.example.spring.jpa;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/jpa")
public class Controller {
    @Resource
    private JpaService jpaService;

    @RequestMapping("/delete")
    public void delete(Integer id) {
        jpaService.deleteUserInfo(id);
    }

    @RequestMapping("/select")
    public Object select() {
        return jpaService.selectUserInfo();
    }

    @RequestMapping("/insert")
    public Object insert(UserInfo userInfo) {
        return jpaService.insertUserInfo(userInfo);
    }
    
    @RequestMapping("/update")
    public Object update(UserInfo userInfo) {
        return jpaService.update(userInfo);
    }
}

到此为止你已经入门了

JAP是如何区分你是想要插入数据,还是修改数据?

接下来我们使用Postman进行测试,用结果和它所对应现象来说话

细心的小伙伴可能会发现当程序刚一启动数据库中就自动创建了一个不认识的表:

如果没注意的话你可以将数据库删除重新创建,然后再重新启动一边程序。

那么这个表是干啥的?有啥用呢?往下看

根据控制台打印的SQL语句我们可以知道,程序先查询并设置了hibernate_sequence表中的内容,然后才进行的插入操作,注意此时我们没有给id传值

执行完修改操作后我们可以从响应中发现修改成功了,接下来我们再看一下控制台打印的SQL语句,注意此时我们给id传值了

 我们可以发现程序是先根据id来查找到值之后才进行的修改。

接下来我们再插入时给id赋予初值然后再来看结果:

注意看:此时的SQL语句中可以看出来程序是先根据id查找表中的对应书据,发现没找到,然后才查询并设置了hibernate_sequence表中的内容,然后才进行的插入操作。

总结:

程序会先判断主键是否有初值,如果没有就执行插入操作;否则根据该值来查找对应的数据,如果找到就执行修改操作;否则就执行插入操作;

针对项目自定义查询

我们上面使用操作数据库的方法都是CrudRepository接口中的方法,那么就算它再全也不可能覆盖所有的接口,所以我们还可以针对自己的项目进行自定义接口,例如我现在想要根据gender来查询用户信息:

在UserRepository接口中添加一个方法:

package com.example.spring.jpa;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import javax.persistence.criteria.CriteriaBuilder;
import java.util.List;

@Repository
public interface UserRepository extends CrudRepository<UserInfo, Integer> {
    List<UserInfo> findByGender(Integer gender);
}

为了方便起见,我们直接在控制层调用:

@RequestMapping("/selectByGender")
public Object select(Integer gender) {
    return userRepository.findByGender(gender);
}

注意:虽然他给了我们自定义接口的能力,但是接口的命名必须符合要求。在IDEA中编译器就会进行提示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费使用ChatGPT 4.0 和 文心一言 4.0

前言 今天给大家分享如何免费使用ChatGPT4.0 和 文心一言 4.0&#xff0c;废话就不多说了&#xff0c;我们直接入正题。 ChatGPT 4.0 先来看看如何免费使用ChatGPT 4.0 进入Coze登录 https://www.coze.com 选择大圣-GPT-4 文心一言 4.0 通过文心智能体平台&#xff0c;就…

[阅读笔记20][BTX]Branch-Train-MiX: Mixing Expert LLMs into a Mixture-of-Experts LLM

这篇论文是meta在24年3月发表的&#xff0c;它提出的BTX结构融合了BTM和MoE的优点&#xff0c;既能保证各专家模型训练时的高度并行&#xff0c;又是一个统一的单个模型&#xff0c;可以进一步微调。 这篇论文研究了以高效方法训练LLM使其获得各领域专家的能力&#xff0c;例如…

C++智能指针(二十)

一.RAII&#xff08;Resource Acquisition Is Initialization&#xff09; RAII资源获取即初始化&#xff0c;RAII的思想就是在构造时初始化资源&#xff0c;或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值&#xff0c;并且提供若干的资源访问的方法。比…

openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置

文章目录 openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置265.1安装openEuler操作系统265.2 修改操作系统内核PAGESIZE为64KB。265.3 关闭CPU中断的服务irqbalance openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置 本…

oracle一次sql优化笔记

背景&#xff1a;两个百万级数据量表需要连接&#xff0c;加全索引的情况下速度仍不见改善&#xff0c;苦查一下午解决问题未遂。 解决&#xff1a;经大佬指点了解到oracle优化器提示&#xff0c;使用/* USE_HASH(table1 table2) */或者/* USE_MERGE(table1 table2) */来指导优…

正则表达式中 “$” 并不是表示 “字符串结束”

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 作者&#xff1a;Seth Larson 译者&#xff1a;豌豆花下猫Python猫 英文&#xff1a;Regex character “$” doesnt mean “end-of-string” 转载请保留作者及译者信息&#xff01; 这篇文章写一写我最近在用 Python …

数图可视化品类空间管理系统入编《零售门店数字化赋能专项报告(2024年)》

数图可视化品类空间管理系统荣幸入编中国连锁经营协会发布的 《零售门店数字化赋能专项报告&#xff08;2024年&#xff09;》&#xff0c;报告以零售门店为切入点&#xff0c;通过引入“5P”的技术框架及梳理业内配套最佳实践方案&#xff0c;理出一套科学的、完整的零售门店数…

掌握 JavaScript:如何正确声明和使用变量

在编程的世界里&#xff0c;数据是构建一切的基础。而在JavaScript中&#xff0c;变量就是存储数据的容器。它们就像是我们生活中的盒子&#xff0c;可以装下各种物品&#xff0c;让我们在需要的时候随时取用。 今天&#xff0c;就让我们一起揭开变量的神秘面纱&#xff0c;探…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中&#xff0c;全文搜索通常通过使用tsvector和tsquery类型&#xff0c;以及to_tsvector和…

Leetcode刷题-(26~35)-Java

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写算法题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…

【NTN 卫星通信】NTN的SSB波束探讨

1 概述 SSB是同步广播信道&#xff0c;用于小区搜索&#xff0c;主系统消息的发送。NR协议中定义了多种SSB波束格式&#xff0c;简述如下。   小区搜索是终端获取与小区的时间和频率同步并检测小区的物理层小区ID的过程。   为了进行小区搜索&#xff0c;UE接收以下同步信号…

C# 将 TextBox 绑定为 KindEditor 富文本

目录 关于 KindEditor 绑定设计 部署 KindEditor 实现代码 小结 关于 KindEditor KindEditor 基于JavaScript 编写&#xff0c;可以与众多WEB应用程序结合。KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能&#xff0c;是一款非常受欢迎的HTML在线编辑器。…

Modelsim与Verilog入门

0.什么是Modelsim&#xff1f; Modelsim是一个支持多语言的仿真环境&#xff0c;比如我知道的Verilog和VHDL语言都可以在里边使用&#xff0c;这俩都是硬件描述语言&#xff1b; 即就是个软件&#xff0c;你可以用Verilog语言来写代码&#xff0c;然后编译&#xff0c;仿真出…

Spring AI ETL 流水线

先纠正 Spring AI 使用本地 Ollama Embeddings 中的一个错误&#xff0c;当启动 Ollama 之后&#xff0c;Windows会有托盘图标&#xff0c;此时已经启动了 Ollama 的服务&#xff0c;访问 Embedding 时不需要运行 ollama run gemma &#xff0c;只有访问 chat 时才需要启动一个…

轨迹跟踪与控制篇——Pure Pursuit纯跟踪算法

介绍 纯跟踪控制算法(Pure Pursuit)是一种典型的横向控制方法&#xff0c;最早由R.Wallace在1985年提出&#xff0c;该方法对参考轨迹的鲁棒性较好。 该算法的思想&#xff1a;基于当前车辆后轮中心位置&#xff0c;在参考路径上向 与 自车后轴中心距离ld(自定义)的位置处 匹配…

牛客-小乐乐与欧几里得

目录 题目 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 解题 题目 描述 小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数&#xff0c;但是他竟然不会求两个正整数的最大公约数与最小公倍数之和&#xff0c;请你帮助他解决这个问题。 …

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统&#xff0c;但是二者协议无法直接通讯&#xff0c;需要通过开疆智能ModbusTCP转Ethernet/IP网关将两者进行通讯连接&#xff0c;生物质发生器以其独特的工作原理和优势&#xff0c;使…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理&#xff0c;最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成&#xff1a;微型工业计算机&#xff0c;显示终端&#xff08;平板电视、LCD&#xff09; 方案需求 …

【c基础】文件操作

1.fopen和fclose函数 函数原型 FILE *fopen(const char *path, const char *mode); 参数解释&#xff1a; 返回值&#xff1a;fopen打开成功&#xff0c;则返回有效file的有效地址&#xff0c;失败返回NULL。path是文件路径&#xff0c;可以相对路径&#xff0c;可以绝对路径…

《黑羊效应》一群好人欺负一个好人,其他好人却坐视不管的诡谲现象 - 三余书屋 3ysw.net

黑羊效应&#xff1a;一群好人欺负一个好人&#xff0c;其他好人却坐视不管的诡谲现象 大家好&#xff0c;今天我们要解读的书是《黑羊效应》。黑羊效应是一种心理陷阱&#xff0c;指的是一群好人欺负一个好人&#xff0c;而其他好人却坐视不理。我们每个人或多或少都目睹过或…