# 基本配置

需要配置依赖,用户名,密码,数据库名,以及 JPA。

pom.xml 中添加 PostgreSQL 驱动和 Spring Data JPA 依赖

<dependency>  
    <groupId>org.postgresql</groupId>  
    <artifactId>postgresql</artifactId>  
    <scope>runtime</scope>  
</dependency>  
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-jpa</artifactId>  
</dependency>

在 resources 下 application.properties 进行基本配置

spring.datasource.url=jdbc:postgresql://localhost:5432/spring_test  
spring.datasource.username=用户名  
spring.datasource.password=密码 
  
# JPA/Hibernate 配置  
spring.jpa.hibernate.ddl-auto=update  # 自动更新表结构(表不存在时创建)
spring.jpa.show-sql=true

# 定义实体类

我们可以新建一个类,这里以 User 类为例。注意: @Entity@Table(name = "表名") 两个注解不能少。

注意命名规范。使用驼峰命名法

package com.example.demo;  
import jakarta.persistence.*;  
  
@Entity  
@Table(name = "users")  
public class User {  
  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(nullable = false, unique = true)  
    private String username;  
  
    @Column(name = "full_name") // 映射数据库字段名  
    private String fullName;  
  
    // ...
}

和 MidwayJS 还挺像的(虽然这可能是儿子像爸爸哈哈哈但是我毕竟之前是写 Midway 的)

启动程序,在 pgAdmin 里发现表格已经建立,三个列:id,username,full_name(由于指定名称,覆盖掉了原先的 fullName)

这里在 IDEA 里出现了报错,显示 “无法解析表 users”,是由于表新建但 idea 内部数据库还没更新,需要更新一下数据库。

# 定义接口

Spring Data JPA Repository 是你可以定义的接口,用于访问数据。JPA 查询是由你的方法名称自动创建的。例如,一个 CityRepository 接口可能会声明一个 findAllByState(String state) 方法来查找给定州内的所有城市。

(这是 ds 说的) UserRepository (就是 user 表的对应接口,名字无所谓)是 Spring Data JPA 中的核心接口,它的作用是 自动实现数据库的增删改查(CRUD)操作。通过继承 JpaRepository ,开发者无需手动编写 SQL 或实现方法,Spring Data JPA 会自动生成数据库操作逻辑。

# UserRepository 的作用

  • 核心功能
    • 标准化 CRUD:提供 save() , findAll() , findById() , delete() 等方法。
    • 自定义条件查询通过方法名自动生成查询(如 findByUsername )。
    • 支持复杂查询:使用 @Query 注解编写原生 SQL 或 JPQL。

# 创建接口

package com.example.demo;  
import org.springframework.data.jpa.repository.JpaRepository;  
  
public interface UserRepository extends JpaRepository<User, Long> {  
    // 此处可定义自定义方法(按规则自动生成逻辑)  
    User findByUsername(String username);
	// 自定义 JPQL 查询 
	@Query("SELECT u FROM User u WHERE u.age > :age")
	List<User> findUsersByAge(@Param("age") int age);
}

对于更复杂的查询,你可以用 Spring Data 的 Query 注解来注解你的方法。否则,根据方法名自动生成查询语句。

对于接口名,可能需要严格是 实体类名+Repository 的形式

关于 save 方法以及其他一些方法,JpaRepository 接口已经包含了 save 方法,因此你不需要手动在 Repository 中实现它。

# 在服务层注入类

我们在 UserService.java 中注入并使用接口方法。通过构造函数注入(比较推荐的方式)

package com.example.demo;  
import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
    private final UserRepository userRepository;  
  
    public UserService(UserRepository userRepository) {  
        this.userRepository = userRepository;  
    }  
  
    // 示例:插入用户  
    public User createUser(User user) {  
        return userRepository.save(user);  
    }  
  
    // 示例:根据用户名查询  
    public User getUserByUsername(String username) {  
        return userRepository.findByUsername(username);  
    }  
}

# 在控制层注入服务

我们在 UserController.java 里进行 api 编写。

package com.example.demo;  
  
import org.springframework.http.HttpStatus;  
import org.springframework.http.ResponseEntity;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class UserController {  
  
    private final UserService userService;  
  
    // 推荐构造器注入方式(无 @Autowired 注解)  
    public UserController(UserService userService) {  
        this.userService = userService;  
    }  
    
    //post 方法
    @PostMapping("/user_create")  
    public ResponseEntity<User> createUser(@RequestBody User user) {  
        User savedUser = userService.createUser(user);  
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);  
    }  
    
    //get 方法
    @GetMapping("/user_get")  
    public ResponseEntity<User> getUserByUsername(@RequestParam String username) {  
        System.out.println("Received username: " + username);  // 打印 username
        User user = userService.getUserByUsername(username);  
        return ResponseEntity.ok(user);  
    }  
}

# 出现问题:发送数据全为 null

原因:实体类内没写 Getter/Setter 方法

需要增加:

// 必须添加 Getter/Setter(或 Lombok 生成)  
public String getUsername() { return username; }  
public void setUsername(String username) { this.username = username; }  
  
public String getFullName() { return fullName; }  
public void setFullName(String fullName) { this.fullName = fullName; }

或者:使用 Lombok 自动生成。需要加入 Lombok 依赖。更推荐这个方式。
关于 Lombok 更详细的介绍和排坑:Lombok 介绍

(看最上面的 @注解)

@Entity  
@Table(name = "users")  
@Data       // 自动生成 Getter/Setter/toString ()
@NoArgsConstructor   // 生成无参构造器(JPA 必需)  
@AllArgsConstructor  // 生成全参构造器(可选)  
public class User {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(nullable = false, unique = true)  
    private String username;  
  
    @Column(name = "full_name") // 映射数据库字段名  
    private String fullName;  
   }  
}


Springboot 好像不能热更新,每次更新代码都需要重启,不如我 Midway()但是比 midway 强的点在于很多数据库方法可以自动生成,不需要自己手写。

总的逻辑就是,创建对应数据库里的表的实体类,为实体类创建接口,接口注入服务层,服务再注入控制层。

关于测试接口连通性,可以使用 apifox,有浏览器插件,很方便。
PostgreSQL 自带的 pgAdmin 用来查询当前数据库里的数据。刚刚发现 IDEA(专业版)内部也有直接管理查看数据库的功能,方便!

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

北沐清 微信支付

微信支付

北沐清 支付宝

支付宝