Java 为什么我的数据不能插入数据库?

Java 为什么我的数据不能插入数据库?,java,database,Java,Database,我无法将输入保存到数据库中。有人能帮我吗? 存在SSL问题,但可以通过将SSL设置为false来解决,但数据似乎只能读取,而不能保存到我的数据库中 package first; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Connection; import javax.swing.JOptionPane; public class CustomersForm extend

我无法将输入保存到数据库中。有人能帮我吗? 存在SSL问题,但可以通过将SSL设置为false来解决,但数据似乎只能读取,而不能保存到我的数据库中

package first;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Connection;
import javax.swing.JOptionPane;

public class CustomersForm extends javax.swing.JFrame {
    public CustomersForm() {
        initComponents();
    }

    private void jButton_addcusActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String connectionURL = "jdbc:mysql://localhost:3308/java_his_db";
            Connection con = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "Insert into customers ('fname') values (?)";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(2, jTextField_fname.getText());
            ps.executeUpdate();
            System.out.println("YES");
            con.close();
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(rootPane, "Blank or Wrong User Profile", "Insert Error", 2);
        }  
    }                                                         

    private void jTextField_fnameActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
    }

查询中只有一个占位符,因此在此语句中,索引应该是一个:
ps.setString(1,jTextField_fname.getText())

查询中只有一个占位符,因此在此语句中,索引应该是一个:
ps.setString(1,jTextField_fname.getText())

看起来正确。您的占位符编号
2
应该是
1

您评论说您仍然有错误,但忽略了描述这些错误。错误可能来自
INSERT
语句的SQL。您不应该将列名设置为字符串。你把单引号放在它们不属于的地方。如前所述,在
'fname'
周围的单引号使该文本成为一个列,而不是一个列的名称。在需要列名的SQL中,字符串文字没有任何意义

您的代码:

String sql=“插入客户('fname')值(?”;
……应该是:

String sql=“插入客户(fname)值(?);”;
在下面的示例中,您将看到类似的代码:

插入人(姓名)
值(?)
;
下面是一个完整的示例应用程序,它创建了一个数据库,其中包含一个表
person\uu
,在该表中插入两行,然后检索这两行。您可以看到调用
PreparedStatement#set…
方法是如何工作的

此代码使用。但是以下代码对于任何SQL数据库都几乎相同

package first;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Connection;
import javax.swing.JOptionPane;

public class CustomersForm extends javax.swing.JFrame {
    public CustomersForm() {
        initComponents();
    }

    private void jButton_addcusActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String connectionURL = "jdbc:mysql://localhost:3308/java_his_db";
            Connection con = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "Insert into customers ('fname') values (?)";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(2, jTextField_fname.getText());
            ps.executeUpdate();
            System.out.println("YES");
            con.close();
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(rootPane, "Blank or Wrong User Profile", "Insert Error", 2);
        }  
    }                                                         

    private void jTextField_fnameActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
    }
提示:将数据库访问代码与GUI代码分开。在尝试与GUI集成之前,先编写数据库代码并顺利运行

提示:用于自动关闭连接、语句、结果集等

提示:始终包括可选的分号语句终止符。您可以在某些地方不使用它,但在其他地方可能会弄乱代码。保持整洁,始终如一

package work.basil.example;
导入com.thedeanda.lorem.LoremIpsum;
导入org.h2.jdbcx.JdbcDataSource;
导入javax.sql.DataSource;
导入java.sql.*;
导入java.time.Instant;
导入java.time.OffsetDateTime;
导入java.util.Objects;
公共类dbh2示例
{
公共静态void main(字符串[]args)
{
db2example app=新的db2example();
app.demo();
}
私有void演示()
{
//-------------------数据源|---------------------------------
DataSource DataSource=null;
{
org.h2.jdbcx.JdbcDataSource ds=Objects.requireNonNull(新的JdbcDataSource());//与h2绑定的“DataSource”的实现。
ds.setURL(“jdbc:h2:mem:MyExampleDb;DB_CLOSE_DELAY=-1”);//要在断开连接后保留内存中的数据库,请添加DB_CLOSE_DELAY=-1参数。
ds.setUser(“斯科特”);
ds.设置密码(“老虎”);
setDescription(“显示如何插入行的示例数据库”);
数据源=ds;
}
Objects.requirennull(数据源);
//------------------------准备数据库|---------------------------------
{
字符串sql=
"""
删除表格(如果存在)
;
如果不存在,则创建表_
(
名称\文本不为空,
行\u已创建\u时区非空的时间戳默认当前\u时间戳(),
id_uu标识不为空,
约束人\u pkey\u主键(id)
)
;
""";
试一试(
Connection conn=dataSource.getConnection();
语句stmt=conn.createStatement();
)
{
System.out.println(“信息-准备数据库.消息#adaaf8ed-8922-4c15-addf-35f6ead1442b.+Instant.now());
stmt.executeUpdate(sql);
}
捕获(SQLE异常)
{
e、 printStackTrace();
}
}
//------------------------插入行|---------------------------------
{
System.out.println(“信息-插入行.消息#7a7e1c0a-7e97-4ebc-8d24-6e9ea20f8b5f.+Instant.now());
字符串sql=
"""
插入人员(姓名)
值(?)
;
""";
尝试
(
Connection conn=dataSource.getConnection();
PreparedStatement ps=conn.prepareStatement(sql);
)
{
ps.setString(1,“Alice”);
ps.executeUpdate();
ps.setString(1,“Bob”);
ps.executeUpdate();
}
捕获(SQLE异常)
{
e、 printStackTrace();
}
}
//-------------------转储行|---------------------------------
{
System.out.println(“信息-转储行.消息#f6b786be-ef1e-4b97-9779-59bc84566e3d.+Instant.now());
尝试
(
Connection conn=dataSource.getConnection();
语句stmt=conn.createStatement();
)
{
字符串sql=
"""
餐桌上的人_
;
""";
试一试(
结果集rs=stmt.executeQuery(sql);
)
{