【spring data jpa】数据的增删改查(CRUD)

一、添加依赖

在pom文件中添加spring data jpa依赖

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>3.1.4</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>6.3.1.Final</version>
</dependency>
<dependency><groupId>org.apache.derby</groupId><artifactId>derby</artifactId><version>10.14.2.0</version><scope>test</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope>
</dependency>

这里使用的是spring data jpa的3.1.4版本,另外引入了hibernate、derby、junit等包

二、创建实体

在src/test/java的cn.horse.chapter01.entity包下创建User实体类

package cn.horse.chapter01.entity;import jakarta.persistence.Entity;
import jakarta.persistence.Id;@Entity(name = "T_USER")
public class User {@Idprivate String id;private String username;public void setId(String id) {this.id = id;}public String getId() {return id;}public void setUsername(String username) {this.username = username;}public String getUsername() {return username;}
}

@Entity:实体表映射,name用于指定表名称

@Id:指定主键

三、创建持久化类

在src/test/java的cn.horse.chapter01.repository包下创建UserRepository持久化类

package cn.horse.chapter01.repository;import cn.horse.chapter01.entity.User;
import org.springframework.data.repository.CrudRepository;public interface UserRepository extends CrudRepository<User, String> {
}

UserRepository继承CrudRepository类,这样UserRepository类将可以使用父类中提供的CRUD方法;另外继承CrudRepository类需要指定泛型,第一个泛型类型是持久化实体类型,第二个泛型类型是持久化主键类型

四、应用配置

在src/test/java的cn.horse.chapter01.config包下创建ApplicationConfig配置类

package cn.horse.chapter01.config;import jakarta.persistence.EntityManagerFactory;
import org.hibernate.cfg.AvailableSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;
import java.util.Properties;@Configuration
@EnableJpaRepositories(basePackages = "cn.horse.chapter01.repository")
@EnableTransactionManagement
class ApplicationConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();driverManagerDataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");driverManagerDataSource.setUrl("jdbc:derby:demo;create=true");driverManagerDataSource.setUsername("");driverManagerDataSource.setPassword("");return driverManagerDataSource;}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();vendorAdapter.setGenerateDdl(true);vendorAdapter.setShowSql(true);LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();factory.setJpaVendorAdapter(vendorAdapter);factory.setPackagesToScan("cn.horse.chapter01.entity");factory.setDataSource(dataSource());Properties jpaProperties = new Properties();jpaProperties.put(AvailableSettings.HBM2DDL_AUTO, "create");factory.setJpaProperties(jpaProperties);return factory;}@Beanpublic PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {JpaTransactionManager txManager = new JpaTransactionManager();txManager.setEntityManagerFactory(entityManagerFactory);return txManager;}
}

@EnableJpaRepositories:配置可用持久化类,另外我们还配置了持久化类扫描的包路径(cn.horse.chapter01.repository
@EnableTransactionManagement:配置可用事务管理

另外还将数据源(DataSource)、实体管理工厂(EntityManagerFactory)、Jpa事务管理(PlatformTransactionManager)实例注册到Spring容器中。

其中实体管理工厂(EntityManagerFactory)实例的创建由LocalContainerEntityManagerFactoryBean对象完成,LocalContainerEntityManagerFactoryBean对象创建的过程中设置了实体类扫描的包路径(cn.horse.chapter01.entity),属性中还设置了DDL方式(create),此方式会先删除表后再创建新表。

五、启动程序

1、准备数据

在src/test/resources的cn/horse/chapter01目录下创建data.sql脚本

INSERT INTO T_USER(id, username) VALUES('1', '张三'),('2', '李四'),('3', '王五');

2、单元测试

在src/test/java的cn.horse.chapter01包下创建SpringDataJpaTest测试类

package cn.horse.chapter01;import cn.horse.chapter01.entity.User;
import cn.horse.chapter01.repository.UserRepository;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Iterator;public class SpringDataJpaTest {static final ApplicationContext applicationContext;static final UserRepository userRepository;static {applicationContext = new AnnotationConfigApplicationContext("cn.horse.chapter01.config");userRepository = applicationContext.getBean(UserRepository.class);try {ScriptUtils.executeSqlScript(applicationContext.getBean(DataSource.class).getConnection(), new ClassPathResource("cn/horse/chapter01/data.sql"));} catch (SQLException e) {throw new RuntimeException(e);}}@Testpublic void testFindAll() {Iterator<User> iterator = userRepository.findAll().iterator();Assert.assertEquals("1", iterator.next().getId());Assert.assertEquals("2", iterator.next().getId());Assert.assertEquals("3", iterator.next().getId());Assert.assertEquals(false, iterator.hasNext());}@Testpublic void testCount() {Assert.assertEquals(3, userRepository.count());}@Testpublic void testInsert() {long historyCount = userRepository.count();User user = new User();user.setId("4");user.setUsername("赵六");userRepository.save(user);Assert.assertEquals(historyCount + 1, userRepository.count());Assert.assertNotNull(userRepository.findById("4").orElse(null));Assert.assertEquals("赵六", userRepository.findById("4").map(User::getUsername).orElse(null));}@Testpublic void testUpdate() {long historyCount = userRepository.count();User user = new User();user.setId("1");user.setUsername("张三2");userRepository.save(user);Assert.assertEquals(historyCount, userRepository.count());Assert.assertNotNull(userRepository.findById("1").orElse(null));Assert.assertEquals("张三2", userRepository.findById("1").map(User::getUsername).orElse(null));}@Testpublic void testDelete() {long historyCount = userRepository.count();userRepository.deleteById("3");Assert.assertEquals(historyCount - 1, userRepository.count());Assert.assertNull(userRepository.findById("3").orElse(null));}
}

执行单元测试通过

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

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

相关文章

如何使用 arrayList.removeAll(Collection<?> c)?

引言 对于 Collection 集合及其实现类都有 removeAll(Collection<?> c)。 对于ArrayList 的实例对象&#xff0c;在数据比较多的情况下&#xff0c;方法 removeAll() 的传参 c 的类型是 HashSet会比是 ArrayList 的情况快的多。 原因 我们来细看一下ArrayList类的re…

perf性能分析

安装 apt install linux-tools-common linux-tools-generic 可能安装在/usr/bin/perf&#xff0c;如果版本不对&#xff0c;可以看看 /usr/lib/linux-tools/[version]/ 下有没有perf&#xff0c;如果有的话替换一下就可以 使用 perf record -g -p pid # 记录数据&#x…

C++桶排序算法的应用:存在重复元素 III

题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j)&#xff1a; i ! j, abs(i - j) < indexDiff abs(nums[i] - nums[j]) < valueDiff 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…

城市广告牌安全传感器特点有哪些?

城市广告牌安全传感器特点有哪些&#xff1f; 在现代快节奏的都市生活中&#xff0c;城市的广告牌成为不可或缺的一部分&#xff0c;以各种形式和大小存在于城市的街头巷尾&#xff0c;商业中心和交通要道。广告牌是城市生命线组成的一部分。但是由于天气因素、材料老化、不当维…

MySQL [基础]] 学习笔记

MySQL 学习 文章目录 MySQL 学习1. 数据库三层结构2. 数据在数据库中的存储方式3. SQL 语句分类3.1 备份恢复数据库的表 4. Mysql 常用数据类型(列类型)4.1 数值型(整数)的基本使用4.2 数值型(bit)的使用4.3 数值型(小数)的基本使用4.4 字符串的基本使用(面试题)4.5 字符串使用…

【JUC】JMM

文章目录 1. 概述2. 三大特性2.1 可见性2.2 原子性2.3 有序性 3. 多线程对变量的读写过程4. 先行发生原则(happens-before) 1. 概述 CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存&#xff0c;而内存的读和写操作的时候就会造成不一致的问题 JVM规范中试图定义…

【软件测试】Requests库中处理cookie的几种方式

前言 发送请求时经常需要利用请求头中的cookie字段来做用户访问状态的保持&#xff0c;关于的cookie的处理常见有下面一些处理方式&#xff0c;这里做个小小的总结 1.直接在请求中传递cookies参数 import requestshost http://119.91.144.93:82 api r/ecshop/user.php url…

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…

DataPath实现渐变效果

Android的vector矢量图很好用&#xff0c;可以画出保证清晰度的任意图形。但是Android Nougat之前的VectorDrawable不支持渐变色&#xff0c;如果要使用渐变色就要使用png图片或者自定义GradientDrawable。这么明显的不足&#xff0c;肯定是要修补上呀&#xff0c;API 24中的Ve…

Apache Spark 中的 RDD是什么

目录 RDD容错性 RDD进行迭代计算 RDD是Resilient Distributed Dataset的缩写&#xff0c;是Apache Spark中的一个关键概念。RDD是一种分布式的内存抽象&#xff0c;用于将数据划分为不同的片段以进行并行计算。RDD是一个只读的数据集&#xff0c;可以分布在集群的不同节点上&…

五、RocketMQ发送顺序消息

顺序消息的应用场景 在有序事件处理、撮合交易、数据实时增量同步等场景下&#xff0c;异构系统间需要维持强一致的状态同步&#xff0c;上游的事件变更需要按照顺序传递到下游进行处理。 例如需要保证一个订单的生成、付款和发货&#xff0c;这三件事情是被顺序执行的。 如…

软件工程第六周

软件体系结构概述 体系结构&#xff1a;一种思想&#xff0c;而框架就是思想的实现&#xff0c;设计模式就是根据某一特殊问题实现的框架。 体系结构&#xff1a;体系结构是软件系统的高级结构。它定义了系统的主要组成部分&#xff0c;以及这些部分之间的关系和交互方式。 框…

springboot自动配置原理面试题(自用)

springboot自动装配主要是基于注解编程和约定大于配置的思想设计 核心步骤&#xff1a; 1 组件必须包含configuration并声明为bean注解返回注入到IOC容器中 2 第三方jar包&#xff0c;根据/meta-inf/目录下增加spring.factories文件加载配置文件中的内容 3 springboot获取到…

NSSCTF做题(9)

[GDOUCTF 2023]<ez_ze> 看见输入框而且有提示说是ssti注入 输入{{7*7}} 试试&#xff0c;发现报错 输入{%%}发现了是jinja2模板 找到关键函数 Python SSTI利用jinja过滤器进行Bypass ph0ebuss Blog 原理见这篇文章&#xff0c;这里直接给出payload {%set ninedict(aaa…

3.1 SQL概述

思维导图&#xff1a; 前言&#xff1a; 前言笔记&#xff1a;第3章 关系数据库标准语言SQL - **SQL的定义**&#xff1a; - 关系数据库的标准和通用语言。 - 功能强大&#xff0c;不仅限于查询。 - 功能覆盖&#xff1a;数据库模式创建、数据插入/修改、数据库安全性与…

绿某科技集团股份有限公司UTS统一威胁探针信息泄露漏洞复现 CNVD-2022-50360

目录 1.漏洞概述 2.影响版本 3.漏洞等级 4.漏洞复现 5.Nuclei自动化扫描POC 6.修复建议

Angular知识点系列(4)-每天10个小知识

目录 31. Zone.js和Angular的作用32. 代码审查和测试33. 服务器端渲染&#xff08;SSR&#xff09;34. 安全问题和XSS攻击35. 管理和配置环境变量36. 使用Angular的schematics37. 处理大型表单和复杂数据交互38. Angular的Ivy引擎39. 使用Web Workers进行性能优化40. 代码拆分和…

LeetCode 1095. 山脉数组中查找目标值【数组,二分】1827

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

OOA/D 时统一过程(UP)中的 迭代、 进化 和 敏捷

一、迭代和进化式开发的优势 相对于顺序或“瀑布”软件开发模型&#xff0c;迭代和进化式开发&#xff08;iterative and evolutionary development &#xff09;对部分系统及早地引入了编程和测试&#xff0c;并重复这一循环。这种方式通常会还没有详细定义所有需求的情况下假…

如何使用前端构建工具(如Webpack、Parcel)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…