SpringBoot整合Spring Data JPA的详细方法

网友投稿 539 2022-08-28


SpringBoot整合Spring Data JPA的详细方法

目录前言核心概念新建SpringBoot项目创建mysql数据库创建实体类创建Repository创建处理器准备SQL文件编写配置文件最终效果启动SpringBoot项目查看数据库自动更新数据表结构测试JPA的增删改查测试查询所有测试保存数据测试更新数据测试删除数据

前言

Spring Data JPA 是更大的 Spring Data 家族的一部分,可以轻松实现基于 JPA 的存储库。该模块处理对基于 JPA 的数据访问层的增强支持。它使构建使用数据访问技术的 Spring 驱动的应用程序变得更加容易。

SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块。SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以。

核心概念

Spring Data 存储库抽象中的中央接口是Repository. 它需要域类来管理以及域类的 ID 类型作为类型参数。此接口主要用作标记接口,以捕获要使用的类型并帮助您发现扩展此接口的接口。CrudRepository接口为被管理的实体类提供了复杂的 CRUD 功能。

新建SpringBoot项目

使用IDEA中的初始化向导可以快速构建SpringBoot项目

填写基本的GAV信息

选择这些依赖(Lombok、Spring Web、Spring Data JPA、MySQL Driver)

打开Pom文件确保这些依赖都在

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

runtime

lombok

true

创建MySQL数据库

创建user数据库

create database user;

创建实体类

@AllArgsConstructor

@NoArgsConstructor

@Entity

@Data

@Table(name = "user")

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Integer id;

private String name;

private Integer age;

}

注解详情:

@Entity:表明是一个实体类@Table:声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),目录(Catalog)和schema的名字。该注释不是必须的,如果没有则系统使用默认值(实体的短类名)。@Id 声明此属性为主键。该属性值可以通过应该自身创建,但是Hibernate推荐通过Hibernate生成@GeneratedValue 指定主键的生成策略TABLE:使用表保存id值IDENTITY:identitycolumnSEQUENCR :sequenceAUTO:根据数据库的不同使用上面三个@Column :声明该属性与数据库字段的映射关系。

创建Repository

创建UserRepository接口,继承JpaRepository接口。

JpaRepository,左边类型为操作的数据表对应的实体类User,右边类型为主键返回类型。

@Repository

public interface UserRepository extends JpaRepository {

}

Spring Data JPA包含了一些内置的Repository,实现了一些常用的方法:findone,findall,save等。

创建处理器

在处理器中创建操作数据表CRUD的基本操作

@RestController

public class UserController {

@Autowired

UserRepository userRepository;

@RequestMapping("/list")

public List findAll(){

List userList = userRepository.findAll();

return userList;

}

@RequestMapping("/save")

public String save(User user){

userRepository.save(user);

return "保存成功";

@RequestMapping("/update")

public String update(User user){

return "更新成功";

@RequestMapping("/delete")

public String delete(Integer id){

userRepository.deleteById(id);

return "删除成功";

}

准备SQL文件

schema.sql

create table if not exists user(

`id` int primary key auto_increment,

`name` varchar(255) not null,

`age` int not null

);

data.sql

insert into user (name,age) values('张三',18);

insert into user (name,age) values('李四',19);

insert into user (name,age) values('王五',20);

insert into user (name,age) values('李六',21);

编写配置文件

# 应用服务 WEB 访问端口

server.port=8080

# 数据库驱动:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 数据源名称

spring.datasource.name=defaultDataSource

# 数据库连接地址

spring.datasource.url=jdbc:mysql://localhost:3306/user

# 数据库用户名&密码:

spring.datasource.username=root

spring.datasource.password=root

#SQL 脚本编码

spring.datasource.sql-script-encoding=utf-8

#数据 (DML) 脚本资源引用

spring.datasource.data=classpath:db/data.sql

#如果在初始化数据库时发生错误,是否停止

spring.datasource.continue-on-error=true

#确定是否应使用可用的 DDL 和 DML 脚本执行 DataSource 初始化时应用的模式

spring.datasource.initialization-mode=ALWAYS

#--------JPA配置----------

#要操作的目标数据库

spring.jpa.database=mysql

#更新或创建数据表结构

spring.jpa.hibernate.ddl-auto=update

#控制台显示SQL

spring.jpa.show-sql=true

#物理命名策略的完全限定名称

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

#日志级别严重性映射

logging.level.com.hsqyz.springboot_jpa=debug

最终效果

启动SpringBoot项目

运行项目后,可以看到控制台结果:控制台显示使用hibernate创建了该表。

查看数据库

数据表结构

数据库中的结果

数据初始化配置

spring.datasource.schema=classpath:db/schema.sql:进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。spring.datasource.data=classpath:db/data.sql:进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。

该配置非常适合开发环境,数据库的结构构建sql放在resources/db/schema.sql,数据sql放在resources/db/data.sql中。这样每次运行程序我都可以得到一个新的数据库。这样就不需要我每次为了测试而修改数据中的内容了。

不过Spring Data JPA会根据实体类自动创建对应的数据表,所以我没有设置spring.datasource.schema的属性值,只设置了spring.datasource.data用来初始化数据表中的数据。

注意:classpath:的路径对应着项目的resources文件

自动更新数据表结构

给实体类新增一个属性gender(性别)

然后重新运行项目

Hibernate: alter table user add column gender integer

控制台显示hibernate更改表user添加列gender类型为integer

刷新数据库查看数据表

表结构会根据实体类的变化而变化,前提是设置spring.jpa.hibernate.ddl-auto=update

#更新或创建数据表结构

spring.jpa.hibernate.ddl-auto=update

查看数据表结构

由于设置spring.datasource.initialization-mode=ALWAYS,属性值为ALWAYS代表始终初始化数据源,以及开启了spring.datasource.data=classpath:db/data.sql数据表数据初始化脚本,所以每次启动项目都会运行一遍数据表数据初始化脚本data.sql,导致之前4条数据再次被插入一遍。

#数据 (DML) 脚本资源引用

spring.datasource.data=classpath:db/data.sql

#如果在初始化数据库时发生错误,是否停止

spring.datasource.continue-on-error=true

#确定是否应使用可用的 DDL 和 DML 脚本执行 DataSource 初始化时应用的模式

spring.datasource.initialization-mode=ALWAYS

测试JPA的增删改查

由于Controller类使用的是@RestController,返回的都是json数据 建议在浏览器安装json插件方便浏览

测试查询所有

访问http://localhost:8080/list

成功返回数据表中的全部数据

测试保存数据

访问http://localhost:8080/save?name=花伤情犹在&age=18&gender=1

查看数据表

测试更新数据

访问http://localhost:8080/update?id=9&name=花伤情&age=20&gender=0

查看数据表

测试删除数据

访问http://localhost:8080/delete?id=9

查看数据表


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python中的异常捕获(python抛出异常和捕获异常)
下一篇:python中的模块与包(python模块和包的关系)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~