数据库访问中间件--springdata-jpa的基本使用
二、单表SQL操作-使用关键字拼凑方法
回顾
public interface UserRepository extends JpaRepository<User,Integer> {User findByUsernameLike(String username);
}@GetMapping("/user/username/{username}")public Object findUserByUsername(@PathVariable String username){return userRepository.findByUsernameLike("%"+username+"%");}
1、单表sql操作—使用关键词字拼凑的方法
| 关键字 | 示例 | JPQL 片段 |
|---|---|---|
| And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
| Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
| Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
| Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
| LessThan | findByAgeLessThan | … where x.age < ?1 |
| LessThanEqual | findByAgeLessThanEqual | … where x.age ⇐ ?1 |
| GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
| GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
| After | findByStartDateAfter | … where x.startDate > ?1 |
| Before | findByStartDateBefore | … where x.startDate < ?1 |
| IsNull | findByAgeIsNull | … where x.age is null |
| IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
| Like | findByFirstnameLike | … where x.firstname like ?1 |
| NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
| StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
| EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
| Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
| OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
| Not | findByLastnameNot | … where x.lastname <> ?1 |
| In | findByAgeIn(Collection ages) | … where x.age in ?1 |
| NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
| TRUE | findByActiveTrue() | … where x.active = true |
| FALSE | findByActiveFalse() | … where x.active = false |
| IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
2、单表sql操作—使用关键词字拼凑的方法案例
2.1、相关查询题目
●查询出年龄小于等于22岁的人;
●查询出年龄在20- 22岁并且性别是男的人;
●查询出已结婚且性别是男的人;
2.2、表结构
Person
pid varchar(32)
pname varchar(255) unique
psex varchar(255)
page int(3)
getmarried boolean
2.3、注意事项
- 实体类属性名不要出现isXxx、 getXxx的名称,会导致关键字拼凑出错
- 实体类属性名中间只要出现了大写字母,就会导致数据库的字段名有下划线隔开,比如你使
用isMarried属性名,那么实体类的字段名就会变成is_ married, 这样容易导致找不到值 - 属性名类型是boolean类型的在某些数据库中会变成bit(1)类型, 其中0为false, 1为true
src/main/resources/application.properties
#mysql的配置信息
spring.datasource.url=jdbc:mysql://localhost:3306/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#支持SQL 输出
spring.jpa.show-sql=true
#format 一下 SQL 进行输出
spring.jpa.properties.hibernate.format_sql=true
#自动生成开启,让表数据会自动跟随entity类的变化而变化
#spring.jpa.properties.hibernate.hbm2ddl.auto=update
#开启自动更新,若数据库没有对应的表,则生成,若有,则检查是否需要更改
spring.jpa.hibernate.ddl-auto=update
src/main/java/com/study/springdatajpademosecond/entity/Person.java
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;@Data//geter、setter、equals、hashcode以及tostring
@Entity
@AllArgsConstructor//全参构造
@NoArgsConstructor//无参构造
@Builder// 部分参数构造
public class Person {@Id@GenericGenerator(name = "myuuid",strategy = "uuid")@GeneratedValue(generator = "myuuid")private String pid;@Column(unique = true)private String pname;@Columnprivate String psex;@Columnprivate Integer page;@Columnprivate boolean getmarried;
}
src/main/java/com/study/springdatajpademosecond/entity/PersonInfo.java
public interface PersonInfo {String getPid();String getPname();String getPsex();String getPage();String getGetmerried();Integer getBid();String getBname();double getBprice();
}
src/main/java/com/study/springdatajpademosecond/repository/PersonRepository.java
import com.study.springdatajpademosecond.entity.Person;
import com.study.springdatajpademosecond.entity.PersonInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;import java.util.List;
import java.util.Map;public interface PersonRepository extends JpaRepository<Person,String> {//1、查询出年龄小于等于22岁的人;List<Person> findAllByPageIsLessThanEqual(Integer age);//2、查询出年龄在20-22岁之间并且性别是男的人List<Person> findAllByPageBetweenAndPsexEquals(Integer lowage,Integer highage,String sex);//3、查询出已经结婚并且性别是男的人List<Person> findAllByGetmarriedIsTrueAndPsexEquals(String psex);}
2.3、测试
@SpringBootTest
class SpringdataJpaDemoSecondApplicationTests {@Resourceprivate PersonRepository personRepository;@Testvoid contextLoads() {//初始化表// initPersons();//1、查询出年龄小于等于22岁的人;System.out.println(personRepository.findAllByPageIsLessThanEqual(22));System.out.println("---------------------------------------------------");//2、查询出年龄在20-22岁之间并且性别是男的人System.out.println(personRepository.findAllByPageBetweenAndPsexEquals(20,22,"男"));System.out.println("---------------------------------------------------");//3、查询出已经结婚并且性别是男的人System.out.println(personRepository.findAllByGetmarriedIsTrueAndPsexEquals("男"));}// 初始化数据库 加入private void initPersons() {List<Person> list = new ArrayList<>();Collections.addAll(list,Person.builder().pname("zhangsan").psex("男").page(22).getmarried(false).build(),Person.builder().pname("lisi").psex("女").page(21).getmarried(true).build(),Person.builder().pname("wangwu").psex("男").page(20).getmarried(false).build(),Person.builder().pname("zhaoliu").psex("女").page(23).getmarried(true).build(),Person.builder().pname("sunqi").psex("男").page(25).getmarried(true).build());personRepository.saveAll(list);}
}
三、单表SQL操作-使用关键字拼凑方法无法解决的问题及解决方法
1、造成的原因
- 实体类的属性名与表的字段名无法映射,导致关键字找不到
- CRUD操作方式比较另类或者是你不想用关键字的写法
- 涉及到了多表操作
2、解决方法
2.1、使用sql语句来书写sql
2.2、使用hql语句来书写sql
具体看文档
3、演示使用sql语句来书写sql
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50bas3S1-1690894364157)(005-springdata-jpa的基本使用.assets/image-20211020211827823.png)]](https://img-blog.csdnimg.cn/9fb693c97c934bf3aca1f000c433c202.png)
3.1、 实现接口
public interface PersonRepository extends JpaRepository<Person,String> {//4、根据pname来模糊删除一个person数据@Transactional@Modifying@Query(value = "delete from Person where pname like %:pname%")void deleteByName(@Param("pname") String pname);//5、使用HQL或者是sql来书写一个查询语句,查询出年龄在20-22岁,性别是女的人
// @Query(value = "select * from person where page between 20 and 22 and psex='女'",nativeQuery = true)@Query(value = "select p from Person p where p.page between 20 and 22 and p.psex='女'")List<Person> findPerson();//6、使用SPEL表达式来完成person表的修改操作@Modifying@Transactional@Query(value = "update person set pname=:#{#person.pname},psex=:#{#person.psex},page=:#{#person.page} " +"where pid=:#{#person.pid}",nativeQuery = true)void updatePerson(@Param("person") Person person);
}
3.2、测试
private void createSqlTest() {// personRepository.deleteByName("si");
// System.out.println(personRepository.findPerson());personRepository.updatePerson(Person.builder().pid("402882f870e8a2cd0170e8a2d6470002").pname("刘德华").psex("男").page(60).build());}
四、Spring data jpa逆向工程和多表查询
1、三种形式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oNxZg4oN-1690894364158)(005-springdata-jpa的基本使用.assets/image-20211217162055532.png)]](https://img-blog.csdnimg.cn/a33b54e4a91a4828afd10c7b896a5775.png)
VO不讲解
2、Spring data jpa逆向操作
2.1、关联数据库
idea右侧 —database—±–data source —HSQLDB

url 填写jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
然后测试
2.2、逆向生成
idea 右侧的project structure—project settigns----Modules—JPA—±-选择默认

idea 左侧的persistence —
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tQGJpKQp-1690894364158)(005-springdata-jpa的基本使用.assets/image-20211218190056822.png)]](https://img-blog.csdnimg.cn/23465508a9614074b09810ce96ea48a8.png)
选择entity包

然后选中book 逆向生成

这时候就能生成实体类了
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lU08ARRp-1690894364158)(005-springdata-jpa的基本使用.assets/image-20211218190413016.png)]](https://img-blog.csdnimg.cn/faa46accbbe74c54956aa24454d9e5c1.png)
3、多表查询
3.1、联表查询-根据书名来查该书籍的拥有者
//7、联表查询-根据书名来查该书籍的拥有者@Query(value = "select p from Person p inner join Book b on p.pid=b.pid where b.bname=:bname")Person findPersonByBname(@Param("bname") String bname);
//测试 7、联表查询-根据书名来查该书籍的拥有者System.out.println(personRepository.findPersonByBname("三国演义"));
3.2、联表查询-联表查询-根据用户id来查询person和book
3.2.1、创建接口形式
1、创建接口
创建PersonInfo是为了展示person和book需要展示的部分
public interface PersonInfo {String getPid();String getPname();String getPsex();String getPage();String getGetmerried();Integer getBid();String getBname();double getBprice();
}
2、具体查询
@Query(value = "select p.pid as pid,p.pname as pname,p.psex as psex,p.getmarried as getmarried," +"b.bid as bid,b.bname as bname,b.bprice as bprice from Person p inner join Book b on p.pid=b.pid " +"where p.pid=:pid")List<PersonInfo> findAllInfo(@Param("pid") String pid);
一定要使用别名
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vj3fFBij-1690894364159)(005-springdata-jpa的基本使用.assets/image-20211218191630339.png)]](https://img-blog.csdnimg.cn/70f1fd6c288a40da9a00ec9786074516.png)
List<PersonInfo> allInfo = personRepository.findAllInfo("402882f870e8a2cd0170e8a2d6470002");for (PersonInfo info:allInfo) {System.out.println(info.getPid()+","+info.getPname()+","+info.getPsex()+","+info.getPage()+","+info.getGetmarried()+","+info.getBid()+","+info.getBname()+","+info.getBprice());}
3.2.2、通过集合形式
//使用集合来接收数据-List<Map<>> System.out.println(personRepository.findAllInfo2("402882f870e8a2cd0170e8a2d6470002"));//通过集合来接收数据-listList<Object> allInfo1 = personRepository.findAllInfo1("402882f870e8a2cd0170e8a2d6470002");Object[] o = (Object[])allInfo1.get(0);System.out.println(Arrays.toString(o));
五、Query-DSL

相关文章:
数据库访问中间件--springdata-jpa的基本使用
二、单表SQL操作-使用关键字拼凑方法 回顾 public interface UserRepository extends JpaRepository<User,Integer> {User findByUsernameLike(String username); }GetMapping("/user/username/{username}")public Object findUserByUsername(PathVariable S…...
c++游戏制作指南(二):制作一个炫酷的启动界面(c++绘图)
🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 🍟欢迎来到静渊隐者的csdn博文,本文是c游戏制作指南的一部🍟 🍕更多文章请点击下方链接🍕 🍨 c游戏制作指南dz…...
spring.config.location 手动指定配置文件文件
–spring.config.locationD:\javaproject\bangsun\ds-admin\ds-oper-mgr\src\main\resources\application.yml...
【uniapp 使用ECharts】
Uniapp可以使用ECharts进行数据可视化,需要按照以下步骤进行操作: 1. 安装ECharts插件 可以使用npm安装echarts插件,命令如下: npm install echarts --save2. 引入ECharts插件 在需要使用ECharts的页面中引入ECharts插件&…...
数据结构--线性表2-2
目录 一、线性表例题: 二、分配动态内存: 1.动态创建一个空顺序表的算法: 2.动态顺序表的插入算法: 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1:创建链表并插入26个字母 例题2:在链表中取…...
利用openTCS实现车辆调度系统(一)系统介绍
系统介绍 openTCS简介 官方的回答: openTCS(开放式运输控制系统的缩写)是一种免费的控制系统软件,用于协调自动导引车(AGV)和移动机器人车队,例如在生产工厂中。 通常应该可以控制任何具有通信…...
销存管理系统ssm进销存仓库销售java jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 销存管理系统ssm 系统有1权限:管理员 二…...
【Axure教程】移动端二级滑动选择器
今天教大家制作移动端二级滑动选择器的原型模板,该原型已全国一二级省市选择器为案例,因为该原型用中继器做的,所以制作完成之后使用也很方便,只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…...
PHP操作solr
1,php下载solr(索尔)扩展,phpinfo需要支持solr扩展. 2,安装 Solr。Solr 要求您的系统上有 Java。java –version,Java 的版本大于 1.6 3,下载solr,并安装 D:\solr。 开启solr命令:solr start 关闭solr命令:…...
leetcode 46. Permutations(排列)
返回数组nums中数字的所有可能的排列组合。 思路: 排列组合这种一般会想到DFS。 这个排列中每个数字只能用一次, 可用如下DFS流程 stack.push(num); dfs(nums, num); stack.pop();退出条件: 当stack的size和nums数组一样时,说…...
5、二叉树
二叉树遍历 递归序 public static void f(Node head) {if (head == null) {return;}f(head.left);f(head.right); }前中后遍历_递归 public static void preOrderRecur(Node head) {if (head == null) {return;}System.out.print(head.value + " ");preOrderRecur…...
Doris比MySQL快的原因
简介 在数据存储和数据分析领域,MySQL和Doris是比较流行的数据库管理系统的代表。 在如今的大数据时代,数据量和数据分析的速度是很重要的。 在数据分析和数据处理中,Doris比MySQL快,这个问题一直是许多人关心的问题。 Doris的数…...
Prometheus + Grafana安装
Prometheus是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…...
二十三种设计模式第二十一篇--解释器模式
解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义一种语言的语法结构和解释器,使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元,并定义其解释过程。 解释器模式的…...
PHP8的数据类型转换-PHP8知识详解
什么是数据类型转换? 答:数据从一个类型转换成另外一个类型,就是数据类型转换。 在PHP8中,变量的类型就是由赋值决定的,也就是说,如果 string 赋值给 $var,然后 $var 的类型就是 string。之后…...
2023 电赛 E 题 K210 方案
第一章:K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片,具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力,适用于边缘计算设备和物联网应用。为了方便开发者,K210芯片提供了丰富的外设接口ÿ…...
Python的正则表达式re模块的compile()方法有什么作用?
re模块是Python标准库中的正则表达式模块,它提供了对正则表达式的支持。re.compile()是re模块的一个方法,用于将正则表达式编译成可复用的正则对象。 正则表达式是用来匹配和处理文本模式的强大工具。当你需要在字符串中查找、替换或者提取符合特定模式…...
SQL 语句中 left join 后用 on 还是 where,区别大了!
目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显…...
uni-app 微信小程序自定义导航栏
一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏(就是手机电量显示栏)和小程序的导航栏组成,android手机一般为48px,ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…...
电缆故障检测仪技术参数
一、电缆故障测试仪的技术参数 1.采样方法:低压脉冲法、冲击闪络法、速度测量法 2.电缆长度:50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置:交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压:35kV及以下…...
GME-Qwen2-VL-2B自动化测试:基于模型视觉理解的GUI界面测试脚本
GME-Qwen2-VL-2B自动化测试:基于模型视觉理解的GUI界面测试脚本 1. 引言 你有没有遇到过这样的场景?辛辛苦苦写了一套UI自动化测试脚本,结果软件界面稍微改个按钮颜色、挪个位置,整个测试就全挂了。维护成本高得吓人,…...
别再傻傻分不清HIL和SIL了!用NI PXI和Simulink手把手教你搭建第一个测试环境
从零开始搭建HIL/SIL测试环境:NI PXI与Simulink实战指南 刚接触在环测试的工程师常常被各种术语搞得晕头转向——HIL、SIL、MIL,它们到底有什么区别?更重要的是,接到一个控制器测试任务时,该如何从零开始搭建测试环境&…...
YOLOv5+Swin-Tiny实战:在自定义数据集上提升小目标检测精度的完整流程
YOLOv5与Swin-Tiny融合实战:工业级小目标检测优化指南 在无人机巡检、遥感监测和工业质检等场景中,小目标检测一直是计算机视觉领域的棘手挑战。传统卷积神经网络(CNN)在处理这类任务时,往往难以兼顾感受野与计算效率的平衡。本文将带您探索如…...
新手程序员必备:收藏这份Prompt指南,轻松驾驭大模型创造业务价值!
本文系统介绍了大模型Prompt的概念、撰写框架及核心原则,深入剖析了构建高质量Prompt的实操方法。从RTF、思考链到RISEN等五大框架,再到提升Prompt效果的策略,如明确指令、结构化输出、赋予模型思考时间等,帮助读者高效驾驭大模型…...
算法对齐还是实战突围?解构GEO优化中方法论与实践的权重博弈
在生成式人工智能(AIGC)重塑全球信息检索范式的当下,生成式引擎优化(Generative Engine Optimization, GEO)已从一种前沿概念演变为品牌流量增长的底层操作系统。随着大语言模型(LLM)与检索增强…...
Miri最佳实践清单:构建安全Rust代码的20条黄金法则
Miri最佳实践清单:构建安全Rust代码的20条黄金法则 【免费下载链接】miri An interpreter for Rusts mid-level intermediate representation 项目地址: https://gitcode.com/GitHub_Trending/mi/miri Miri是Rust的中级中间表示解释器,它能帮助开…...
CLIP图文匹配测试工具:5分钟本地部署,零基础验证AI识图能力
CLIP图文匹配测试工具:5分钟本地部署,零基础验证AI识图能力 1. 工具简介与核心价值 你是否遇到过这样的场景:手头有一批产品图片,需要快速判断它们与哪些文字描述最匹配?或者想验证AI模型是否能准确理解图片内容&…...
FDTD_进阶指南:2D/3D材料建模与材料库深度解析
1. FDTD仿真中的材料建模基础 第一次接触FDTD仿真时,我被材料建模这个环节卡住了整整一周。当时想模拟一个简单的硅基光子晶体,结果连介电常数设置都搞不明白。后来才发现,材料建模是FDTD仿真的基石,就像盖房子要先打好地基一样。…...
RK3568 Serdes方案调试:基于THCV244的I2C透传与MIPI CSI链路配置
1. RK3568与THCV244 Serdes方案概述 在车载摄像头和工业视觉应用中,Serdes(串行器/解串器)技术正变得越来越重要。RK3568作为一款高性能处理器,配合THCV244 Serdes芯片,能够实现远距离传感器数据的稳定传输。这套方案的…...
WinForm项目中的并发控制
引言 在编写WinForm应用程序时,处理并发问题是一个常见的挑战,尤其是在涉及数据库操作的场景中。本文将讨论如何在C#的WinForm项目中,通过SQL数据库的操作来避免并发问题,并介绍一种使用原子操作的解决方案。 问题描述 假设有一个WinForm项目,其中包含一个功能模块,需…...
