用java链接MySQL插入变量时,网页报500错误

写web时用java链接MySQL插入数据服务器报500错误
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'null' for key 'student.PRIMARY'

java代码


import java.sql.*;
import java.util.Objects;

public class database {
    public void insert(String username, String password1, String password2) throws SQLException{
        Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","Hwg2539785237");
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动添加成功,可以进行数据库连接了");
        }catch (Exception e){
            System.out.println("驱动加载失败,错误原因是:"+e.getMessage());
        }

        String node="insert into student(id,name,age)values('"+username+"','"+password1+"','"+password2+"')";
        //String insert1="insert into student values('hahaha','wotama','jianzhitiancai')";执行注释代码插入常量时可以正确插入
        Statement stmt = conn.createStatement();
        int result=stmt.executeUpdate(node);
        //int result1=stmt.executeUpdate(insert1);
        System.out.println(result);
    }
}

传给java值的servlet


import java.io.IOException;
import java.sql.SQLException;
import java.util.Objects;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/servlet")
public class servlet extends HttpServlet{
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("username");
        String password1 =request.getParameter("password1");
        String password2 =request.getParameter("password2");

        database data=new database();
        try {
            data.insert(name,password1,password2);//调试时这里是有正确参数的
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

报错截图

img

看到报错里Duplicate entry 'null'感觉是参数没传过来,但是调试的时候显示在database里的username变量是有输入的数据的,不知道是不是语法错误≧ ﹏ ≦

配置:tomcat,MySQL,mysql-connector-java-8.0.28.jar。编译器:idea2023

个人理解:
感觉是name类型的问题,student.primary应该是student表的主键,传入的name的类型与student表设置的id类型不一致。
也有可能是你写错了,id为啥要与username对应,name为啥要与password1对应,age为啥跟password2对应。。。。。。如果没错的话,你这命名方式。。。说实话,有点离谱。

【以下回答由 GPT 生成】

问题原因分析: 根据错误信息和代码,可以初步判断问题出在MySQL插入操作的语句上。出现了java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'null' for key 'student.PRIMARY'的错误,说明插入时发生了主键冲突,即idnull已经存在于数据库的主键列中。

解决方案: 1. 首先,确保数据库连接正常。可以在代码中添加打印语句,查看是否成功连接到数据库。

java System.out.println("数据库连接成功");

  1. 确保数据库表结构中的主键列已正确设定,且主键列的约束是自增长的。

可以使用如下语句修改表结构,将id列设为整型、主键和自增长:

sql ALTER TABLE student MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY;

  1. 在插入数据之前,检查获取到的用户名、密码是否为空,如果为空,则不进行数据库插入操作。

java if (username == null || password1 == null || password2 == null) { // 错误处理:输出错误信息、或者返回错误页面 }

  1. 修改插入语句,采用预编译的方式插入变量值,以避免SQL注入和特殊字符引起的问题。

java String node = "INSERT INTO student (name, age) VALUES (?, ?)"; PreparedStatement stmt = conn.prepareStatement(node); stmt.setString(1, username); stmt.setString(2, password1); stmt.executeUpdate();

这样修改后,消息中的id列值将会自动生成,避免了重复和null值的问题。

  1. 最后,检查数据库连接的用户名和密码是否正确,以及数据库是否存在名为database的数据库。

综上所述,根据以上解决方案进行修改,可以解决该问题。如果还有其他问题,请提供更多的错误信息和相关代码,以便进一步排查。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

img


这错误信息给你指出问题了,主键冲突,我猜你想用自动递增的方式生成主键,看看标里面设计的这个字段有没有配置是自动递增。