SpringBoot整合Spring Data JPA
花伤情犹在 人气:0前言
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
文件确保这些依赖都在
<!--jpa--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
创建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, Integer>
,左边类型为操作的数据表对应的实体类User,右边类型为主键返回类型。
@Repository public interface UserRepository extends JpaRepository<User,Integer> { }
Spring Data JPA
包含了一些内置的Repository
,实现了一些常用的方法:findone
,findall
,save
等。
创建处理器
在处理器中创建操作数据表CRUD
的基本操作
@RestController public class UserController { @Autowired UserRepository userRepository; @RequestMapping("/list") public List<User> findAll(){ List<User> 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
查看数据表
加载全部内容