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 分钟前
Spring Boot 3零基础教程,自动配置机制,笔记07
spring boot·笔记·后端
兮动人3 分钟前
Eureka注册中心通用写法和配置
java·云原生·eureka
爱编程的小白L2 小时前
基于springboot志愿服务管理系统设计与实现(附源码)
java·spring boot·后端
聪明的笨猪猪4 小时前
Java Redis “持久化”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪5 小时前
Java Redis “核心基础”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
奋斗的小monkey7 小时前
Spring Boot 3.x核心特性与性能优化实战
java·spring boot·微服务·性能优化·响应式编程
程序猿DD7 小时前
将 GPU 级性能带到企业级 Java:CUDA 集成实用指南
java·架构
一成码农8 小时前
JavaSE面向对象(上)
java
qq_574656258 小时前
java-代码随想录第66天|Floyd 算法、A * 算法精讲 (A star算法)
java·算法·leetcode·图论