Spring JDBC 无法插入

Posted

技术标签:

【中文标题】Spring JDBC 无法插入【英文标题】:Spring JDBC Unable to insert 【发布时间】:2021-09-04 10:45:33 【问题描述】:

我是 SpringBoot 新手,我正在使用 SpringBoot 和 JDBC 来制作 API。 INSERT 无法正常工作,我已将 ID 设为唯一并自动递增。在我插入 ID 之前,它没有引起任何问题。我使用 mysql 作为数据库。

我在 POST 中使用的 JSON 是:


    "name":"Name",
    "email":"namegmail.com",
    "dob":"2000-04-09",
    "age":21

我收到此错误。


    "timestamp": "2021-06-20T13:10:16.925+00:00",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/octet-stream' not supported",
    "path": "/api/v1/NewStudent"

控制器

@RestController
@RequestMapping(path = "api/v1/")
public class StudentController 

    private StudentService studentService;

    @Autowired
    public StudentController(StudentService service)
        this.studentService=service;
    


    @GetMapping("/home")
    public String getHome()
        return "Hey Welcome to Home";
    

    @PostMapping("/NewStudent")
    public void registerNewStudent(@RequestBody StudentClass studentClass)
        studentService.addNewStudent(studentClass);
    

    @GetMapping("/student/id")
    public StudentClass getStudentSearch(@PathVariable(value = "id") Long userId)

        return studentService.getStudentSelect(userId);
    

    @GetMapping("/AllStudents")
    public List<StudentClass> getAllStudents()

        return studentService.getAllStudents();
    



学生道

public class StudentDaoClass implements StudentDao

    @Autowired
    private JdbcTemplate jdbctemplate;
    private List<StudentClass> selectAll;

    @Override
    public int insert(StudentClass student) 

        String query="INSERT INTO Student(std_name,std_email,std_dob,std_age)" +
                "VALUES(?,?,?,?)";
        int res=this.jdbctemplate.update(query,student.getName(),student.getEmail(),student.getDob(),student.getId());
        return res;
    

    @Override
    public StudentClass selectStudent(Long id) 

        String query="SELECT * FROM Student WHERE std_id=?";
        RowMapper<StudentClass> rowMapper=new RowMapperClass();
        StudentClass studentClass=this.jdbctemplate.queryForObject(query,rowMapper,id);

        return studentClass;
    

    @Override
    public List<StudentClass> selectAllStudents() 

        String query="SELECT * FROM Student";
        selectAll=this.jdbctemplate.query(query,new RowMapperClass());
        return selectAll;
    

    public JdbcTemplate getJdbctemplate() 
        return jdbctemplate;
    

    public void setJdbctemplate(JdbcTemplate jdbctemplate) 
        this.jdbctemplate = jdbctemplate;
    

学生班

public class StudentClass 
    
    @Id
    private Long id;
    private String name;
    private LocalDate dob;
    private Integer age;
    private String email;

    public StudentClass() 
    

    public StudentClass(String name, String email,LocalDate dob ,Integer age) 
        this.name = name;
        this.dob = dob;
        this.age = age;
        this.email = email;
    

    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public LocalDate getDob() 
        return dob;
    

    public void setDob(LocalDate dob) 
        this.dob = dob;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

    public String getEmail() 
        return email;
    

    public void setEmail(String email) 
        this.email = email;
    

    @Override
    public String toString() 
        return "StudentClass" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", dob=" + dob +
                ", age=" + age +
                ", email='" + email + '\'' +
                '';
    

【问题讨论】:

在调用 API 时,您是否将 Content type 正确设置为 application/json 是的,我做到了。我认为问题可能与学生班级有关,因为 ID 是自动递增的。我之前插入了 ID,它工作正常。 还要检查你的插入查询字符串连接,我认为)VALUES之间应该有一个空格。 我试过了,还是不行。 【参考方案1】:

我认为您的休息呼叫甚至没有到达 jdbc 部分,因为您的休息请求存在问题。我相信您没有正确设置内容类型。尝试进行以下更改并查看。

发送请求时请将'Content-Type' header 属性设置为'application/json'

并增强您的以下处理程序方法所消耗的内容。

@PostMapping(path="/NewStudent", consumes="application/json")
public void registerNewStudent(@RequestBody StudentClass studentClass)
    studentService.addNewStudent(studentClass);

尝试调试您的应用程序。你的 rest 调用应该到达你上面的处理方法。

【讨论】:

我试过了,但没有帮助。在我制作 ID AutoIncrement 之前它就可以工作了。

以上是关于Spring JDBC 无法插入的主要内容,如果未能解决你的问题,请参考以下文章

Spring JDBC - 最后插入的 id

Spring JDBC 与 JDBC

使用 Spring JDBC 将数据插入外部表

Spring JDBC - 针对多个表的批量插入

如何使用带有 Spring JDBC 的 MERGE 语句插入/更新单个记录

如何在 Spring Data JDBC 中插入默认值