目录
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
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运行命令
*
bashmvn idea:idea
每运行一次,应该先删除数据库,重建数据库test,保证表user为空;如果只删除表,那ID仍然在自增,测试的语句找不到ID为1的数据,就会断言错误。运行成功后,可以查看一下表
*
bashmysql> 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语句