spring boot JPA完整全套代码
项目结构回顾
plaintext
src/main/java/com/demo ├─ DemoApplication.java 启动类 ├─ entity │ └─ User.java 实体类 ├─ repository │ ├─ UserRepoByRepository.java │ ├─ UserRepoByCrud.java │ └─ UserRepository.java └─ controller └─ UserController.java src/main/resources └─ application.yml
pom.xml 依赖也一并提供
1. pom.xml
xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> </parent> <groupId>com.demo</groupId> <artifactId>springdata-jpa-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springdata-jpa-demo</name> <properties> <java.version>17</java.version> </properties> <dependencies> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- H2 内存数据库,无需安装数据库 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <!-- lombok 简化实体类get/set --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
2. application.yml(resources 下)
yaml
spring: datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true # 浏览器可以访问h2数据库控制台 jpa: hibernate: ddl-auto: update # 自动创建/更新数据表 show-sql: true # 控制台打印执行的SQL properties: hibernate: format_sql: true # SQL格式化排版
3. 启动类 com.demo.DemoApplication.java
java
运行
package com.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
4. 实体类 com.demo.entity.User.java
java
运行
package com.demo.entity; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Entity @Table(name = "t_user") @Data @NoArgsConstructor @AllArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; }
5. Repository 三层接口
5.1 com.demo.repository.UserRepoByRepository.java
继承顶层标记接口 Repository,没有自带 CRUD 方法,全部方法自己定义
java
运行
package com.demo.repository; import com.demo.entity.User; import org.springframework.data.repository.Repository; import java.util.Optional; public interface UserRepoByRepository extends Repository<User, Long> { // 必须手动声明保存方法,没有自带save User save(User user); // 方法名查询 Optional<User> findByName(String name); }
5.2 com.demo.repository.UserRepoByCrud.java
继承 CrudRepository,自带基础增删改查
java
运行
package com.demo.repository; import com.demo.entity.User; import org.springframework.data.repository.CrudRepository; import java.util.Optional; public interface UserRepoByCrud extends CrudRepository<User, Long> { // 自带 save findById findAll delete Optional<User> findByName(String name); }
5.3 com.demo.repository.UserRepository.java
继承 JpaRepository(企业最常用,CRUD + 分页排序)
java
运行
package com.demo.repository; import com.demo.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByName(String name); // 条件分页 Page<User> findByAgeGreaterThan(Integer age, Pageable pageable); }
6. Controller com.demo.controller.UserController.java
java
运行
package com.demo.controller; import com.demo.entity.User; import com.demo.repository.UserRepoByCrud; import com.demo.repository.UserRepoByRepository; import com.demo.repository.UserRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.annotation.Resource; import java.util.List; import java.util.Optional; @RestController @RequestMapping("/user") public class UserController { @Resource private UserRepository userRepository; @Resource private UserRepoByCrud userRepoByCrud; @Resource private UserRepoByRepository userRepoByRepository; // ===================== 使用 JpaRepository ===================== @GetMapping("/add") public User addUser() { User user = new User(null, "张三", 22); return userRepository.save(user); } @GetMapping("/list") public List<User> listAll() { return userRepository.findAll(); } // 分页:第0页,每页5条 @GetMapping("/page") public Page<User> pageUser() { PageRequest pageRequest = PageRequest.of(0, 5); return userRepository.findAll(pageRequest); } @GetMapping("/pageAge") public Page<User> pageByAge() { PageRequest pageRequest = PageRequest.of(0, 5); return userRepository.findByAgeGreaterThan(20, pageRequest); } // ===================== 使用 CrudRepository ===================== @GetMapping("/crud/find") public Optional<User> crudFind() { return userRepoByCrud.findByName("张三"); } // ===================== 使用 Repository(标记接口)===================== @GetMapping("/base/save") public User baseSave() { User user = new User(null, "李四", 25); return userRepoByRepository.save(user); } @GetMapping("/base/find") public Optional<User> baseFind() { return userRepoByRepository.findByName("李四"); } }
测试地址(启动项目后浏览器访问)
plaintext
# 添加张三 http://localhost:8080/user/add # 查询全部 http://localhost:8080/user/list # 分页 http://localhost:8080/user/page # 使用基础Repository新增李四 http://localhost:8080/user/base/save
完整流程串起来(从头到尾)
- 启动类
@SpringBootApplication启动项目 - Spring 扫描包,发现
User.java带有@Entity - Hibernate 读取
User实体所有注解(@Entity、@Id、字段) - 根据
spring.jpa.hibernate.ddl-auto=update,自动执行建表 SQL,生成t_user数据表 - SpringData 扫描
repository包下所有继承Repository系列接口 - 自动生成
UserRepository接口的实现类,放入 Spring 容器 - Controller 使用
@Resource注入UserRepository,直接调用save()、findAll()操作数据库

浙公网安备 33010602011771号