Spring 全家桶之 Spring Data JPA(二)(下)

简介: Spring 全家桶之 Spring Data JPA(二)

delete()删除操作

@Test
public void testDelete(){
    customerDao.delete(3l);
}

findAll()查询所有操作

@Test
public void testFindAll(){
    List<Customer> customerList = customerDao.findAll();
    for (Customer customer : customerList) {
        System.out.println(customer);
    }
}

image.png

执行过程

image.png

I:实例化的customerDao是一个动态代理对象SimpleJpaRepository

image.png

II:SimpleJpaRepository调用findOne()方法,findOne()会通过实体类管理器em调用find()方法完成查询

image.png

Spring Data JPA 完成复杂查询

统计查询count()

@Test
public void testCount(){
    long count = customerDao.count();
    System.out.println(count);
}

是否存在exists()

@Test
public void testExists(){
    boolean isExists = customerDao.exists(1l);
    System.out.println(isExists);
}

根据ID查询getOne()

@Test
@Transactional
public void testGetOne(){
    Customer one = customerDao.getOne(1l);
    System.out.println(one);
}

底层调用的是EntityManager的getReference(),延迟加载,find()是立即加载

JPA中的查询方法:

image.png

使用JPQL完成复杂查询

JPQL:JPA Query Language

特点:语法或关键字与sql语句类似,查询的是类和类中的属性

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

  • 特有的查询,需要在dao接口上配置方法
  • 在新添加的方法上使用注解的形式配置JPQL语句
  • 注解为@Query

在CustomerDao接口中新增方法,根据客户名称查询客户,使用JPQL语句

@Query(value = "from Customer where custName= ?")
Customer findByCustName(String custName);

在CustomerDao中测试该方法

@Test
public void testFindByCustName(){
    Customer thor = customerDao.findByCustName("Thor");
    System.out.println(thor);
}

输出结果

image.png

多条件(多占位符)查询

在CustomerDao接口中新增方法

// 根据客户名称和id查询客户
@Query(value = "from Customer where custName = ? and custId=?")
Customer findByCustNameAndCustId(String custName, Long custId);

在CustomerDaoTest中测试该方法

@Test
public void testFindByCustNameAndCustId(){
    Customer thor = customerDao.findByCustNameAndCustId("Thor",3L);
    System.out.println(thor);
}

image.png

通过custId更新custName

CustomerDao接口中新增方法updateCustNameByCustId

// 要指定参数位置
// 声明为更新操作
@Query(value = "update Customer set custName = ?2 where custId = ?1")
@Modifying
@Transactional
void updateCustNameByCustId(Long custId, String custName);

在CustomerDaoTest中测试该方法

@Test
public void testUpdateCustName(){
    customerDao.updateCustNameByCustId(3L,"Thor Odin");
}

使用SQL语句完成复杂查询

  • 特有的查询,需要在dao接口上配置方法
  • 在新添加的方法上,使用注解的形式配置SQL查询语句
  • 注解为@Query(value=,nativeQuery=),value表示jpql语句或者sql语句,nativeQuery为boolean,false表示使用jpql查询,true表示sql查询

SQL语句查询全部

定义方法selectAll()

@Query(value = "SELECT * FROM customer", nativeQuery = true)
List<Customer> selectAll();

测试该方法

@Test
public void testSelectAll(){
    List<Customer> customers = customerDao.selectAll();
    for (Customer customer : customers) {
        System.out.println(customer);
    }
}

输出结果

image.png

SQL语句模糊查询

定义方法selectByCustNameLike

@Query(value = "SELECT * FROM customer where cust_name like ?1", nativeQuery = true)
List<Customer> selectByCustNameLike(String like);

测试该方法

@Test
public void testSelectByCustNameLike(){
    List<Customer> customers = customerDao.selectByCustNameLike("Thor%");
    for (Customer customer : customers) {
        System.out.println(customer);
    }
}

输出结果

image.png

方法名称规则查询

  是对jpql查询更加深入的一层封装,只需要按照Spring Data JPA提供的方法名规则定义方法,不需要在配置jpql语句即可完成查询

命名规则:查询使用findBy,对象中的属性为查询的条件,如想要通过custName查询Customer,方法名命名为findByCustName,入参为custName,翻译成sql语句就是select * from customer where cust_name = ?,默认使用=,如果是模糊查询需要Like关键字

findByCustName

Customer findByCustName(String custName);
@Test
public void testFindByCustName(){
    Customer thor = customerDao.findByCustName("Thor Odin");
    System.out.println(thor);
}

输出结果

image.png

findByCustNameLike 模糊查询

List<Customer> findByCustNameLike(String custName);
@Test
public void testFindByCustNameLike(){
    List<Customer> customers = customerDao.findByCustNameLike("Thor%");
    for (Customer customer : customers) {
        System.out.println(customer);
    }
}

输出结果

image.png

findByCustNameAndCustId 多条件查询使用And关键字,查询的属性的顺序要与入参顺序一致

Customer findByCustNameLikeAndCustIndustry(String custName, String custIndustry);
@Test
public void testFindByCustNameLikeAndCustIndustry(){
    Customer stark_industry = customerDao.findByCustNameLikeAndCustIndustry("Iron%", "Military Industry");
    System.out.println(stark_industry);
}

image.png


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