spring boot写crud应使用@restcontroller+@requestmapping而非servlet,用@requestbody接收json、jparepository操作数据库、responseresult封装响应、@datetimeformat处理时间格式,并配置连接池、静态资源路径和日志文件。

Java后端用Spring Boot写CRUD,别碰Servlet手动处理请求
直接上@RestController + @RequestMapping,不是所有HTTP逻辑都得自己解析HttpServletRequest。手写doGet/doPost不仅重复造轮子,还容易漏掉JSON解析、参数绑定、异常统一处理这些基础能力。
常见错误现象:返回404但路径明明写了;前端传JSON过来,后端收到null;更新时字段没变——其实是没加@RequestBody或实体类缺少无参构造/Getter。
-
@PostMapping("/posts")接收新增,参数必须是@RequestBody PostDTO,不是String或Map - 实体类
Post里日期字段用LocalDateTime,别用Date,否则Jackson序列化可能出错 - 查询列表接口别直接返回
List<post></post>,包一层ResponseResult<list>></list>,方便后续加分页、code、msg字段
数据库操作别硬写JDBC,优先选JpaRepository而不是JdbcTemplate
除非你要动态拼SQL或做复杂批量更新,否则JpaRepository自带的save()、findById()、findAll()、deleteById()已经覆盖90%的博客后台场景。它自动处理主键生成、事务边界、空值转Optional,比手写PreparedStatement少踩三类坑。
使用场景:文章增删改查、分类关联查询、按状态筛选(如findByStatusOrderByCreateTimeDesc)。
立即学习“Java免费学习笔记(深入)”;
- 主键用
@Id @GeneratedValue(strategy = GenerationType.IDENTITY),MySQL才认IDENTITY,H2或PostgreSQL得换SEQUENCE或UUID - 软删除别靠
DELETE FROM,加字段is_deleted tinyint(1) DEFAULT 0,再用@Query("UPDATE Post p SET p.isDeleted = true WHERE p.id = :id")配@Modifying - 如果要查带分类名称的文章列表,别在Controller里循环查分类——用
@EntityGraph或@Query连表,否则N+1问题立马拖慢后台响应
前后端联调时400 Bad Request大概率是DTO校验或时间格式崩了
Spring Boot默认开启@Valid校验,但很多人只加了@NotBlank,却忘了LocalDateTime字段没配@DateTimeFormat,导致JSON里的"2024-05-20T10:30:00"直接报错。
错误信息典型长这样:Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDateTime'。
- 在DTO字段上加
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"),注意是空格不是T;前端传ISO格式就用@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") -
@NotBlank对空格字符串也判为有效,要严格非空用@NotNull+@NotEmpty - 别在Service层抛
RuntimeException完事,配个@ControllerAdvice捕获MethodArgumentNotValidException,返回带具体字段名的错误提示,比如{"title": "标题不能为空"}
部署前检查application.yml里这三项是否显式配置
本地跑通不等于上线能用。博客后台最常栽在这三个地方:数据库连接池耗尽、静态资源404、日志把磁盘打满。
-
spring.datasource.hikari.maximum-pool-size: 10——别用默认的10,小项目5够用,设太高反而触发MySQL最大连接数限制 -
spring.mvc.static-path-pattern: /static/**和spring.resources.static-locations: classpath:/static/配齐,否则Vue或AdminJS前端资源全404 -
logging.file.name: logs/blog-admin.log必须指定,否则日志打到控制台,Docker里根本捞不到错误堆栈
真正麻烦的是事务传播行为和缓存穿透——比如删除文章时没同步删ES索引,或者首页查询不做缓存,每次刷都压DB。这些不在CRUD主干里,但一上线就暴露。










