SpringBoot JPA使用

SpringBoot JPA使用

简介

Spring Data JPA 是 Spring 框架提供的一个模块,用于简化与关系型数据库的交互和数据访问。它基于JPA(Java Persistence API)标准,并提供了一组易于使用的API和工具,帮助开发人员更轻松地进行数据库操作。通过Spring Data JPA,开发人员可以通过编写简洁的代码来执行常见的 CRUD 操作,同时还支持高级查询、分页、事务管理等功能。它的目标是提供一种更简单、更高效的方式来处理数据库操作,减少开发人员的工作量,并提高应用程序的可维护性和可扩展性。

创建工程

使用 idea 快速创建 Spring Boot 整合 Spring Boot JPA实例。我们选择了 spring-boot-starter-webspring-boot-starter-data-jpamysql-connector-jspring-boot-starter-test 依赖。

对应的pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

创建实体 Entity

@Entity
@Table(name = "t_user")
public class TUser {@Id@Column@GeneratedValue(strategy = GenerationType.IDENTITY) // 使用数据库自增private long id;@Columnprivate String username;@Columnprivate String age;
}

@Entity 表示这个类是一个需要受 EntityManager 管理的实体类。@Table(name = "sys_user") 注解指定了实体在数据库中所对应的表名称。@Id 用于标识ID字段,@GeneratedValue(strategy = GenerationType.IDENTITY) 注解指定了 ID 值的生成方式,其中 GenerationType.IDENTITY 表示主键由数据库自动生成(自增)。@Column 注解表示对象字段和数据表列的映射关系。

TUser对应的SQL

CREATE TABLE `t_user` (`id` int NOT NULL AUTO_INCREMENT,`username` varchar(255) NOT NULL,`age` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8

创建 Repository 接口

package org.example.springbootjpa.repository;import org.example.springbootjpa.entity.TUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Repository
public interface TUserRepository extends JpaRepository<TUser, Long>, JpaSpecificationExecutor<TUser> {List<TUser> findTUsersByAge(String age);@Transactionalint deleteTUsersByAge(String age);
}

通过继承 JpaRepositoryJpaSpecificationExecutor 就可以获得已经预定义的各种 CRUD 方法。其中 JpaRepository 的泛型对象是实体类型和 ID 类型,JpaSpecificationExecutor 的泛型对象只有实体类型。

使用 @Repository 注解表示这是一个 Repository 接口。

@Transactional 代表启用事务。因为By删除操作,是先执行 select by id, 然后通过 id 逐条删除记录的,所以需要事务。

配置 application.yml

spring:application:name: spring-boot-jpa# 数据源配置datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/kgc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&allowMultiQueries=trueusername: rootpassword: rootjpa:database-platform: org.hibernate.dialect.MySQLDialectshow-sql: trueproperties:hibernate:format_sql: truehbm2ddl:auto: none
logging:level:org:hibernate:orm:jdbc:bind: "TRACE"

上述常用配置中,数据源的配置是必须的。其他配置项都有默认值。

其中 spring.jpa.hibernate.ddl-auto 比较重要,表示建表的策略,可选的枚举值如下:

  • create:不管表是否存在,每次启动都会重新建表(会导致数据丢失)。
  • create-drop:启动的时候创建表,程序退出(SessionFactory 关闭)的时候删除表。
  • none:不进行任何操作。
  • update:如果数据表不存在则创建,在实体对象被修改后,下次启动重新修改表结构(不会删除已经存在的数据)。
  • validate:启动的时候验证数据表的结构。

建议使用 none,手动维护数据表结构,以避免不小心修改了实体对象后导致表结构被修改,甚至是数据丢失。

编写Controller

package org.example.springbootjpa.controller;import org.example.springbootjpa.entity.TUser;
import org.example.springbootjpa.repository.TUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Random;@RestController
@RequestMapping("/user")
public class UserController {@AutowiredTUserRepository tUserRepository;@PostMapping("/addUser")public String addUser() {Random rand = new Random();TUser tUser = new TUser();tUser.setAge("10");tUser.setUsername("chenguowei"+ rand.nextInt(100));tUserRepository.save(tUser);return "success";}@GetMapping("/getUsersByAge")public List<TUser> getUsesrByAge(@RequestParam(value = "age", required = true) String age) {System.out.println("getUserByAge: " + age);return  tUserRepository.findTUsersByAge(age);}@PostMapping("deleteUsersByAge")public String deleteUsersByAge(@RequestParam(value = "age", required = true) String age) {System.out.println("deleteUsersByAge: " + 10);int result = tUserRepository.deleteTUsersByAge(age);System.out.println("deleteTUsersByAge result: " + result);return "success " + result;}
}

这里使用字段注入的方式 @Autowired, 实际中最好使用 setXXX()注入方式。

编写SQL

 @Transactional@Modifying@Query(nativeQuery = true, value = "delete from t_user where age = ?1")int deleteTUser(String age);

事务管理

 @Transactional(rollbackFor = Exception.class)public void register(String age) throws Exception {TUser user = new TUser();user.setAge(age);user.setUsername("chenguowei");tUserRepository.save(user);if (Objects.equals(age, "10")) {throw new Exception("测试事务");}TOrder tOrder = new TOrder();tOrder.setName("chenguowei");tOrder.setNumber(age);tOrderRepository.save(tOrder);}
  • ​ 多个方法嵌套调用,如果都有 @Transactional 注解,则产生事务传递,默认 Propagation.REQUIRED。
  • ​ 事务默认只对 RutimeException 回滚,而非 Exception回滚。
  • ​ 如果要对 checked Exceptions 进行回滚,则需要 @Transactional(rollbackFor = Exception.class)

联表查询

新建一个联表的结构体

package org.example.springbootjpa.dao;public interface UserOrderDao {String getName();String getNumber();String getUsername();String getAge();
}

自定义联表查询语句

@Query(nativeQuery = true, value = "select username, age, number, name " +"from t_user left join t_order ON t_user.age = t_order.number")public List<UserOrderDao> findViewInfo();

测试

curl -XGET ‘http://localhost:8080/user/getUsersByAge?age=10’

curl -XPOST ‘http://localhost:8080/user/addUser’

curl -XPOST ‘http://localhost:8080/user/deleteUserSql?age=10’

curl -XPOST ‘http://localhost:8080/user/transaction?age=10’

curl -XGET ‘http://localhost:8080/user/findViewInfo’

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

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

相关文章

深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解

目录 深入理解分布式事务① ---->分布式事务基础&#xff08;四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置&#xff09;详解事务的基本概念1、什么是事务&#xff1f;2、事务的四大特性2-1&#xff1a;原子性&#xff08;Atomic&#xff09…

(学习日记)2024.04.30:UCOSIII第五十四节:User文件夹函数概览(uCOS-III->Ports文件夹)

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。 这…

Linux深入学习 - 进程

目录 进程描述符 标识一个进程 进程组织 进程之间的关系 如何组织进程 等待队列 进程资源限制 进程切换 硬件上下文 switch_to宏 创建进程 do_fork 内核进程 撤销有一个进程 do_group_exit do_exit函数 Reference 下面开始讨论一个非常重要的抽象&#xff1a;…

黑烟车智能电子抓拍系统大幅度节约人力物力

黑烟车智能电子抓拍系统大幅度节约人力物力&#xff0c;之前黑烟车监测通过执勤交警人工现场监测会耗费大量人力物力&#xff0c;效率较低&#xff0c;现在通过黑烟车智能电子抓拍系统可以大辅导提升监测效率&#xff0c;遗漏少&#xff0c;效率高&#xff0c;值得大力推广。 黑…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

红米A2/A2+/POCO C51手机秒解BL+快速获取root权限+解谷歌锁刷机救砖教程

红米A2/A2/POCO C51手机是目前小米公司针对于国外用户的1个独立的品牌&#xff0c;或者和国内的红米手机都非常相似&#xff0c;几款手机由于硬件非常接近&#xff0c;我们这里将其放在一起和大家介绍而从他们的代号中我们可以得知&#xff0c;目前A2/POCO的代号为water&#x…

从零学算法1017

1017. 负二进制转换 给你一个整数 n &#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。 注意&#xff0c;除非字符串就是 “0”&#xff0c;否则返回的字符串中不能含有前导零。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&…

ORAN每个端点和每个C平面消息的限制

O-RU每个端点的处理限制 当O-RU的处理粒度是基于端点的&#xff0c;即&#xff0c;在O-RU中处理C/U平面消息的处理资源被分配给每个端点时&#xff0c;O-RU可以对每个端点施加特定限制&#xff0c;例如&#xff0c;endpoint-section-capacity、endpoint-beam-capacity、endpoi…

ctfshow web78 获取flag

第一种&#xff1a;利用input伪协议 ,获取到flag 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readconvert.base64-encode/resourceflag.php 得到的结果PD9waHANCg0KLyoNCiMgLSotIGNvZG…

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天&#xff1a;滑动窗口和前缀和 这里我参考了西法的博客&#xff0c; 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组&#xff08;困难&#xff09;1109. 航班预订统计(中等) 前四…

C++ map自定义比较函数遵守严格弱序

问题背景及定位 背景&#xff1a;这个问题是在将tablesaw&#xff08;一个Java的数据处理项目&#xff09;迁移到C时出现的。 问题位置&#xff1a;SplitOn()函数&#xff0c;在数据流水线中的aggregate阶段。 问题描述&#xff1a;使用google/benchmark进行了批量化的性能测…

机器学习周报第36周 AT-LSTM

文章目录 week36 AT-LSTM摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 LSTM3.2 注意力机制概述3.3 AT-LSTM3.4 数据预处理 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 训练参数4.3.2 数据集4.3.3 实验设置4.3.4 实验结果 5. 基于pytorch的transfor…

asp.net表单上传文件

asp.net表单上传文件 可以用自己的主机搭建服务器环境测试 1.借鉴文章&#xff1a; 原文链接&#xff1a;http://www.cnblogs.com/gxwang/p/4883902.html 2.html端示例代码&#xff0c; 文件名为index.aspx <% Page Language"C#" AutoEventWireup"true…

IDEA那些牛X的插件

activate-power-mode&#xff1a;代码震动效果 Easy JavaDoc&#xff1a;帮你写注释 EASY Code&#xff1a;帮你生成mapper之类的代码 Generate O2O&#xff1a;帮你生成两个类之间复制的代码 GitToolBox&#xff1a;Git工具 IDE Eval Reset&#xff1a;懂得都懂 Java Be…

使用Cesium ion将 Sketchfab 3D 模型添加到您的GIS应用中

您现在可以将 Sketchfab 中的 3D 模型导入 Cesium ion 中以创建 3D 块&#xff0c;从而更轻松地为地理空间体验创建上下文和内容。 Sketchfab 是 Epic Games 的一部分&#xff0c;也是使用最广泛的 3D 资产市场之一。自 2012 年推出以来&#xff0c;已有超过 1000 万用户使用 …

【数据结构】最小生成树(Prim算法、Kruskal算法)解析+完整代码

5.1 最小生成树 定义 对一个带权连通无向图 G ( V , E ) G(V,E) G(V,E)&#xff0c;生成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。 设R为G的所有生成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称…

3. uniapp开发工具的一些事

前言 新的一天&#xff0c;又要开始卷起来了&#xff0c;开发程序开发当前离不开开发工具&#xff0c;一个好的开发工具办事起来那必然是事倍功半的...本文主要分享了关于uniapp里开发工具的一些事~ 概述 阅读时间&#xff1a;约5&#xff5e;7分钟&#xff1b; 本文重点&am…

ssh基本功能

SSH&#xff08;Secure Shell&#xff09;是一种安全协议&#xff0c;用于在不安全的网络中为网络服务提供安全的传输。SSH利用公钥加密技术为远程登录会话和其他网络服务提供安全性的协议。可以有效防止远程管理过程中的信息泄露问题。 SSH的主要功能有&#xff1a; 远程登录…

Visual Studio Code基础:打开一个编辑器(文件)时,覆盖了原编辑器

相关阅读 VS codehttps://blog.csdn.net/weixin_45791458/category_12658212.html?spm1001.2014.3001.5482 在使用vscode时&#xff0c;偶尔会出现这样的问题&#xff1a;打开了某个编辑器&#xff08;文件&#xff0c;下面统称文件&#xff09;后&#xff0c;再打开其他文件…

清理Mac电脑中的垃圾文件,让Mac电脑像新的一样好

CleanMyMac是一款流行的Mac系统优化工具&#xff0c;它可以帮助用户清理Mac电脑中的垃圾文件、优化系统性能、管理应用程序、保护隐私和提升电脑运行速度。下面是CleanMyMac的一些主要功能&#xff1a; 系统清理&#xff1a;清除系统缓存、日志文件、语言文件等&#xff0c;释放…