首页 > 数据库 >JPA + MySQL 开发总结

JPA + MySQL 开发总结

时间:2023-07-15 13:55:35浏览次数:37  
标签:总结 name JPA org springframework 查询 MySQL import

本文为博主原创,转载请注明出处:

  org.springframework.data.jpa 是 Spring Data JPA 框架中的一个包,用于简化与 JPA(Java Persistence API)相关的开发任务。Spring Data JPA 提供了一套强大且易于使用的功能,使得与数据库进行持久化操作更加便捷和高效。

1.引入JPA,进行常规开发步骤

  使用 org.springframework.data.jpa 的一般步骤:

1.1引入依赖: 

  在项目的构建文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中添加 Spring Data JPA 的依赖项。例如,在 Maven 中添加以下依赖项:

<dependencies>
  <!-- 其他依赖 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
</dependencies>

1.2 创建实体类:

  使用 JPA 注解来定义实体类,并将其映射到数据库表。注解包括 @Entity@Table@Column 等。

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "name")
  private String name;

  // getter and setter methods
}

1.3创建 Repository 接口:

  创建一个继承自 JpaRepository(或其他 Spring Data JPA 提供的 Repository 接口)的接口,用于访问和操作实体类对应的数据。

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 可根据需要添加自定义查询方法
}

1.4配置数据源:

  在 Spring Boot 的配置文件中,配置数据库连接信息、JPA 相关的属性,例如数据库 URL、用户名、密码等。

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=secret

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

1.5使用 Repository 进行操作:

  在需要使用 JPA 操作数据库的地方,通过注入 Repository 接口对象来调用相应的方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

  private final UserRepository userRepository;

  @Autowired
  public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  public User saveUser(User user) {
    return userRepository.save(user);
  }

  public User getUserById(Long id) {
    return userRepository.findById(id).orElse(null);
  }

  // 其他操作方法
}

  上述示例是一个简单的使用 org.springframework.data.jpa 的流程。它包括创建实体类、定义 Repository 接口、配置数据源和使用 Repository 进行操作。根据具体需求,可以扩展和定制这些步骤以满足应用程序的要求。

2.UserRepository 中定义使用得方法

  在 UserRepository 中定义使用的方法非常简单。Spring Data JPA 提供了一套命名规则,它根据方法名自动解析和生成查询语句。可以按照规则给方法命名,而不需要编写具体的查询语句。

  以下是一些常见的方法命名规则及其解析方式:

  • 根据属性查询:

    • findBy<PropertyName>:根据属性名称进行查询,例如 findByName(String name)
    • findBy<PropertyName>And<OtherProperty>:根据多个属性进行查询,并通过 "And" 连接,例如 findByNameAndAge(String name, int age)
  • 按条件查询:

    • findBy<PropertyName>Equals:根据属性的精确匹配进行查询,例如 findByNameEquals(String name)
    • findBy<PropertyName>IsNotNull:根据属性不为 null 的条件进行查询,例如 findByEmailIsNotNull()
  • 排序和分页:

    • findAllByOrderBy<PropertyName>:根据属性进行升序排序查询,例如 findAllByOrderByAge()
    • findAll(Pageable pageable):返回分页结果,可以使用 PageRequest.of(...) 创建 Pageable 对象。

  这只是一小部分可用的方法命名规则示例,您可以根据具体需求查阅 Spring Data JPA 文档以获得更全面的了解。

  注意事项:

  • 方法名称必须遵循命名规则,否则可能会导致查询失败。
  • 方法参数的数量和类型必须与属性的类型和数量匹配。
  • 在使用一些特殊操作时,如模糊查询、区间查询等,可以使用 LikeBetween 等关键字来指定更复杂的条件。

  示例:

import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
    List<User> findByAgeGreaterThan(int age);
    List<User> findByEmailIsNotNull();
}

  在上述示例中,UserRepository 定义了三个查询方法:根据名称查询用户、根据年龄大于给定值查询用户以及查询邮箱不为 null 的用户。这些方法会根据方法名自动解析为相应的查询条件,并返回符合条件的用户列表。

3.JPA 使用自定义sql

  在实际使用过程中,可能需要处理一些特定的查询场景或复杂的条件,可能需要编写自定义的查询语句。Spring Data JPA 提供了注解和其他方式来支持自定义查询,以满足更复杂的需求。

  在 Spring Data JPA 中,可以使用自定义的查询语句来满足特定的查询需求。以下是两种常用的方式来实现自定义查询:

3.1使用 @Query 注解

  使用方法:

    • 在需要进行自定义查询的方法上添加 @Query 注解,并提供相应的查询语句。
    • 在查询语句中使用命名参数(例如 :paramName)来引用方法参数。
    • 如果有多个参数,可以通过索引位置(例如 ?1?2)引用它们。

  示例:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.name = :name")
    List<User> findByName(String name);

    @Query("SELECT u FROM User u WHERE u.age > :age AND u.email IS NOT NULL")
    List<User> findByAgeGreaterThanAndEmailIsNotNull(int age);
}

  在上述示例中,使用了 @Query 注解来自定义查询语句。通过 :name:age 引用了方法参数,并根据属性条件进行查询。

3.2使用方法名称解析和关键字:

  使用方法

    • 在方法名称中使用关键字(如 AndOrBetween 等)来指定更复杂的条件。
    • 当方法名称无法表达所需的查询时,可以使用 @Query 注解来补充自定义查询。

  示例:

import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByAgeBetween(int minAge, int maxAge);

    @Query("SELECT u FROM User u WHERE u.name LIKE %:keyword%")
    List<User> searchByKeyword(String keyword);
}

  在上述示例中,使用了方法名称解析和关键字。findByAgeBetween 方法按照年龄范围进行查询,而 searchByKeyword 方法使用了 LIKE 来进行模糊查询。

  无论选择哪种方式,都可以根据需要编写复杂的查询语句,并通过方法名或注解来引用相关参数。这样就可以使用自定义的查询语句来执行更灵活和复杂的数据库操作。

 

标签:总结,name,JPA,org,springframework,查询,MySQL,import
From: https://www.cnblogs.com/zjdxr-up/p/17556040.html

相关文章

  • 2023年第29周个人总结
    文档编辑机器+移动窗口变化率计算投标文档书写本周在公司主要对投标文档的修改:首先表格的脚注很重要,当多个表格在一起时,表格的脚注可以起到非常关键的作用,能够让读者快速弄懂该表格的含义。然后关于文档的错别字,自己写的文档自己是真的不可能能够读懂,所以可以采用通读一遍......
  • 暑假第一周总结
    本周我主要学习了Linux的安装和Shell语言的基础知识,并且遇到了一些困难。首先,我成功安装了Linux操作系统,并对其进行了初步的配置。通过这个过程,我对Linux的安装和基本操作有了更深入的了解,并学会了使用命令行进行各种操作。在学习Shell语言方面,我主要学习了Shell脚本的编写和执行......
  • 暑期第四周总结
    本周花在学习上的时间大概为21小时,花在代码上的时间大概为11小时。花在解决问题上的时间大概为4小时。本周,我完成了创建虚拟机,在虚拟机上完成了部署伪分布式的hdfs,在虚拟机上配置了java的环境变量,还有hadoop的环境变量,我完成了nosql数据库的学习,知道了nosql数据库和传统的关系型数......
  • 第一周总结
    周总结:自学Hadoop大数据技术本周我制定了一个目标,即通过自学来掌握Hadoop大数据技术。我认识到大数据技术对于现代企业和数据分析领域的重要性,因此决定投入时间和精力来深入了解和学习这一领域。在开始学习之前,我进行了一些基础准备工作,包括对分布式系统和数据存储的基本概念的了......
  • mysql修改所有表的编码排序规则
    #查询数据库各表的排序规则SELECTTABLE_NAME,TABLE_COLLATIONFROMINFORMATION_SCHEMA.TABLESWHERETABLE_SCHEMA='database'; #查询要修改排序规则表的SQL语句SELECTconcat('ALTERTABLE',TABLE_NAME,'CONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_unicod......
  • mysql使用记录
    mysql一些实际使用记录查看数据库showdatabases;选择某个数据库usexxxxx;创建数据库createdatabasetestdb;选择某个数据库后,查看该数据库下有那些表showtables;查看当前正在使用的数据库selectdatabase();表数据库当中最基本的单元是表:table;表中每一个字......
  • 07.10~07.21 总结
    07.10T1一开始理解错题意,后来看样例才发现。觉得暴力是能过的,推了下两个圆的交点坐标,然后转换成了一个求最多覆盖的问题。先想了下权值线段树,发现做不到。然后想到扫描线的思想,就考虑把点排序,打上+1/-1标记。然后排序。但是一直被排序后初始点在结束点后面的情况给卡住,后面......
  • Mysql导入sql脚本报错,时间格式数据为空
    Mysql导入sql脚本报错,时间格式数据为空Mysql导入sql脚本时候导入的sql脚本中有时间格式为空的时候时间格字段会报错。解决方式也很简单:查看sql_mode:select@@session.sql_mode;查询结果:STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,N......
  • SpringBoot+Vue3+MySQL集群 开发健康体检双系统
    第1章课程介绍试看4节|38分钟观看项目演示,熟悉大健康体检项目主要功能。掌握学习本课程的最佳方法,以及如何利用在线手册学习和答疑。第2章大健康体检项目全栈环境搭建16节|218分钟利用虚拟机或者云主机安装Linux系统和Docker环境,部署MongoDB、Redis、Minio和RabbitMQ等中......
  • mysql root权限恢复
    1.首先停止​​MySQL​​服务:servicemysqldstop2.加参数启动​​mysql​​:/usr/bin/mysqld_safe--skip-grant-tables& 然后就可以无任何限制的访问mysql了3.root用户登陆系统:mysql-uroot-pmysql4.切换​​数据库​​:usemysql5.显示所有的表:showtables;这里就可以访问表......