返回顶部
首页 > 资讯 > 后端开发 > JAVA >数据库访问中间件--springdata-jpa的基本使用
  • 639
分享到

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

数据库中间件 2023-09-08 08:09:57 639人浏览 独家记忆
摘要

二、单表sql操作-使用关键字拼凑方法 回顾 public interface UserRepository extends JpaRepository { User findByUsernam

二、单表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=truespring.datasource.username=rootspring.datasource.passWord=rootspring.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、测试

@SpringBootTestclass 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、创建接口形式

创建接口

创建PersonInfo是为了展示person和book需要展示的部分

public interface PersonInfo {    String getPid();    String getPname();    String getPsex();    String getPage();    String getGetmerried();    Integer getBid();    String getBname();    double getBprice();}

具体查询

    @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>     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

在这里插入图片描述

来源地址:https://blog.csdn.net/weixin_39213232/article/details/132050645

--结束END--

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

本文链接: https://lsjlt.com/news/399609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 数据库访问中间件--springdata-jpa的基本使用
    二、单表SQL操作-使用关键字拼凑方法 回顾 public interface UserRepository extends JpaRepository { User findByUsernam...
    99+
    2023-09-08
    数据库 中间件
  • Spring boot基于JPA访问MySQL数据库的实现
    本文展示如何通过JPA访问MySQL数据库。 JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Jav...
    99+
    2024-04-02
  • SpringBoot使用JdbcTemplate访问操作数据库基本用法
    目录一、建一个rumenz_springboot库二、加入pom的依赖三、SpringBoot配置文件四、创建User实体类五、Service接口六、Service接口实现类七、Co...
    99+
    2024-04-02
  • 数据库基本使用
    1.登录和退出mysql服务器:mysql -h主机名 -u用户名 -p密码 -e"sql 命令" 例1:mysql -uroot -p123456 ...
    99+
    2024-04-02
  • 如何使用本机访问阿里云数据库
    阿里云数据库是一个强大、可靠的云数据库服务,它能够帮助企业和个人轻松地管理和使用数据。然而,有些用户可能想要使用本机访问阿里云数据库,以便更好地控制和管理他们的数据。本篇文章将详细介绍如何使用本机访问阿里云数据库。 如何使用本机访问阿里云数...
    99+
    2023-12-09
    阿里 本机 如何使用
  • 使用 SpringBoot 访问 MySQL 数据库
    一、目标 创建一个 MySQL 数据库,构建一个 Spring 应用程序,并将其连接到新创建的数据库。 二、准备工作 最喜欢的文本编辑器或 IDE Java 17或更高版本 Gradle 7.5+或Maven 3.5+ 三、初始化项目 导...
    99+
    2023-08-17
    数据库 mysql spring boot
  • ADO.NET中如何使用连接模式访问数据库中的数据
    本篇内容介绍了“ADO.NET中如何使用连接模式访问数据库中的数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ADO.NET框架支持两种模...
    99+
    2023-06-17
  • NoSQL数据库一MongoDB基本使用
    如今的网站对数据存储要求越来越灵活,在这种需求下 NoSQL 也就是非关系数据库越来越流行。所谓非关系数据库,是指不使用 SQL 语言进行数据操作的数据库的统称。这类数据库存储数据时没有固定的模式,不支持数...
    99+
    2024-04-02
  • 云服务器怎么访问本地数据库文件
    安装云服务器 首先,您需要在本地安装云服务器。您可以通过控制面板或者云服务器的官方网站来下载云服务器的安装程序。安装程序需要提供必要的软件和驱动程序,并将其连接到计算机的网络接口上。 配置云服务器 接下来,您需要配置云服务器。在控...
    99+
    2023-10-28
    数据库文件 服务器
  • Navicat (连接mysql数据库)的基本使用
    目录 前言 一、navicat-15的下载安装 二、navicat连接数据库 1、登录 2、连接数据库失败情况 3、登录数据库需要授权 三、navicat的基础操作  ☆ 1、数据库的基本操作 2、对表进行操作 3、sql 语句管理数据库 ...
    99+
    2023-09-02
    mysql 数据库
  • 云服务器怎么访问本地数据库文件夹
    首先,在使用云服务器之前,用户需要确保其数据存储和访问的安全性。云服务器使用数据加密和权限控制技术来保护用户数据的安全。用户需要设置自己的账户密码,并且需要对云服务器进行安全配置和管理,以确保云服务器能够正常地运行和管理。 其次,用户可以...
    99+
    2023-10-27
    文件夹 服务器 数据库
  • Oracle数据库访问工具 SQL Plus使用
    场景            Oracle自带数据库查询工具查看数据库有哪些表select * from tab; 查询表结构desc pas_alarm_info;格式化date类型的字段,字符串...
    99+
    2024-04-02
  • C++使用MySQL Connector/C++访问mysql数据库
    去官网下载,分为release模式和debug模式两种,分别对应VS中的release和debug。如下图所示: 注意: 如果使用debug模式,下载的上面的release模式库文件,那么编译就会出...
    99+
    2023-09-05
    数据库 mysql c++
  • 数据库访问控制:安全之路的基石
    ...
    99+
    2024-04-02
  • docker中使用mysql数据库实现局域网访问
    获取mysql镜像 docker pull mysql:5.6 注意:此处之所以获取mysql5.6是因为mysql5.7在centos7中启动可能会报错 查看镜像列表 docker images 启动m...
    99+
    2022-05-23
    docker MySQL
  • 数据库中间件OneProxy简明使用手册
    一、数据库中间件OneProxy简明使用手册 http://mp.weixin.qq.com/s__biz=MzA3MzYwNjQ3NA==&mid=2651296386&idx=...
    99+
    2024-04-02
  • go语言数据库中间件怎么使用
    Go语言数据库中间件的使用方法有以下几个步骤:1. 引入数据库驱动包:根据所选中间件的类型,引入对应的数据库驱动包。例如,如果选择使...
    99+
    2023-10-20
    go语言 数据库
  • 数据库管理工具heidiSQL的基本使用
    安装完成以后;连接进入;看一下有4个默认的mysql数据库;除了test,其他三个是mysql的系统数据库,不要操作; test数据库目前是空的;新建一个表,在数据库节点右击,创建新的->表; 在出现的界面,先输入表名,也可以输入注...
    99+
    2023-10-09
    数据库 sqlserver mysql heidisql
  • 数据库中,限制用户只能访问一个数据库
    USE master; GO --Step 1: (create a new user) create LOGIN hello WITH PASSWORD="foo", CHECK_POLICY = OFF; -- Step 2:(de...
    99+
    2022-01-14
    数据库中,限制用户只能访问一个数据库
  • 如何使用mysql数据库基本命令添加数据库
    如何使用mysql数据库基本命令添加数据库,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。添加数据库[root@localhost ~...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作