之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库。其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data JPA。

Spring Data JPA 是Spring Data框架下的一个基于JPA标准操作数据的模块,简化了操作持久层的代码,只需要编写接口就可以。如果你是第一次使用 Spring Data JPA ,你一定会惊呼这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。使用非常简单方便,下面我们就来讲述 JPA 使用的基本操作。

JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore。JPA 也是众多 ORM 的抽象。

一、Spring Data JPA介绍

JPA (Java Persistence API), Java持久层 API的简称,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,JPA是一个基于O/R映射的标准规范。

JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。主要包括括以下3方面的技术:

  1. ORM映射元数据 将实体对象持久化到数据库表中
  2. API,用来操作实体对象,执行CRUD操作
  3. 查询语言,通过面向对象,而非面向数据库的查询语言查询数据

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率。

SpringData:其实Spring Data 就是Spring提供了一个操作数据的框架。而Spring Data JPA只是Spring Data框架下的一个基于JPA标准操作数据的模块。

二、SpringBoot整合SpringData JPA

1、增加JPA的相关依赖

在pom.xml 中,增加如下配置:

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

注意,需要添加MySql驱动。

2、修改配置文件

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

#数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test?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

在上面的参数设置说明下:

  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:指定⽣成表名的存储引擎为 InneoDB

3、数据库实体类

数据库实体类是一个 POJO Bean 对象。定义实体类后,在项目启动时,系统会根据实体类创建对应的数据表,实体类如下:

package com.weiz.pojo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table; /**
* 用户实体类
*
* @author
* @since
*/
@Entity
@Table(name = "Users")
public class Users {
@Id
private Long id; @Column(length = 32)
private String name; @Column(length = 32)
private String account; @Column(length = 64)
private String pwd; 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 getAccount() {
return account;
} public void setAccount(String account) {
this.account = account;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
}
}

代码说明:

  @Entity:必选的注解,声明这个类对应了一个数据库表。
  @Table:可选的注解。声明了数据库实体对应的表信息。包括表名称、索引信息等。这里声明这个实体类对应的表名是 Users。如果没有指定,则表名和实体的名称保持一致,跟@Entity 注解配合使用。
  @Id注解:声明了实体唯一标识对应的属性,。
  @Column注解:用来声明实体属性的表字段的定义。默认的实体每个属性都对应了表的一个字段。字段的名称默认和属性名称保持一致(并不一定相等)。字段的类型根据实体属性类型自动推断。这里主要是声明了字符字段的长度。如果不这么声明,则系统会采用 255 作为该字段的长度。

注意:这些注解是建立基于 POJO 的实体对象,需要注意的是 JPA 与 Mybatis 是有区别的。

4、运行验证

以上就是整合jpa的全部配置,配置完之后,启动项目,我们就可以看到日志中如下的内容:

同时,连上数据库之后,可以看到Users 表也创建成功了。

三、定义Repository

项目整合 jpa 成功之后,接下来可以定义Repository 数据访问接口了,只需要继承 JpaRepository 类,就会帮我们自动生成很多内置方法,如下:

package com.weiz.dao;

import com.weiz.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; @Repository
public interface UserRespository extends JpaRepository<Users, Long> { }

上面的代码可以看到,我们基本上一行代码也不用写,就能实现Users 用户的增删改查等全部的方法。

四、如何调用

上面,我们创建了UserRespository 数据接口,接下来就来调用该接口实现简单的增删改查。

package com.weiz.controller;

import com.weiz.dao.UserRespository;
import com.weiz.pojo.Users;
import com.weiz.utils.JSONResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Optional; @RestController
@RequestMapping("/user")
public class UserController { @Autowired
private UserRespository userRespository; @RequestMapping("/save")
public JSONResult save(){
Users user = new Users();
user.setId((long) 1);
user.setName("spring boot jpa");
user.setPwd("123456");
userRespository.save(user);
return JSONResult.ok("保存成功");
} @RequestMapping("/update")
public JSONResult update() {
Users user = new Users();
user.setId((long) 1);
user.setName("spring boot jpa update");
user.setPwd("123456");
user.setAccount("sbj");
userRespository.save(user);
return JSONResult.ok("修改成功");
} @RequestMapping("/delete")
public JSONResult delete() {
Users user = new Users();
user.setId((long) 1);
userRespository.delete(user);
return JSONResult.ok("删除成功");
} @RequestMapping("/select")
public JSONResult select() {
Optional<Users> users = userRespository.findById((long) 1);
return JSONResult.ok(users);
}
}

以上的controller 就是简单的调用增删改查的方法。增加了对应的controller 之后,启动项目即可测试用户的增删改查功能。这里就不一一截图了。

最后

以上就实现了spring boot 整合 jpa 操作数据库,是不是特别简单,整个过程我们所做的仅仅上面简单的四步:

1、增加jpa的依赖

2、在配置文件中里面增加数据库配置信息。

3、声明一个 Users 的数据库实体对象。

4、声明了一个持久层的接口,继承JpaRepository<T, ID> 接口。

这样,整个用户管理模块的增加、删除、修改、查询功能就实现了,甚至还有排序和分页的功能。

这就是 JPA 的强大之处。除了这些接口外,用户还会有其他的一些自定义的查询需求, JPA 也一样可以满足你的需求。

这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码 ,获取这个系列课程的完整源码。

Spring Boot入门系列(二十六)超级简单!Spring Data JPA 的使用!的更多相关文章

  1. Spring Boot入门系列(十六)使用pagehelper实现分页功能

    之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

  2. Spring Boot教程(二十六)使用Spring Security安全控制

    准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建Web应用,可以先阅读<Spring B ...

  3. Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.如何实现事物控制.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/c ...

  4. Spring Boot入门系列(十)如何使用拦截器,一学就会!

    前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhon ...

  5. Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查

    之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...

  6. Spring Boot入门系列(十五)Spring Boot 开发环境热部署

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...

  7. Spring Boot入门系列(十九)整合mybatis,使用注解实现动态Sql、参数传递等常用操作!

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库 ...

  8. 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

    前言 前面学习了 RabbitMQ 基础,现在主要记录下学习 Spring Boot 整合 RabbitMQ ,调用它的 API ,以及中间使用的相关功能的记录. 相关的可以去我的博客/RabbitM ...

  9. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  10. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

随机推荐

  1. Python的round()函数与数学的四舍五入的区别

    print(round(0.5))>>0print(round(1.5))>>2print(round(2.5))>>2整数部分为偶 小数为0.5 向下取整 0也是 ...

  2. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  3. golang 日志框架(zap)完整配置和使用

    目录结构: logger.go文件: package log import ( rotatelogs "github.com/lestrrat-go/file-rotatelogs" ...

  4. pikachu PHP反序列化 XXE SSRF

    PHP反序列化在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 另外这个漏洞一般是在代码审计的时候发现的,在扫描或者黑盒测试的时候很难发现.1.序 ...

  5. 嵌入式ARM汇编详解

    文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...

  6. Synchronized和ReentranLock的区别

    1.底层实现上来说? Synchronized是JVM层面的锁,是Java关键字,通过monitor对象来完成. ReentranLock是API层面的锁底层使用AQS. 2.是否可手动释放锁? sy ...

  7. 栈编程和函数控制流: 从 continuation 与 CPS 讲到 call/cc 与协程

    原标题:尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解 本文为部分函数式编程的扩展及最近接触编程语言控制流的学习和 ...

  8. mysql 优化面试题

    第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引. 2.应尽量避免在 where 子句中使用 ...

  9. 从元素抽取属性,文本和HTML

    问题 在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据. 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的 ...

  10. 【axios】API 说明

    基于promise用于浏览器和node.js的http客户端 特点 支持浏览器和node.js 支持promise 能拦截请求和响应 能转换请求和响应数据 能取消请求 自动转换JSON数据 浏览器端支 ...