开发人员必须要掌握的《Spring Data JPA四种查询方式》(2)

简介: 开发人员必须要掌握的《Spring Data JPA四种查询方式》(2)

三、四种查询方式:

1.基本的增删改查  

继承JpaRepository,JpaSpecificationExecutor 接口,使用JPA封装好的方法。


JpaRepository封装好的方法

image.png


JpaSpecificationExecutor封装好的方法

image.png


测试类

/**
     * findOne(id) :根据id查询
     *
     * save(customer):保存或更新  实体的id属性
     *
     * delete(id)  :根据id删除
     *
     * findAll()   :查询全部
     *
     * count()   :计数
     *
     * exists()  :判断是否存在
     *
     */   
@Test
    public void testFindOne(){
        System.out.println("dfa");
        Customer one = dao.findOne(1L);
        System.out.println(one);
    }
    @Test
    public void testSave(){
        System.out.println("dfa");
        Customer c=new Customer();
        c.setCustAddress("廊坊");
        c.setCustName("小小张");
        c.setCustPhone("9999");
        c.setCustLevel("vipp");
        Customer save = dao.save(c);
        System.out.println(save);
    }
    @Test
    @Transactional
    public void testUpdate(){
        System.out.println("dfa");
        Customer c=new Customer();
        c.setCustAddress("廊坊");
        c.setCustName("小小张");
        c.setCustPhone("2800");
        Customer save = dao.save(c);
        System.out.println(save);
    }
    @Test
    public void testDelete(){
        dao.delete(2L);
        System.out.println();
    }
    @Test
    @Transactional
    public void testFindAll(){
        List<Customer> all = dao.findAll();
        for (Customer customer : all) {
            System.out.println(customer);
        }
        System.out.println();
    }
    @Test
    @Transactional
    public void testCount(){
        long count = dao.count();
        System.out.println(count);
    }
    @Test
    public void testExists(){
        boolean exists = dao.exists(2L);
        System.out.println(exists);
    }
    @Test
    @Transactional
    public void testGetOne(){
        // getOone方法是懒加载
        Customer one = dao.getOne(2L);
        System.out.println(one);
    }

2.JPQL查询  

jpa query language  (jpq查询语言),与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,查询的是类和类中的属性


上一篇博客介绍了JPQL:


JPA入门案例完成增删改查_小小张自由—>张有博-CSDN博客

JPA (Java Persistence API) Java持久化API。是一套Java官方制定的ORM方案。JPA是一种规范,一种标准,具体的操作交给第三方框架去实现,比如说Hibernate,OpenJPA等。本文介绍了ORM思想,JPA规范与实现,如何去搭建JPA的基础环境,JPA的操作步骤以及使用Java代码用JPA做基本数据的增删改查。

https://blog.csdn.net/promsing/article/details/120794681


需要将JPQL语句配置到接口方法上


1.特有的查询:需要在dao接口上配置方法


2.在新添加的方法上,使用注解的形式配置jpql查询语句


3.注解 : @Query


DAO接口:

/**
 * @Author: Promsing(张有博)
 * @Date: 2021/10/17 - 17:36
 * @Description: 需要符合springDataJPA的dao层接口规范
 *          JpaRepository<操作的实体类型,实体类中主键属性的类型>
 *              *封装了基本的CRUD操作
 *          JpaSpecificationExecutor<操作的实体类型>
 *              *封装了复杂查询(分页)
 * @version: 1.0
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
    /**
     * @Query:表示查询
     *
     * @Modifying 表示更新的操作
     */
    @Query(value = "from Customer where custName = ? ")
    public List<Customer> findJpql(String custName);
    /**
     * 对于多个占位符参数
     *    赋值的时候,默认情况下,占位符的位置需要和方法参数中的位置保持一致
     *
     *  可以指定占位符参数的位置
     *      ? 索引的方式,指定此占位符的取值来源
     */
    @Query(value = "from Customer where custName = ? and id = ?")
   // @Query(value = "from Customer where custName = ?2 and id = ?1")
    public Object findCustNameAndId(String name,Long id);
    @Query(value = "update Customer set custName = ? where id = ? ")
    @Modifying //表示是,更新的操作
    public Integer updateName(String name,Long id);
}

测试类:

@Test
    public void testJpql(){
        List<Customer> list = dao.findJpql("小小张");
        System.out.println(list);
    }
    @Test
    public void testFindCustNameAndId(){
        Object one = dao.findCustNameAndId("小小张",1L);
        System.out.println(one);
    }
    @Test
    @Transactional //添加事务的支持
    @Rollback(value = false)
    /**
     * springDataJpa中使用jpql完成更新/删除操作
     *              需要手动添加事务的支持
     *              默认会执行结束之后,回滚事务
     * @Rollback: 设置是否自动回滚
     *             false(不)  | true
     */
    public void testUpdateName(){
        Object one = dao.updateName("张自由",3L);
        System.out.println(one);
    }

3.SQL查询

1.特有的查询:需要在dao接口上配置方法


 2.在新添加的方法上,使用注解的形式配置sql查询语句


 3.注解 : @Query


  value :jpql语句 | sql语句


  nativeQuery :false(使用jpql查询) | true(使用本地查询:sql查询)


DAO接口

package com.dynamic.dao;
import com.dynamic.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
 * @Author: Promsing(张有博)
 * @Date: 2021/10/17 - 17:36
 * @Description: 需要符合springDataJPA的dao层接口规范
 *          JpaRepository<操作的实体类型,实体类中主键属性的类型>
 *              *封装了基本的CRUD操作
 *          JpaSpecificationExecutor<操作的实体类型>
 *              *封装了复杂查询(分页)
 * @version: 1.0
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
    /**
     * 使用sql的形式查询  查询全部用户
     *    SQL:select * from cst_customer
     * @Query: 配置sql查询
     *    value:sqly语句
     *    nativeQuery:查询方式
     *        true:sql查询
     *        false:jpql查询
     * @return
     */
    @Query(value = "select * from cst_customer", nativeQuery = true)
    public List<Customer> findSql();
    @Query(value = "select * from cst_customer where  cust_name like ?", nativeQuery = true)
    public List<Customer> findLikeSql(String name   );
}

测试类:

@Test
    public void testSQL(){
        List<Customer> list = dao.findSql();
        List<Customer> sql = dao.findLikeSql("小%");
        for (Customer customer : sql) {
            System.out.println(customer);
        }
    }

4.方法命名查询

是对jpql查询,更加深入一层的封装


 我们只需要按照SpringDataJpa提供的方法名称规则定义方法,不需要再配置jpql语句,完成查询


按照Spring Data JPA 定义的规则,查询方法以findBy开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。


部分对照表

image.png


DAO接口:

package com.dynamic.dao;
import com.dynamic.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
 * @Author: Promsing(张有博)
 * @Date: 2021/10/17 - 17:36
 * @Description: 需要符合springDataJPA的dao层接口规范
 *          JpaRepository<操作的实体类型,实体类中主键属性的类型>
 *              *封装了基本的CRUD操作
 *          JpaSpecificationExecutor<操作的实体类型>
 *              *封装了复杂查询(分页)
 * @version: 1.0
 */
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {
    /**
     * 方法名的约定
     *
     *        findBy:查询
     *        对象中的属性名(首字母大写),查询条件
     *
     *        findByCustName  根据客户名称查询
     *
     *          会根据方法名称进行解析 findBy  from XXX where custName
     * @param name
     * @return
     */
    //1.findBy +属性名称(根据属性名称进行完成匹配的查询=)
    public Customer findByCustName(String name   );
    //2.findBy +属性名称 +“查询方式”(Like | isNull)
    public List<Customer> findByCustNameLike(String name   );
    //3.findBy +属性名称 +“查询方式” +“多条件的连接符(and|or)” +属性名 +“查询方式”
    public Customer findByCustNameLikeAndCustIndustry(String name,String industry);
}

测试类:

@Test
    public void testFindNaming(){
        Customer custName = dao.findByCustName("张自由");
         System.out.println(custName);
        System.out.println("______________");
        List<Customer> byCustNameLike = dao.findByCustNameLike("小%");
        for (Customer customer : byCustNameLike) {
            System.out.println(customer);
        }
        System.out.println("______________");
        Customer it = dao.findByCustNameLikeAndCustIndustry("小%", "IT教育");
        System.out.println(it);
    }

相关文章
|
7月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
7月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
650 1
存储 JSON Java
876 0
|
8月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
775 0
|
10月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
760 2
|
11月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
471 15
|
11月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
622 1
|
12月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
359 32
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
1299 4
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
746 0