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

新建一个SpringBoot项目

项目结构:

启动MySQL

pom.xml

java 复制代码
<?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配置文件

bash 复制代码
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 注解:用于指定实体类属性与数据库表列的映射关系。它提供了一系列属性来定义列的元数据信息,例如列名、是否可为空、唯一约束、长度限制等。
java 复制代码
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 操作
java 复制代码
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,并使用其提供的方法进行数据库操作
java 复制代码
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运行命令
    *

    bash 复制代码
    mvn idea:idea
  • 每运行一次,应该先删除数据库,重建数据库test,保证表user为空;如果只删除表,那ID仍然在自增,测试的语句找不到ID为1的数据,就会断言错误。运行成功后,可以查看一下表
    *

    bash 复制代码
    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语句

相关推荐
徐*红3 分钟前
java 线程池
java·开发语言
尚学教辅学习资料3 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_857636393 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
1 9 J5 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship6 分钟前
Java面试题(2)
java·开发语言
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨3 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言