SpringBoot——集成Spring Data JPA保存数据

目录

JPA

项目总结

新建一个SpringBoot项目

pom.xml

application.properties配置文件

User实体类

UserRepository接口

 SpringbootJpaApplicationTests测试类

测试


JPA

  • 项目在运行过程中会产生很多业务数据,一般我们把数据保存起来的这个过程称为数据持久化。数据可以保存在内存、文件和数据库中,最普遍的方式是把数据保存到数据库中。因为经常要把数据保存到数据库中,所以Spring抽象出了一套数据访问框架——Spring Data JPA,它集成了多种数据访问技术,支持JDBC、MyBatis、Hibernate和JPA等数据持久化框架
  • JPA规范定义了一系列的标准接口,让实体类和数据库的表之间建立了一个对应关系,当在代码中将数据保存到数据库中时,可以不写SQL语句就能操作数据库中的数据表
  • Spring Boot整合JPA(Java Persistence API)是一种常见的方式,用于在Spring应用程序中实现持久化和数据库访问

项目总结

SpringBoot整合JPA的基本步骤:

  • 添加依赖
  • 配置数据源:在 application.properties 或 application.yml 文件中配置数据库连接信息
  • 创建实体类:创建与数据库表对应的实体类,并使用 JPA 注解标记实体类和字段。
  • 创建Repository接口:创建一个继承自 JpaRepository 的接口,使用原有方法或者自定义一些方法用于对实体类进行数据库操作
  • 使用Repository:在服务类,或控制器,或测试类中注入 UserRepository,并使用其提供的方法进行数据库操作。

新建一个SpringBoot项目

 项目结构:

启动MySQL

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.study</groupId>
	<artifactId>springboot_jpa</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_jpa</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<version>8.3.0</version>
			<scope>runtime</scope>
		</dependency>
		<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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

application.properties配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Hibernate配置属性,设置自动根据实体类创建,更新和验证数据库表结构
spring.jpa.properties.hibernate.hbm2ddl.auto=update
# Hibernate 将会使用 MySQL 5 InnoDB 存储引擎的方言来生成针对 MySQL 数据库的 SQL 查询和语句。
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# 将运行期生成的SQL语句输出到日志以供调试
spring.jpa.show-sql=true

User实体类

  • 此处对参数进行了校验
  • @GeneratedValue 注解:常与 @Id 注解一起使用,用于指定主键的生成策略。常见的主键生成策略包括自动增长(IDENTITY)、序列(SEQUENCE)、表(TABLE)等。在大多数关系型数据库中,自动增长主键通常对应于数据库中的自增长(AUTO_INCREMENT)字段。
  • @Column 注解:用于指定实体类属性与数据库表列的映射关系。它提供了一系列属性来定义列的元数据信息,例如列名、是否可为空、唯一约束、长度限制等。
package com.study.springboot_jpa.model;

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
 * 实体类
 */
@Entity //指定该类是一个实体类(和数据库表映射的类)
//没有给出表名@Table,默认表名为实体类类名的首字母小写,多个单词之间用下划线连接
@Data
public class User {

    @Id//指定实体类的主键
    @GeneratedValue//自动增长机制
    private long id;

    @Column(nullable = false,unique = true)//不允许为空,且唯一
    private String userName;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private int age;
}

UserRepository接口

  • JpaRepository 接口:是 Spring Data JPA 提供的一个泛型接口,用于简化数据访问层的开发。它提供了许多内置的方法,用于对实体类进行常见的 CRUD 操作
package com.study.springboot_jpa.model;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User,Long> {
    // 这里可以定义一些自定义的查询方法
    User findByUserName(String userName);//根据名字查询用户
}

 SpringbootJpaApplicationTests测试类

  • 注入 UserRepository,并使用其提供的方法进行数据库操作
package com.study.springboot_jpa;

import com.study.springboot_jpa.model.User;
import com.study.springboot_jpa.model.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Optional;


@Slf4j //自动生成日志
//运行测试时使用的测试运行器,指定为 SpringJUnit4ClassRunner.class,用于在测试前初始化 Spring 上下文。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class SpringbootJpaApplicationTests {

	@Autowired
	private UserRepository userRepository;

	@Test
	public void userTest(){
		User user = new User();
		user.setUserName("myCc");
		user.setAge(18);
		user.setPassword("123");

		//保存用户,如果主键存在,则执行更新,否则,执行插入操作
		userRepository.save(user);
		//根据名字查询用户
		User item = userRepository.findByUserName("myCc");
		System.out.println(item);
		//确保item不为空,如果 item为空,则断言失败,测试将会报错
		Assert.assertNotNull(item);
		//IP为1的用户是否存在
		Assert.assertEquals(true,userRepository.existsById(1L));

		//根据ID查询用户
		Optional<User> byId = userRepository.findById(1L);
		//确保ID为1的对象不为空,如果返回 true,那么断言成功
		Assert.assertEquals(true,byId.isPresent());
		//ID为2的用户不存在,期望是不存在,应该返回false
		Assert.assertEquals(false,userRepository.findById(2L).isPresent());
		//删除ID为1的用户
		userRepository.deleteById(1L);
		//判断ID为1的用户是否存在,期望是不存在,应该返回false
		Assert.assertEquals(false,userRepository.existsById(1L));
	}
}

测试

注意事项:

  • 如果报什么包不存在,但是代码没有检查出问题,可以试试在Terminal运行命令
    • mvn idea:idea
  • 每运行一次,应该先删除数据库,重建数据库test,保证表user为空;如果只删除表,那ID仍然在自增,测试的语句找不到ID为1的数据,就会断言错误。运行成功后,可以查看一下表
    • mysql> drop database test;
      Query OK, 2 rows affected (0.04 sec)
      
      mysql> create database test;
      Query OK, 1 row affected (0.01 sec)
      
      mysql> use test;
      Database changed
      
      mysql>  select * from user;
      Empty set (0.00 sec)

启动项目,控制台打印日志时,也打印出了sql语句

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】牛客——JZ38 字符串的排列

✨题目链接&#xff1a; JZ38 字符串的排列 ✨题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数…

灯下黑”挖出国内知名安全平台某BUF的CSRF漏洞

漏洞复现&#xff1a; 漏洞点在删除文章的地方&#xff0c;首先为了测试先发布一篇文章 发布之后我们可以查看文章&#xff0c;注意url中的一串数字&#xff0c;就是这篇文章的id&#xff0c;如下如&#xff1a; 这里的文章id是“271825”&#xff0c;首先抓一下删除文章的数据…

转行嵌入式,需要自学多久?

那要看你的预期目标是什么。如果你只是为了找到一份工作&#xff0c;那么学习半年左右&#xff0c;掌握基本的开发技能&#xff0c;就可以找到一个初级岗位的工作&#xff0c;工资在 5K 到 10K 左右。不过&#xff0c;运气好的话可能时间更短&#xff0c;运气差的话可能需要一年…

基于PHP+MySQL组合开发的微信小程序分销商城源码系统 分销商城+积分商城+多商户 功能强大 带完整的安装代码包以及搭建教程

系统概述 在当今数字化商业时代&#xff0c;拥有一个强大而多功能的分销商城系统对于企业的发展至关重要。本文将重点介绍基于 PHPMySQL 组合开发的微信小程序分销商城源码系统&#xff0c;它融合了分销商城、积分商城和多商户等功能&#xff0c;不仅功能强大&#xff0c;还提…

小苯的排列构造,小苯的01背包(easy),小苯的01背包(hard)

小苯的排列构造 题目描述 运行代码 #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000050 int i,j,k,n,m,t,a[N],b[N],f[N],l[N]; bool v[N]; int main(){cin>>n;for(i1;i<n;i)cin>>a[i];v[0]1;for(i1;i<n;i){if(a[…

Windows下PostgreSQL数据库的备份与恢复

文章目录 一、备份1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里&#xff0c;使用pg_dump进行备份1.打开命令窗口2.使用pg_dump将数据库备份下来 二、恢复1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里&#xff0c;…

GD32F103系列单片机片上FLASH和ARM介绍

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

移动硬盘未格式化数据恢复及预防策略

随着数字化时代的到来&#xff0c;移动硬盘作为数据存储的重要载体&#xff0c;被广泛应用于个人和企业中。然而&#xff0c;当移动硬盘遭遇“未格式化”的困境时&#xff0c;其中的数据便岌岌可危。本文将深入探讨移动硬盘未格式化的现象、原因、数据恢复方案以及预防措施&…

男士内裤哪种款式舒服?五条实用技巧让你轻松挑选

对于很多男生来说&#xff0c;依然很难挑到真正舒适的内裤。比如卡臀卡裆&#xff0c;走路时不时还得提拉一下&#xff0c;真的很尴尬。又紧又闷的内裤&#xff01;尤其是炎热的夏天&#xff0c;黏糊糊的贼难受&#xff01;到底有没有一款舒适透气男士内裤呢&#xff1f;那今天…

C++之类(class)的三种成员修饰符(public、private、protected)总结

1、背景介绍 在C中&#xff0c;类&#xff08;class&#xff09;的三种访问修饰符&#xff08;access specifiers&#xff09;用于控制类的成员&#xff08;属性和方法&#xff09;的访问权限。这些修饰符决定了类成员在类的外部是否可以被访问。以下是这三种访问修饰符的详细…

端午节粽子龙舟主题互动趣味小游戏效果是什么

端午三天乐&#xff0c;无论节日当天还是之前&#xff0c;行业商家都可以自己的品牌为主借势营销&#xff0c;趣味活动形式玩法和内容呈现达成多种效果&#xff0c;品牌传播、公众号涨粉、线下互动、商品促销、用户促活等。 在【雨科】平台拥有多款端午节互动小游戏类型&#…

Ubuntu/Linux 安装Paraview

文章目录 0. 卸载已有ParaView1. 安装ParaView1.1 下载后安装 2.进入opt文件夹改名3. 更改启动项4. 创建硬链接5. 添加桌面启动方式6. 即可使用 0. 卸载已有ParaView YUT 1. 安装ParaView https://www.paraview.org/ 1.1 下载后安装 找到下载的文件夹&#xff0c;文件夹内…

SAP锁机制(SAP Locks)经验小结

1. 数据一致性与锁 为什么要有锁机制&#xff1f;其背后的核心逻辑在于“保证数据的一致性”。 当数据被应用程序修改时&#xff0c;我们必须要保证修改后的数据具有一致性。在SAP系统中&#xff0c;将一致的数据状态从一个状态变动到另一个一致状态的时间跨度被称为LUW&…

长文总结 | Python基础知识点,建议收藏

测试基础-Python篇 基础① 变量名命名规则 - 遵循PEP8原则 普通变量&#xff1a;max_value 全局变量&#xff1a;MAX_VALUE 内部变量&#xff1a;_local_var 和关键字重名&#xff1a;class_ 函数名&#xff1a;bar_function 类名&#xff1a;FooClass 布尔类型的变量名…

Matlab图像处理| 图像批量读取和存储、开闭运算

前言&#xff1a;因为matlab本身有很多数学公式库&#xff0c;图像处理有时候交给matlab会方便很多。另外&#xff0c;做科研就算不是专门写代码的也会了解些matlab&#xff0c;和做硬件的同门进行需求对接的时候往往也会要读matlab代码。所以觉得学习和自己相关matlab代码还是…

HTTPS单双向认证流程详解与联想

HTTPS单向认证 HTTPS在单向认证传输的过程中会涉及到三个密钥&#xff1a; 服务端的公钥和私钥&#xff0c;用来进行非对称加密交换密钥 客户端生成的随机密钥&#xff0c;用来进行对称加密传输数据 认证过程 1.客户端向服务器发起HTTPS请求&#xff0c;连接到服务器的443端…

margin-left: auto;使元素靠右

摘要&#xff1a; 今天写样式遇到一个东西&#xff0c;就是需要表单居右显示的&#xff0c;但是作用了弹性布局&#xff0c;其他的都不行的&#xff0c;一开始使用了浮动&#xff0c;但是使用了浮动后盒子就不继承父盒子的宽度了&#xff0c;移动端还行&#xff0c;自动回到100…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

股价飙升:AI PC大变革,联想的“联想时刻”正在缔造?

按照产业的传导逻辑&#xff0c;在颠覆式技术到来之时&#xff0c;当引发这场变革的最核心技术及产品真正进入了产品化、商业化阶段&#xff0c;此时直触需求端的终端厂商&#xff0c;其成长性估算将得到市场的重新预估。 眼下AI PC之于联想就是如此。 5月27日&#xff0c;联…

装机数台,依旧还会心念i5-12600KF的性能和性价比优势:

近几个月的时间中&#xff0c; 装机差不多4台电脑&#xff0c;由于工作需要&#xff0c;计划年中再增添一台。 目前市场上英特尔CPU促销非常火爆&#xff0c;第12代、第13代以及第14代的产品在年中有适当的优惠。 年中也是装机的旺季&#xff0c;各种相关配件也相对便宜一些。…