快速入门Spring Data JPA

Spring Data JPA是Spring Data框架的一小部分,它能够让开发者能够更加简单的对数据库进行增删改查。

由于Spring Data JPA可以自动生成SQL代码所以一般情况下,简单的增删查改就可以交给Spring Data JPA来完成,而复杂的动态SQL等用MyBatis来完成。

Spring Data JPA的入门非常简单,接下来请看正文(我使用的是MySQL数据库):

快速入门Spring Data JPA

首先我们先创建一个数据库和表,创建数据库和表的SQL代码如下:

-- 如果存在text数据库就删除该数据库
drop database if exists text;
-- 创建名为text的数据库
create database text charset utf8;use text;-- 用户表
create table user_info(id INT(11) primary key AUTO_INCREMENT,user_name VARCHAR(20) NOT NULL,gender INT(1) NOT NULL COMMENT '0.男;1.女',create_time DATETIME
);

创建一个空的Spring项目,我使用的是Spring Boot创建的项目。pom文件中引入的依赖如下:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombook:用来自动生成get,set,toString和构造方法等--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--Spring Data JPA依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency></dependencies>

因为Spring Boot默认支持的数据库是H2,所以如果想要使用其他的数据库就必须配置application.properties文件,所以在依赖引入之后还需要修改配置文件,配置文件中除了设置数据库的配置之外还需要设置JPA的配置,但是这个配置也非常简单,只有一行,代码如下:

spring.jpa.hibernate.ddl-auto=update
#设置显示SQL代码
spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto的取值值有4种:

  • none: MySQL默认的配置。不能修改数据库结构;
  • update: Hibernate能够根据给定实体类结构来修改数据库;
  • create: 每次都创建数据库,但是在关闭后并不进行删除;
  • create-drop: 创建数据库,并且当SessionFactory关闭时删除它。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。

创建JAVA实体类:

package com.example.spring.jpa;import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;import javax.persistence.*;
import java.util.Date;@Data
@Entity
@Table(name = "user_info")
public class UserInfo {@Id@Column(name="id")@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;@Column(name="user_name")private String userName;@Column(name="gender")private Integer gender;@Column(name="create_time")private Date createTime;
}

@Data: 该注解是Lombook的注解,添加这个注解后程序会在编译阶段自动生成get,set,toString,无参构造方法等基础方法。

@Entity: 该注解表示这个类是一个JPA实体。

@Table: 该注解表示这个实体和数据库中表的对应关系。如果没有该注解就默认对应的数据库中表的名称为类名即:UserInfo。name属性的值为数据库中对应的表名。

@Id: 表示该属性为主键。

@Column: 该注解表示这个属性和数据库中字段的对应关系。name属性的值为数据库中对应的字段名。如果没有该注解则默认属性名就是字段名。

@GeneratedValue: 提供主键值的生成策略规范。有四种取值默认为AUTO即自动生成ID。

编写持久层的代码,只需要加上@Repository注解并继承CrudRepository接口,接口传的类型为<实体类型,主键类型>:

package com.example.spring.jpa;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends CrudRepository<UserInfo, Integer> {
}

编写业务逻辑层代码:

package com.example.spring.jpa;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service
public class JpaService {@Resourceprivate UserRepository userRepository;//添加数据public Object insertUserInfo(UserInfo userInfo) {return userRepository.save(userInfo);}//根据id删除数据public void deleteUserInfo(Integer id) {userRepository.deleteById(id);}//修改数据public Object update(UserInfo userInfo) {return userRepository.save(userInfo);}//查找数据public Object selectUserInfo() {return userRepository.findAll();}
}

这些方法都是来自CrudRepository接口,它里面定义了常用CRUD接口。

如果你仔细观察就会发现插入数据和修改数据使用的是同一个接口,它会根据主键值是否存在于数据库中来判断是修改还是插入。

编写控制层接口:

package com.example.spring.jpa;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController
@RequestMapping("/jpa")
public class Controller {@Resourceprivate JpaService jpaService;@RequestMapping("/delete")public void delete(Integer id) {jpaService.deleteUserInfo(id);}@RequestMapping("/select")public Object select() {return jpaService.selectUserInfo();}@RequestMapping("/insert")public Object insert(UserInfo userInfo) {return jpaService.insertUserInfo(userInfo);}@RequestMapping("/update")public Object update(UserInfo userInfo) {return jpaService.update(userInfo);}
}

到此为止你已经入门了

JAP是如何区分你是想要插入数据,还是修改数据?

接下来我们使用Postman进行测试,用结果和它所对应现象来说话

细心的小伙伴可能会发现当程序刚一启动数据库中就自动创建了一个不认识的表:

如果没注意的话你可以将数据库删除重新创建,然后再重新启动一边程序。

那么这个表是干啥的?有啥用呢?往下看

根据控制台打印的SQL语句我们可以知道,程序先查询并设置了hibernate_sequence表中的内容,然后才进行的插入操作,注意此时我们没有给id传值

执行完修改操作后我们可以从响应中发现修改成功了,接下来我们再看一下控制台打印的SQL语句,注意此时我们给id传值了

 我们可以发现程序是先根据id来查找到值之后才进行的修改。

接下来我们再插入时给id赋予初值然后再来看结果:

注意看:此时的SQL语句中可以看出来程序是先根据id查找表中的对应书据,发现没找到,然后才查询并设置了hibernate_sequence表中的内容,然后才进行的插入操作。

总结:

程序会先判断主键是否有初值,如果没有就执行插入操作;否则根据该值来查找对应的数据,如果找到就执行修改操作;否则就执行插入操作;

针对项目自定义查询

我们上面使用操作数据库的方法都是CrudRepository接口中的方法,那么就算它再全也不可能覆盖所有的接口,所以我们还可以针对自己的项目进行自定义接口,例如我现在想要根据gender来查询用户信息:

在UserRepository接口中添加一个方法:

package com.example.spring.jpa;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;import javax.persistence.criteria.CriteriaBuilder;
import java.util.List;@Repository
public interface UserRepository extends CrudRepository<UserInfo, Integer> {List<UserInfo> findByGender(Integer gender);
}

为了方便起见,我们直接在控制层调用:

@RequestMapping("/selectByGender")
public Object select(Integer gender) {return userRepository.findByGender(gender);
}

注意:虽然他给了我们自定义接口的能力,但是接口的命名必须符合要求。在IDEA中编译器就会进行提示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式---模板方法模式

一、介绍 所谓模板方法模式&#xff0c;就是提供一种方法的模板来实现一种规范&#xff0c;其他人可以利用这个模板定义自己的逻辑。 在Java编程中的应用&#xff0c;主要就是通过接口或者抽象类来实现的&#xff0c;抽象类中可以把逻辑函数声明为final类型&#xff0c;表示不能…

即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录 一、摘要 二、创新点说明 2.1 Methodology 2.2SRU for Spatial Redundancy​编辑 2.3CRU for Channel Redundancy 三、实验 3.1基于CIFAR的图像分类 3.2基于ImageNet的图像分类 3.3对象检测 四、代码详解 五、总结 论文&#xff1a;https://openaccess.thecvf.c…

vue2/Vue3项目中,通过请求接口来刷新列表中的某个字段(如:Axios)

vue2/Vue3项目中&#xff0c;通过请求接口来刷新列表中的某个字段。可以使用 Vue 的异步请求库&#xff08;如 Axios&#xff09;来发送请求&#xff0c;并在请求成功后更新相应的字段。 示例如下&#xff08;Vue2&#xff09;&#xff1a; 简单的示例如下&#xff0c;假设列…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

jetson nx安装nomachine后无法进入linux shell

以下问题都是一个原因造成的 我在jetson nx上安装了nomachine后&#xff0c;连接时需要登陆用户名和密码&#xff0c;那这个用户名密码是什么&#xff0c;我使用系统的用户名和密码返回错误。login as a system user on this server总是failed&#xff0c;直接登录ssh输入用户…

nginx-http-flv配置

hls配置 hls配置放在 http.server里面 http {server {# HTTP监听端口listen 8002;location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias ./temp/hls; # HLS文件存放路径&#xff0c;请替换为你实际的路径expires -1;add_header Cache-Control no…

你的RPCvs佬的RPC

一、课程目标 了解常见系统库的hook了解frida_rpc 二、工具 教程Demo(更新)jadx-guiVS CodejebIDLE 三、课程内容 1.Hook_Libart libart.so: 在 Android 5.0&#xff08;Lollipop&#xff09;及更高版本中&#xff0c;libart.so 是 Android 运行时&#xff08;ART&#x…

ubuntu手动编译opencv 4.9.0遇到的问题汇总

ubuntu手动编译opencv 4.9.0遇到的问题汇总 编译流程 以4.9.0版本为例&#xff0c;可参考&#xff1a;https://docs.opencv.org/4.9.0/d2/de6/tutorial_py_setup_in_ubuntu.html 编译加速 https://blog.csdn.net/tfb760/article/details/104030841 ippicv_2021.10.0_lnx_i…

细说postgresql之pg_rman备份恢复 —— 筑梦之路

pg_rman是一款开源的备份恢复软件&#xff0c;支持在线和基于PITR的备份恢复方式。 pg_rman类似于oracle的rman&#xff0c;可以进行全量、增量、归档日志的备份。 运行模式&#xff1a; 安装部署 Releases ossc-db/pg_rman GitHub 1、需要根据PG Server的版本&#xff0c;下…

聊天机器人ChatGPT指导下的论文写作

ChatGPT无限次数:点击直达 聊天机器人ChatGPT指导下的论文写作 引言 随着人工智能技术的不断发展&#xff0c;聊天机器人在各个领域得到了广泛应用。其中&#xff0c;ChatGPT作为一个先进的自然语言处理模型&#xff0c;为各种文本生成任务提供了强大的支持。在学术界&#xf…

ThreadLocal和ThreadLocalHashMap

请直接百度详细介绍 -------------------------------------------------------------------------------------------------------------------------------- 1.ThreadLocalMap是Thread类里的一个局部变量 2.ThreadLocalMap是ThreadLocal类里的一个静态内部类, 3.ThreadL…

浅谈对称加密(AES与DES)

浅谈对称加密&#xff08;AES与DES&#xff09; 对称加密是一种加密方式&#xff0c;其中同一个密钥&#xff08;也称为私钥或共享密钥&#xff09;用于加密和解密数据。这意味着加密和解密都使用相同的密钥。对称加密速度通常很快&#xff0c;因为它不涉及复杂的数学运算。 …

10. Spring MVC 程序开发

本文源码位置: Spring-MVC 1. Spring MVC 概要 摘自Spring官方&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes …

Adobe AE(After Effects)2015下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

大创项目推荐 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

速盾:js插件可以用cdn加速吗?

随着互联网技术的发展&#xff0c;网页的加载速度成为了用户体验的重要指标之一。在传统的Web开发中&#xff0c;为了提高网页的加载速度&#xff0c;通常会将静态文件如图片、样式表、脚本等存放在CDN&#xff08;Content Delivery Network&#xff09;上&#xff0c;以实现全…

嵌入式学习55-ARM4(ADC和I²C)

1、什么是ADC,模拟量和数字量有什么特点&#xff1f; ADC&#xff1a; …

Ubuntu Vs code配置ROS开发环境

文章目录 1.开发环境2.集成开发环境搭建2.1 安装Ros2.2 安装 Vs code2.3 安装vs code 插件 3.Vs code 配置ROS3.1 创建ROS工作空间3.2 从文件夹启动Vs code3.3 使用Vscode 编译ROS 空间3.4 使用Vs code 创建功能包 4.编写简单Demo实例4.1编写代码4.2编译与执行 1.开发环境 系统…

.NET/C#汇总 —— ASP.NET MVC

1.MVC中的TempData\ViewBag\ViewData区别? TempData 保存在Session中,Controller每次执⾏请求的时候,会从Session中先获取 TempData, ⽽后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条⽬访问 ⼀次后就从字典表中删除,ViewData存的是…

Sql server备份还原sql语句

使用备份文件指定新的数据库名称 USE MASTER --这里注意要使用MASTER&#xff0c;以免出现待还原库被占用的情况 RESTORE DATABASE [tsw_test] --为待还原库名 FROM DISK C:\Program Files\Microsof…