SpringBoot连接MySQL查询返回空对象问题排查求助
问题排查:SpringBoot查询MySQL返回空对象([{},{},{},{}])
问题描述
我是Java新手,正在尝试使用SpringBoot连接MySQL数据库,但查询数据库表返回的数据为空对象。控制台输出显示查询到4条数据,页面返回[{},{},{},{}],无报错信息,且数据库中确实存在数据。
相关代码
application.yaml
spring: datasource: url: jdbc:mysql://localhost:3306/library?serverTimezone=GMT%2B8&characterEncoding=utf-8 username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true properties: hibernate: ddl-auto: update naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl format_sql: true server: port: 8181
Book.java
package com.example.demo.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @Getter @Setter @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="isbn") private String ISBN; @Column(name="name") private String Name; @Column(name="author") private String Author; @Column(name="introduction") private String Introduction; }
BookRepository.java
package com.example.demo.dao; import org.springframework.data.repository.CrudRepository; import com.example.demo.model.Book; public interface BookRepository extends CrudRepository<Book, Integer> { }
BookController.java
package com.example.demo.controller; import java.util.List; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.example.demo.model.Book; import com.example.demo.dao.BookRepository; import jakarta.annotation.Resource; @RestController public class BookController { @GetMapping("/test") public String test() { System.out.println("ok"); return "TEST"; } @Resource private BookRepository bookrepository; @RequestMapping(value = "/allbook", method = RequestMethod.GET) public List<Book> getAll() { List<Book> books = (List<Book>) bookrepository.findAll(); System.out.println("data size : "+books.size()); return (List<Book>) bookrepository.findAll(); } }
现象
- 页面访问
http://localhost:8181/allbook返回:[{},{},{},{}] - Eclipse控制台输出:
data size : 4 Hibernate: select b1_0.isbn, b1_0.author, b1_0.introduction, b1_0.name from book b1_0
问题原因及解决方案
1. 实体类属性命名违反JavaBean规范(核心问题)
Spring默认使用Jackson进行JSON序列化,Jackson严格遵循JavaBean规范:属性名需以小写字母开头(小驼峰格式),对应的getter/setter方法命名应为getXxx()/setXxx()。
你的Book类属性用了大写开头(ISBN、Name等),Lombok生成的getter是getISBN()、getName(),Jackson无法将这些方法映射到属性,导致序列化后输出空对象。
修复方法:
修改Book类属性为小驼峰命名,保持@Column注解映射数据库字段不变:
@Getter @Setter @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="isbn") private String isbn; @Column(name="name") private String name; @Column(name="author") private String author; @Column(name="introduction") private String introduction; }
2. Repository泛型主键类型不匹配
你的主键isbn是String类型,但BookRepository泛型写的是CrudRepository<Book, Integer>,类型不匹配会导致潜在问题,需修正:
public interface BookRepository extends CrudRepository<Book, String> { }
3. 可选优化:避免重复查询
原Controller中重复调用bookrepository.findAll(),可以直接复用已查询的列表,减少数据库访问:
@RequestMapping(value = "/allbook", method = RequestMethod.GET) public List<Book> getAll() { List<Book> books = (List<Book>) bookrepository.findAll(); System.out.println("data size : "+books.size()); return books; }
验证
修改完成后重启项目,再次访问http://localhost:8181/allbook,即可看到包含真实数据的JSON响应。
内容的提问来源于stack exchange,提问作者michael2048
相关产品推荐
相关产品推荐

