SpringBoot 整合 JPA / Hibernate 快速上手

张开发
2026/6/10 15:38:24 15 分钟阅读
SpringBoot 整合 JPA / Hibernate 快速上手
不用写 XML、不用写 SQL甚至连简单的增删改查都不用自己敲只需要定义接口就能直接完成数据操作非常适合快速开发、单表为主的业务场景。本篇文章就从零带你整合 SpringBoot JPA底层 Hibernate从依赖、自动建表、CRUD、分页、复杂查询到事务。一、JPA 适合什么场景•单表操作多、不想写重复 CRUD•快速开发、原型搭建•微服务轻量模块•喜欢面向对象操作数据库不想写 SQL优点•极度简洁几乎无样板代码•自动建表、自动更新表结构•内置分页、排序、复杂查询• Spring 全家桶原生支持无缝衔接事务二、引入依赖只需要 web >dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency三、application.yml 配置spring: datasource: url: jdbc:mysql://localhost:3306/testdb?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # JPA 配置 jpa: hibernate: # 项目启动自动更新表结构none不更新create每次启动重建 ddl-auto: update # 控制台打印 SQL show-sql: true # 格式化 SQL 输出 properties: hibernate: format_sql: true # 指定数据库方言 database-platform: org.hibernate.dialect.MySQL8Dialectddl-auto常用值•none不自动管理表•update自动更新表结构不会删除数据•create每次启动创建表关闭时删除表•create-drop启动创建关闭删除四、实体类Entity用注解映射表启动项目自动建表package com.demo.entity; import jakarta.persistence.*; import lombok.Data; import java.time.LocalDateTime; Data Entity Table(name user) public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(nullable false, length 50) private String username; Column(length 100) private String password; private Integer age; Column(unique true) private String email; private LocalDateTime createTime; private LocalDateTime updateTime; }常用注解说明•Entity标识为实体类•Table(name user)指定表名•Id主键•GeneratedValue主键自增•Column字段约束非空、唯一、长度等五、Repository 层只需要继承接口自带全套 CRUDpackage com.demo.repository; import com.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; Repository public interface UserRepository extends JpaRepositoryUser, Long { // 方法名自动生成 SQL ListUser findByUsername(String username); ListUser findByAgeGreaterThan(Integer age); ListUser findByUsernameContaining(String username); }JpaRepository 自带方法•save()新增/修改•findById()根据ID查询•findAll()查询所有•findAll(Pageable)分页查询•deleteById()删除•count()统计数量六、Service 层package com.demo.service; import com.demo.entity.User; import com.demo.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; Service RequiredArgsConstructor public class UserService { private final UserRepository userRepository; // 新增/修改 Transactional(rollbackFor Exception.class) public User save(User user) { return userRepository.save(user); } // 删除 Transactional public void delete(Long id) { userRepository.deleteById(id); } // 根据ID查询 public User findById(Long id) { OptionalUser optional userRepository.findById(id); return optional.orElse(null); } // 查询所有 public ListUser findAll() { return userRepository.findAll(); } // 分页查询 public PageUser page(Integer pageNum, Integer pageSize) { Pageable pageable PageRequest.of(pageNum - 1, pageSize, Sort.by(Sort.Direction.DESC, id)); return userRepository.findAll(pageable); } // 条件查询按用户名模糊查询 public ListUser findByUsername(String username) { return userRepository.findByUsernameContaining(username); } }七、Controller 接口package com.demo.controller; import com.demo.common.Result; import com.demo.entity.User; import com.demo.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/user) RequiredArgsConstructor public class UserController { private final UserService userService; // 新增 PostMapping(/save) public Result save(RequestBody User user) { return Result.success(userService.save(user)); } // 删除 DeleteMapping(/delete/{id}) public Result delete(PathVariable Long id) { userService.delete(id); return Result.success(删除成功); } // 根据ID查询 GetMapping(/{id}) public Result findById(PathVariable Long id) { return Result.success(userService.findById(id)); } // 列表 GetMapping(/list) public Result list() { return Result.success(userService.findAll()); } // 分页 GetMapping(/page) public Result page( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize) { PageUser page userService.page(pageNum, pageSize); return Result.success(page); } // 条件查询 GetMapping(/search) public Result search(RequestParam String username) { return Result.success(userService.findByUsername(username)); } }八、JPA 方法命名规则•findByXxx精确查询•findByXxxLike模糊查询•findByXxxContaining包含•findByXxxGreaterThan大于•findByXxxAndYyy多条件并且•findByXxxOrYyy多条件或者•findByXxxOrderByZzzDesc排序Spring Data JPA 会自动根据方法名生成 SQL。九、自定义 SQL复杂查询复杂业务可以手写 JPQL 或原生 SQLQuery(value select * from user where age ?1, nativeQuery true) ListUser findUserByAge(Integer age);十、JPA、MyBatis、JdbcTemplate 怎么选场景推荐技术追求极简、单表多JPA复杂查询、SQL 可控MyBatis极轻量、直接写原生 SQLJdbcTemplate十一、注意事项1.主键不自增检查GeneratedValue(strategy GenerationType.IDENTITY)2.表不自动创建检查jpa.hibernate.ddl-auto3.分页页码从 0 开始前端传 1代码里要减 14.查询不存在数据会报错用Optional处理5.字段命名冲突避免使用 SQL 关键字十二、总结SpringBoot JPA 是最快开发数据层的方案引依赖 → 配数据源 → 写实体 → 继承 Repository → 直接用不用 XML、不用重复 CRUD、自动建表开发效率直接拉满非常适合快速迭代和轻量业务。

更多文章