当前位置: 首页 > news >正文

数据库访问中间件--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 片段
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age ⇐ ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection age)… where x.age not in ?1
TRUEfindByActiveTrue()… where x.active = true
FALSEfindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… 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、注意事项

  1. 实体类属性名不要出现isXxx、 getXxx的名称,会导致关键字拼凑出错
  2. 实体类属性名中间只要出现了大写字母,就会导致数据库的字段名有下划线隔开,比如你使
    用isMarried属性名,那么实体类的字段名就会变成is_ married, 这样容易导致找不到值
  3. 属性名类型是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)]

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)]

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)]

选择entity包

然后选中book 逆向生成

这时候就能生成实体类了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lU08ARRp-1690894364158)(005-springdata-jpa的基本使用.assets/image-20211218190413016.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)]

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++绘图)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…...

spring.config.location 手动指定配置文件文件

–spring.config.locationD:\javaproject\bangsun\ds-admin\ds-oper-mgr\src\main\resources\application.yml...

【uniapp 使用ECharts】

Uniapp可以使用ECharts进行数据可视化&#xff0c;需要按照以下步骤进行操作&#xff1a; 1. 安装ECharts插件 可以使用npm安装echarts插件&#xff0c;命令如下&#xff1a; npm install echarts --save2. 引入ECharts插件 在需要使用ECharts的页面中引入ECharts插件&…...

数据结构--线性表2-2

目录 一、线性表例题&#xff1a; 二、分配动态内存&#xff1a; 1.动态创建一个空顺序表的算法&#xff1a; 2.动态顺序表的插入算法&#xff1a; 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1&#xff1a;创建链表并插入26个字母 例题2&#xff1a;在链表中取…...

利用openTCS实现车辆调度系统(一)系统介绍

系统介绍 openTCS简介 官方的回答&#xff1a; openTCS&#xff08;开放式运输控制系统的缩写&#xff09;是一种免费的控制系统软件&#xff0c;用于协调自动导引车&#xff08;AGV&#xff09;和移动机器人车队&#xff0c;例如在生产工厂中。 通常应该可以控制任何具有通信…...

销存管理系统ssm进销存仓库销售java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 销存管理系统ssm 系统有1权限&#xff1a;管理员 二…...

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板&#xff0c;该原型已全国一二级省市选择器为案例&#xff0c;因为该原型用中继器做的&#xff0c;所以制作完成之后使用也很方便&#xff0c;只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…...

PHP操作solr

1&#xff0c;php下载solr(索尔)扩展&#xff0c;phpinfo需要支持solr扩展. 2&#xff0c;安装 Solr。Solr 要求您的系统上有 Java。java –version&#xff0c;Java 的版本大于 1.6 3&#xff0c;下载solr,并安装 D:\solr。 开启solr命令&#xff1a;solr start 关闭solr命令:…...

leetcode 46. Permutations(排列)

返回数组nums中数字的所有可能的排列组合。 思路&#xff1a; 排列组合这种一般会想到DFS。 这个排列中每个数字只能用一次&#xff0c; 可用如下DFS流程 stack.push(num); dfs(nums, num); stack.pop();退出条件&#xff1a; 当stack的size和nums数组一样时&#xff0c;说…...

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快的原因

简介 在数据存储和数据分析领域&#xff0c;MySQL和Doris是比较流行的数据库管理系统的代表。 在如今的大数据时代&#xff0c;数据量和数据分析的速度是很重要的。 在数据分析和数据处理中&#xff0c;Doris比MySQL快&#xff0c;这个问题一直是许多人关心的问题。 Doris的数…...

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…...

二十三种设计模式第二十一篇--解释器模式

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义一种语言的语法结构和解释器&#xff0c;使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元&#xff0c;并定义其解释过程。 解释器模式的…...

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换&#xff1f; 答&#xff1a;数据从一个类型转换成另外一个类型&#xff0c;就是数据类型转换。 在PHP8中&#xff0c;变量的类型就是由赋值决定的&#xff0c;也就是说&#xff0c;如果 string 赋值给 $var&#xff0c;然后 $var 的类型就是 string。之后…...

2023 电赛 E 题 K210 方案

第一章&#xff1a;K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片&#xff0c;具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力&#xff0c;适用于边缘计算设备和物联网应用。为了方便开发者&#xff0c;K210芯片提供了丰富的外设接口&#xff…...

Python的正则表达式re模块的compile()方法有什么作用?

re模块是Python标准库中的正则表达式模块&#xff0c;它提供了对正则表达式的支持。re.compile()是re模块的一个方法&#xff0c;用于将正则表达式编译成可复用的正则对象。 正则表达式是用来匹配和处理文本模式的强大工具。当你需要在字符串中查找、替换或者提取符合特定模式…...

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…...

uni-app 微信小程序自定义导航栏

一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏&#xff08;就是手机电量显示栏&#xff09;和小程序的导航栏组成&#xff0c;android手机一般为48px&#xff0c;ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…...

电缆故障检测仪技术参数

一、电缆故障测试仪的技术参数 1.采样方法&#xff1a;低压脉冲法、冲击闪络法、速度测量法 2.电缆长度&#xff1a;50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置&#xff1a;交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压&#xff1a;35kV及以下…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...