数据库访问中间件--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
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、三种形式
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 —
选择entity包
然后选中book 逆向生成
这时候就能生成实体类了
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);
一定要使用别名
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及以下…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...