简单才是王道:Spring Data JPA 极简教程
xsobi 2024-12-19 17:11 1 浏览
之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库。其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data JPA。
Spring Data JPA 是Spring Data框架下的一个基于JPA标准操作数据的模块,简化了操作持久层的代码,只需要编写接口就可以。如果你是第一次使用 Spring Data JPA ,你一定会惊呼这东西简直就是神器,几乎不需要写什么关于数据库访问的代码,就能完整的实现 CURD 的全部功能,使用非常简单方便。下面我们就来讲述 JPA 使用的基本操作。
一、Spring Data JPA介绍
JPA (Java Persistence API), Java持久层 API的简称,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,JPA是一个基于O/R映射的标准规范。
JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。主要包括括以下3方面的技术:
- ORM映射元数据 将实体对象持久化到数据库表中
- API,用来操作实体对象,执行CRUD操作
- 查询语言,通过面向对象,而非面向数据库的查询语言查询数据
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 作为该字段的长度。
以上就是整合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 整合mybatis,使用注解的方式(自动生成注解)
Spring Boot 使用JdbcTemplate操作数据库,配置多数据源
相关推荐
- js向对象中添加元素(对象,数组) js对象里面添加元素
-
一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...
- JS小技巧,如何去重对象数组?(一)
-
大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....
- 「C/C++」之数组、vector对象和array对象的比较
-
数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...
- 如何用sessionStorage保存对象和数组
-
背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...
- JavaScript Array 对象 javascript的array对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- JavaScript中的数组Array(对象) js array数组
-
1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...
- 数组和对象方法&数组去重 数组去重的5种方法前端
-
列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...
- C++ 类如何定义对象数组?初始化数组?linux C++第43讲
-
对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...
- ElasticSearch第六篇:复合数据类型-数组,对象
-
在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...
- 第58条:区分数组对象和类数组对象
-
示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...
- 八皇后问题解法(Common Lisp实现)
-
如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...
- visual lisp修改颜色的模板函数 怎么更改visual studio的配色
-
(defunBF-yansemokuai(tuyuanyanse/ss)...
- 用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀
-
1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...
- 图的深度优先搜索和广度优先搜索(Common Lisp实现)
-
为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...
- 两个有助于理解Common Lisp宏的例子
-
在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- strcat (25)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- element style (30)
- dedecms模版 (53)
- vs打不开 (29)
- nmap (30)
- webgl开发 (24)
- parse (24)
- c 视频教程下载 (33)
- android 开发环境 (24)
- paddleocr (28)
- listview排序 (33)
- firebug 使用 (31)
- transactionmanager (30)
- characterencodingfilter (33)
- getmonth (34)
- commandtimeout (30)
- hibernate教程 (31)
- label换行 (33)