开发人员必须要掌握的《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);
    }

相关文章
|
21天前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
32 3
|
2月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
42 9
|
2月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
51 0
Springboot引入jpa来管理数据库
|
2月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
62 0
|
3月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
4月前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
66 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
4月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
48 0
|
4月前
|
存储 Java 数据库
|
4月前
|
存储 Java API
|
4月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
101 0
下一篇
DataWorks