Spring Boot基本的增删改查的实现(结构严谨)
在这次学习过程中,我完成了一个基于 Spring Boot 的用户管理系统项目,目的是通过实现用户的增、删、改、查等功能,帮助自己更深入地理解 Spring Boot、JPA 以及与前端交互时常用的 DTO 设计。此外,本项目还包含了密码加密技术的实践,利用 BCrypt 加密算法保障用户密码的安全。
技术栈
本项目使用了以下几种主要技术:
Spring Boot:简化开发和配置,自动化启动和管理应用。
JPA (Java Persistence API):用于数据库操作,将对象与数据库中的表进行映射。
MapStruct:用于将不同层(如DTO与Entity)之间的数据转换,简化了对象转换的代码。
Lombok:通过注解自动生成
getter
、setter
、toString
等方法,减少了大量的模板代码,提高开发效率。BCrypt:一种强大的密码加密算法,通过盐值加密保护用户的敏感信息。
关键功能实现
用户创建功能
接收用户注册信息,将其转换为数据库所需的实体类(
User
)。在用户注册时,进行用户名是否重复的检查,若重复则抛出异常。
使用 BCrypt 对密码进行加密处理,保障密码的安全性。
用户信息存入数据库后,返回 DTO(
UserDTO
)给前端。
用户删除功能
根据用户 ID 查询用户,若不存在则抛出异常。
使用 JPA 的
deleteById
方法删除用户数据。
用户更新功能
允许修改用户名、密码和性别等信息。
对于每项修改,进行必要的验证,确保修改不会导致冲突(如用户名重复)。
密码修改时重新加密,并更新数据库。
用户查询功能
根据用户 ID 获取用户信息,若查询不到则抛出
RuntimeException
。
异常处理
本项目中有多个场景需要处理异常:
使用自定义的
ConflictException
处理用户名重复的情况。在查询用户时,如果不存在该 ID 的用户,则抛出
IllegalArgumentException
。通过统一的异常处理方式,确保系统的健壮性。
密码加密与安全性
为了确保用户密码的安全性,本项目使用了 BCrypt 算法进行密码的加密。BCrypt 是一种强哈希算法,通过引入盐值来防止彩虹表攻击,从而增加破解密码的难度。每次对相同的明文密码进行加密,生成的密文也是不同的。
在 PasswordUtil
类中,我实现了两个方法:
hashPassword
:使用BCrypt.gensalt()
生成盐值,并通过BCrypt.hashpw
方法对密码进行加密。verifyPassword
:通过BCrypt.checkpw
校验明文密码与数据库中存储的哈希值是否匹配。
Lombok 与 JPA 的结合
项目中使用 Lombok 注解简化了代码,使得 Java Bean 不再需要手动编写 getter
、setter
等方法,从而减少了大量冗余代码,提高了开发效率。与 JPA 配合时,Lombok 能有效简化实体类的开发过程,使得代码更简洁、易于维护。
项目问题与调试
在开发过程中遇到了一些小问题:
Lombok 与 getter/setter 方法的冲突:在使用 Lombok 时,IDEA 自动生成的
isGender
方法与手写的getGender
方法产生了冲突,导致代码无法正常运行。经过调试,发现boolean
类型的属性应该使用isGender
方法,而非getGender
。BCrypt 的加密过程:每次加密相同的密码时,密文不同,这是因为每次加密都会生成不同的盐值。这一点需要注意,特别是在验证密码时,直接比较加密后的密文是不可行的,必须通过 BCrypt 提供的校验方法来验证密码是否匹配。
项目总结与收获
通过这个小的项目,我深入理解了 Spring Boot 的基本操作,并且学会了如何在实际开发中应用 JPA 进行数据操作。尤其是在密码加密部分,结合 BCrypt 提高了项目的安全性。项目中的异常处理和用户管理功能也是我以后开发项目时可以直接复用的模板。
此外,学习了如何通过 Lombok、MapStruct 等工具提高代码效率,减少冗余部分。虽然这个项目简单,但它涵盖了很多基础且重要的知识,未来遇到类似的需求时,我可以直接参考和修改这个模板,进行更高效的开发。
项目发布与分享
这个项目已经发布在我的 GitHub 上,作为我学习过程中的一个小项目模板,并供自己未来复用。你可以在我的 GitHub 仓库中查看完整代码:。
结束语
- 微信
- 赶快加我聊天吧
- 赶快加我聊天吧