Java编写MySQL数据插入测试类运行正常但数据库无变更求助
排查Java写入MySQL无数据的问题
嘿,作为MySQL新手遇到这种情况很正常,我帮你梳理几个关键问题,应该能解决你的问题:
1. 事务未提交(最可能的原因)
JDBC默认情况下,数据库连接的autoCommit属性是false,也就是说你执行完插入语句后,如果不手动提交事务,数据库会自动回滚这个操作,导致你看不到数据。
你需要在st.execute()之后添加一行代码提交事务:
st.execute(); conn.commit(); // 加上这行提交事务 conn.close();
2. SQL语句的语法错误
你的SQL语句里用了value,但MySQL的标准插入语法应该是values(复数形式),虽然有些情况下可能兼容,但这是潜在的语法问题,建议修正:
insert into cxinvoice.invoice_list (number, company, date, payment, quantity, subtotal_five, cgst_five, sgst_five, subtotal_twelve, cgst_twelve, sgst_twelve, total, items) values (?,?,?,?,?,?,?,?,?,?,?,?,?) -- 把value改成values
3. 数据库连接URL的问题
你的连接URL写的是jdbc:mysql://localhost:3306/cxinvoice.invoice_list,这里的cxinvoice.invoice_list是「数据库名.表名」,但URL里只需要指定数据库名即可,表名应该在SQL语句里指定,所以URL应该修正为:
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cxinvoice","admin","admin");
4. 资源关闭的最佳实践
为了避免数据库连接泄漏,建议使用try-with-resources语法自动关闭资源,这样即使出现异常,连接和PreparedStatement也能被正确关闭,修改后的完整代码如下:
package climaxinvoice; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Calendar; public class InsertValues { public static void main(String args[]) throws ClassNotFoundException, SQLException { // 使用try-with-resources自动关闭连接和PreparedStatement try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cxinvoice", "admin", "admin"); PreparedStatement st = conn.prepareStatement("insert into invoice_list (number, company, date, payment, quantity, subtotal_five, cgst_five, sgst_five, subtotal_twelve, cgst_twelve, sgst_twelve, total, items) values (?,?,?,?,?,?,?,?,?,?,?,?,?)")) { Class.forName("com.mysql.jdbc.Driver"); Calendar cdr = Calendar.getInstance(); java.sql.Date startDate = new java.sql.Date(cdr.getTime().getTime()); st.setInt(1,1); st.setString(2,"Climax Exclusive"); st.setDate(3,startDate); st.setString(4,"CASH"); st.setString(5,"5"); st.setString(6,"1000"); st.setString(7,"250"); st.setString(8,"250"); st.setString(9,"2000"); st.setString(10,"750"); st.setString(11,"750"); st.setString(12,"3000"); st.setString(13,"a|b|c|d"); st.executeUpdate(); // 推荐用executeUpdate执行DML语句,返回受影响行数,方便排查 conn.commit(); // 提交事务 } catch (Exception e) { e.printStackTrace(); // 不要只打印message,打印完整堆栈信息更容易排查问题 } } }
额外排查点
- 确认Workbench连接的是同一个本地MySQL实例,并且选中的是
cxinvoice数据库 - 检查表结构是否和你插入的字段匹配,比如
number字段是否是INT类型,date是否是DATE类型等
内容的提问来源于stack exchange,提问作者sanjulgupta
相关产品推荐
相关产品推荐

