在Spring Boot项目中使用JPA

news/2025/2/16 6:39:16/

1.集成Spring Data JPA

Spring Boot提供了启动器spring-boot-starter-data-jpa,只需要添加启动器(Starters)就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。

步骤01 添加JPA依赖。

首先创建新的Spring Boot项目,在项目的pom.xml中增加JPA相关依赖,具体代码如下:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

在上面的示例中,除了引用spring-boot-starter-data-jpa之外,还需要依赖MySQL驱动mysql-connector-java。

步骤02 添加配置文件。

在application.properties中配置数据源和JPA的基本相关属性,具体代码如下:

spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#JPA配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#SQL输出
spring.jpa.show-sql=true
#format 下SQL输出
spring.jpa.properties.hibernate.format_sql=true

在上面的参数中,主要是配置数据库的连接以及JPA的属性。下面重点分析一下JPA中的4个配置。

1)spring.jpa.properties.hibernate.hbm2ddl.auto:该配置比较常用,配置实体类维护数据库表结构的具体行为。当服务首次启动时会在数据库中生成相应的表,后续启动服务时,如果实体类有增加属性就会在数据中添加相应字段,原来的数据仍然存在。

  • update:常用的属性,表示当实体类的属性发生变化时,表结构跟着更新。
  • create:表示启动时删除上一次生成的表,并根据实体类重新生成表,之前表中的数据会被清空。
  • create-drop:表示启动时根据实体类生成表,但是当sessionFactory关闭时表会被删除。
  • validate:表示启动时验证实体类和数据表是否一致。
  • none:什么都不做。

2)spring.jpa.show-sql:表示hibernate在操作时在控制台打印真实的SQL语句,便于调试。

3)spring.jpa.properties.hibernate.format_sql:表示格式化输出的JSON字符串,便于查看。

4)spring.jpa.properties.hibernate.dialect:指定生成表名的存储引擎为InnoDB。

步骤03 添加实体类。

首先,创建User实体类,它是一个实体类,同时也是定义数据库中的表结构的类,示例代码如下:

@Entity
@Table(name= "Users")
public class User {@GeneratedValue(strategy = GenerationType.IDENTITY)@Idprivate Long id;@Column(length = 64)private String name;@Column(length = 64)private String password;private int age;public User() {}public User(String name,String password, int age) {this.name=name;this.password=password;this.age=age;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", age=" + age +'}';}
}

在上面的示例中,使用@Table注解映射数据库中的表,使用@Column注解映射数据库中的字段。具体说明如下:

1)@Entity:必选的注解,声明这个类对应了一个数据库表。

2)@Table:可选的注解,声明了数据库实体对应的表信息,包括表名称、索引信息等。这里声明这个实体类对应的表名是Users。如果没有指定,则表名和实体的名称保持一致,与@Entity注解配合使用。

3)@Id注解:声明了实体唯一标识对应的属性。

4)@Column注解:用来声明实体属性的表字段的定义。默认的实体每个属性都对应表的一个字段,字段名默认与属性名保持一致。字段的类型根据实体属性类型自动对应。这里主要声明了字符字段的长度,如果不这么声明,则系统会采用255作为该字段的长度。

5)@GeneratedValue注解:设置数据库主键自动生成规则。strategy属性提供4种值:

  • AUTO:主键由程序控制,是默认选项。
  • IDENTITY:主键由数据库自动生成,即采用数据库ID自增长的方式,Oracle不支持这种方式。
  • SEQUENCE:通过数据库的序列产生主键,通过@SequenceGenerator注解指定序列名,MySQL不支持这种方式。
  • TABLE:通过特定的数据库表产生主键,使用该策略可以使应用更易于数据库移植。

除了上面使用到的@Entity注解、@Table注解等之外,还有一些常用的实体注解,具体说明如表9-1所示。这些注解用于描述实体对象与数据库字段的对应关系,需要注意的是,JPA与MyBatis是有区别的,千万别混淆。

在这里插入图片描述
步骤04 测试验证。

以上几步就是集成JPA的全部配置,配置完之后启动项目,就可以看到日志中显示如图所示的内容。

在这里插入图片描述
由图可知,系统启动后自动连接数据库,创建数据表结构,并打印出执行的SQL语句。如果查看数据库,可以看到数据库中对应的Users表也创建成功了,说明项目已经成功集成JPA并创建实体表。

2.JpaRepository简介

JpaRepository是Spring Data JPA中非常重要的类。它继承自Spring Data的统一数据访问接口——Repository,实现了完整的增、删、改、查等数据操作方法。JpaRepository提供了30多个默认方法,基本能满足项目中的数据库操作功能。

JpaRepository是实现Spring Data JPA技术访问数据库的关键接口。JpaRepository继承自PagingAndSortingRepository接口,而PagingAndSortingRepository接口继承自CrudRepository接口。CrudRepository和Repository接口则是Spring Data底层通用的接口,定义了几乎所有的数据库接口方法,统一了数据访问的操作。

另外,JPA提供了非常完善的数据查询功能,包括自定义查询、自定义SQL、已命名查询等多种数据查询方式。

3.实战:实现人员信息管理模块

JpaRespository默认实现完整的增、删、改、查等数据操作。只需定义一个Repository数据访问接口并继承JpaRepository类即可。下面通过之前创建的User用户类和表实现用户的增、删、改、查功能来演示用户管理模块的实现。

1. 定义Repository

首先创建UserRepository接口并加上@Repository注解,然后继承JpaRepository类,不需要编写任何代码,即可实现人员信息管理模块的全部功能。具体示例代码如下:

@Repository
public interface UserRepository extends JpaRepository<Users, Long> {}

我们看到UserRepository虽然什么方法都没有定义,但是继承了JpaRepository之后,自然就拥有JpaRepository中的所有方法。

2. 实现新增、修改、删除、查询

(1)新增

接下来创建UserRepositoryTests单元测试类,并实现用户新增的测试方法。示例代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {@Resourceprivate UserRepository userRepository;@Testpublic void testSave() {User user = new User("ysxq","123456",40);userRepository.save(user);}
}

在上面的示例中,在UserRepositoryTests单元测试类中注入UserRepository对象,然后使用JpaRespository预生成的save()方法实现人员数据保存的功能。如下图所示:

在这里插入图片描述

在这里插入图片描述

(2)修改

修改与新增都使用save()方法,传入数据实体即可。JPA自动根据主键id修改user数据。示例代码如下:

    @Testpublic void testUpdate() {User user = userRepository.findById(1L).get();user.setPassword("z123456");userRepository.save(user);}

(3)删除

删除也非常简单,使用的是JpaRespository预生成的delete()方法,可以直接将对象删除,同时也可以使用deleteByXXX方法。示例代码如下:

    @Testpublic void testDetle() {User user = new User("ysxq","123456",40);userRepository.delete(user); }

在这里插入图片描述

(4)查询

JPA对于数据查询的支持非常完善,有预生成的findById()、findAll()、findOne()等方法,也可以使用自定义的简单查询,还可以自定义SQL查询。示例代码如下:

    @Testpublic void testSelect() {userRepository.findById(1L);}

3. 验证测试

单击Run Test或在方法上右击,选择Run 'UserRepositoryTest’命令,运行全部测试方法,结果如图所示。

在这里插入图片描述
结果表明人员信息的增、删、改、查单元测试全部运行成功,并输出了相应的查询结果,说明使用JPA实现了人员信息管理功能。


http://www.ppmy.cn/news/1098001.html

相关文章

MySQL设置时区

文章目录 一、MySQL时区设置方法1. 使用SET语句设置时区2. 修改MySQL配置文件设置时区 二、MySQL时区转换三、MySQL时区的影响1. 存储时间类型值2. 计算时间类型值 四、总结 MySQL是一种常用的关系型数据库管理系统&#xff0c;支持设置时区以便在不同时区下能够正确的处理日期…

Spring 家族框架常用注解

反射相关 Target Spring核心注解&#xff0c;指定自定义注解MyAnno可以应用到的java类型,从而提供编译时的类型检查和错误检测 指定类型时用枚举类ElementType下的具体枚举值&#xff0c;包括&#xff1a;ElementType.TYPE&#xff1a;表示MyAnno适用于类、接口、枚举。Eleme…

保险业的变革,软件机器人车险录入自动化

在现代社会&#xff0c;技术的迅猛发展正在改变各行各业的运作方式&#xff0c;包括保险业。随着数字化转型的推进&#xff0c;保险公司采用创新技术来提高效率和准确性。博为小帮软件机器人结合自动化的功能和OCR技术的识别能力&#xff0c;实现了车险单处理流程的全自动化。本…

RabbitMQ: 死信队列

一、在客户端创建方式 1.创建死信交换机 2.创建类生产者队列 3.创建死信队列 其实就是一个普通的队列&#xff0c;绑定号私信交换机&#xff0c;不给ttl&#xff0c;给上匹配的路由&#xff0c;等待交换机发送消息。 二、springboot实现创建类生产者队列 1.在消费者里的…

靶场溯源第二题

关卡描述&#xff1a;1. 网站后台登陆地址是多少&#xff1f;&#xff08;相对路径&#xff09; 首先这种确定的网站访问的都是http或者https协议&#xff0c;搜索http看看。关于http的就这两个信息&#xff0c;然后172.16.60.199出现最多&#xff0c;先过滤这个ip看看 这个很…

生动理解深度学习精度提升利器——测试时增强(TTA)

测试时增强&#xff08;Test-Time Augmentation&#xff0c;TTA&#xff09;是一种在深度学习模型的测试阶段应用数据增强的技术手段。它是通过对测试样本进行多次随机变换或扰动&#xff0c;产生多个增强的样本&#xff0c;并使用这些样本进行预测的多数投票或平均来得出最终预…

Linux命令200例:nohup用于在后台运行命令

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

Go语言网络编程(socket编程)UDP

1、UDP编程 1.1.1. Go语言实现UDP通信 UDP协议 UDP协议&#xff08;User Datagram Protocol&#xff09;中文名称是用户数据报协议&#xff0c;是OSI&#xff08;Open System Interconnection&#xff0c;开放式系统互联&#xff09;参考模型中一种无连接的传输层协议&#x…