数据库访问中间件--springdata-jpa的基本使用

news2024/9/22 13:43:02

二、单表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;
    @Column
    private String psex;
    @Column
    private Integer page;
    @Column
    private 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 {
    @Resource
    private PersonRepository personRepository;
     @Test
    void 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"));
    //通过集合来接收数据-list
   List<Object> allInfo1 = personRepository.findAllInfo1("402882f870e8a2cd0170e8a2d6470002");
        Object[] o = (Object[])allInfo1.get(0);
        System.out.println(Arrays.toString(o));

五、Query-DSL

在这里插入图片描述

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

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

相关文章

软考A计划-系统集成项目管理工程师-项目沟通管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

C语言进阶——文件的读写(文件使用方式、文件的顺序读写、常用函数、fprintf、fscanf)

目录 文件使用方式 文件的顺序读写 常用函数 用法示例 fprintf fscanf 文件使用方式 在fopen函数中详细的各种使用方式&#xff1a; 文件使用方式含义如果指定文件不存在“r”&#xff08;只读&#xff09;为了输入数据&#xff0c;打开一个已经存在的文本文件出错“w”…

2023牛客暑期多校训练营5-I The Yakumo Family

2023牛客暑期多校训练营5-I The Yakumo Family https://ac.nowcoder.com/acm/contest/57359/I 文章目录 2023牛客暑期多校训练营5-I The Yakumo Family题意解题思路代码 题意 解题思路 考虑将序列拆位计算。 先考虑一个简化版本&#xff0c;求&#xff1a; ∑ 1 ≤ l 1 ≤…

新闻标题文本分类任务

目录 知识回顾使用debug调试 知识回顾 预处理内容 文本主要进行清洗、分词/分字 ID替换(不希望计算机看到文字&#xff0c;而是ID)&#xff0c;通过语料表来表示&#xff0c;根据频率高低来分配ID号 文本的ID映射到文本的一个特征向量&#xff0c;进行词嵌入(Embedding)&…

【docker】Windows11系统下安装并配置阿里云镜像加速

【docker】Windows11系统下安装并配置阿里云镜像加速 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【docker】Windows11系统下安装并配置阿里云镜像加速一、查看Windows环境是否支持docker二、 启动Hyper-V三、 官网下载安装Docker应用和数据…

VIOOVI分享:什么是丰田精益生产方式?丰田精益生产方式有哪些?

作为全球知名的汽车生产企业&#xff0c;日本丰田在行业的影响力巨大。而其企业运营模式&#xff0c;也广为经营领域热议&#xff0c;其中&#xff0c;大家对丰田精益生产方式一直都是津津乐道。那么什么是丰田精益生产方式&#xff1f;以下内容为您全面解析。 丰田精益化生产模…

数据结构 | 线性数据结构——双端队列

目录 一、何谓双端队列 二、双端队列抽象数据类型 三、用Python实现双端队列 四、回文检测器 一、何谓双端队列 双端队列是与队列类似的有序集合。它有一前、一后两端&#xff0c;元素在其中保持自己的位置。与队列不同的是&#xff0c;双端队列对在哪一端添加和移除元素没…

Linux - 进程控制(进程等待)

进程等待必要性 之前讲过&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为力&…

Activiti 深入理解:Activiti 流程引擎的 25 张数据库表都存储了什么?ing

1. Activiti 数据库表名说明&#xff08;分类与说明&#xff09; https://www.activiti.org/userguide/#database.tables.explained \qquad Activiti 的数据库表名称都以 ACT_ 开头&#xff0c;而第二部分是表 use case 的双字符标识&#xff0c;use case 也大致与 Activiti 服…

Vue3中使用事件总线Bus的两种方式(mitt)

首先咱们得先下载mitt指令如下&#xff1a; npm i mitt --save 接下来介绍Vue3中通过mitt使用事件总线的两种方式 方式一&#xff1a; 该方式为全局挂载mitt,个人感觉有点繁琐&#xff0c;不太推荐 创建&#xff1a; 1.首先找到你的main.js或main.ts文件 2.引入mitt 3.…

MIT 6.S081 Lab Nine --- file system

MIT 6.S081 Lab Nine --- file system 引言File systemLarge files(moderate)预备看什么你的工作代码解析 Symbolic links(moderate)硬链接代码解析 可选的挑战练习 引言 本文为 MIT 6.S081 2020 操作系统 实验九解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系…

pc文件上传

1.代码&#xff1a; <template><div><el-upload:multiple"true":auto-upload"true":headers"headers":action"uploadFileUrl":before-upload"handleBeforeUpload":on-error"handleUploadError":o…

MB21 手工创建261生产订单的预留

1、前面博文中有说到新增了工单超领的移动类型Z61,我们在创建新的移动类型的时候参考的是261的移动类型。本质上Z61的配置和261也是一样的。 2、我们在MB21创建预留的时候就会遇到问题 这里系统给出了提示:不能手工创建该类型的预留。 3、SE38对程序进行修改,根据报错的信…

BES IIR EQ音效设计原理

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) BES EQ音效集成流程 1 BES 音效调试工具 audiotool_v3.5 2 EQ音效参数生成 电声学工程师根据听音效果,生成参数,一般通过截图给的软件这边。 EQ参数四元组:{ IIR滤波器类型,Gain增益,f中心频率,Q品质因数 }

0801|IO进程线程day4【stat获取文件属性】

目录 1 获取文件属性 1&#xff09;stat 2&#xff09;提取文件的权限 3&#xff09;提取文件的类型 4&#xff09;提取文件所属用户名【getpwuid函数】 5&#xff09;提取文件所属组用户名【getgrgid函数】 6&#xff09;完整代码&#xff1a; 1 获取文件属性 1&#x…

error: #5: cannot open source input file “core_cmInstr.h“

GD32F103VET6和STM32F103VET6引脚兼容。 GD32F103VET6工程模板需要包含头文件&#xff1a;core_cmInstr.h和core_cmFunc.h&#xff0c;这个和STM32F103还是有区别的&#xff0c;否则会报错&#xff0c;如下&#xff1a; error: #5: cannot open source input file "core…

AI 3D结构光技术加持,小米引领智能门锁新标准

一直以来&#xff0c;小米智能门锁系列产品让更多家庭走进了安全便捷的智能生活&#xff0c;安全至上的设计让很多家庭都轻松告别了随身钥匙。 7月27日&#xff0c;小米正式推出小米智能门锁M20 Pro&#xff0c;再一次引领智能门锁产品的发展潮流。该款门锁采用AI 3D结构光技术…

算法竞赛入门【码蹄集新手村600题】(MT1080-1100)

算法竞赛入门【码蹄集新手村600题】(MT1080-1100&#xff09; 目录MT1081 xy的和MT1082 x-y的和MT1083 向下取整MT1084 k次方根MT1085 分期付款MT1086 公里转换为米MT1087 温度转换MT1088 温度对照MT1089 整理玩具MT1090 卡罗尔序列MT1091 合并||MT1092 非常大的NMT1093 序列MT…

C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。 举例&#xff1a;5&#xff08;0101&#xff09;2&#xff08;0010&#xff09;进行异或等于&#xff1a;7&#xf…

Jmeter —— jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…