写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);
}
}
报错截图
看到报错里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'
的错误,说明插入时发生了主键冲突,即id
为null
已经存在于数据库的主键列中。
解决方案: 1. 首先,确保数据库连接正常。可以在代码中添加打印语句,查看是否成功连接到数据库。
java System.out.println("数据库连接成功");
可以使用如下语句修改表结构,将id
列设为整型、主键和自增长:
sql ALTER TABLE student MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
java if (username == null || password1 == null || password2 == null) { // 错误处理:输出错误信息、或者返回错误页面 }
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
值的问题。
database
的数据库。综上所述,根据以上解决方案进行修改,可以解决该问题。如果还有其他问题,请提供更多的错误信息和相关代码,以便进一步排查。