【问题标题】:Java Insert Query With TextFields issue带有文本字段的 Java 插入查询问题
【发布时间】:2015-06-30 18:10:21
【问题描述】:

我正在制作一个 GUI。当用户单击JButton b1 时可以插入数据。后端数据库有1个电影表,有两列。第一列的名称是title,数据类型是varchar,第二列的名称是year,它的数据类型是integer。但是我不知道如何借助文本字段在程序中编写此查询。我在查询中尝试了许多代码,但没有任何反应。
代码:

public class A extends JFrame{

    private JTextField t1;
    private JTextField t2;
    private JLabel l1;
    private JLabel l2;
    private JButton b1;

    private  Connection conn;
    private Statement state;
    String server = "jdbc:mysql://localhost/demo";
    String user="root";
    String pass="65";

    public A(){
        super("Query");

        setLayout(null);

        t1= new JTextField();
        t1.setBounds(173, 152, 128, 27);
        add(t1);

        //for year
        t2= new JTextField();
        t2.setBounds(173, 105, 128, 27);
        add(t2);


        l1= new JLabel("title");
        l1.setBounds(99, 101, 42, 37);
        add(l1);

        l1= new JLabel("year");
        l1.setBounds(99, 148, 42, 37);
        add(l1);

        b1= new JButton("Insert");
        b1.setBounds(50, 222, 102, 37);
        add(b1);
        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                try{

            CreateQuery("insert into movies (title,year) values('"+t1.getText()+"') "); 



                }
                catch(Exception e1){
                    e1.printStackTrace();
                }
            }
        });

        setSize(450,450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }



    public void CreateQuery(String w){
        try{

            Class.forName("com.mysql.jdbc.Driver");

            conn=DriverManager.getConnection(server,user,pass);
             state =  conn.createStatement();
             state.executeUpdate(w);
             JOptionPane.showMessageDialog(null, "Query Executed");
        }

        catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

    }

}

主要:

public class Main {

    public static void main(String[] args) {
        A obj = new A();
}
}

【问题讨论】:

  • 发送堆栈跟踪或错误..
  • 将字符串解析为整数Integer.parseInt(t2.getText());并在查询中使用
  • @Madhan 你能给我正确的 parseInt 代码吗
  • 那是properCode

标签: java database swing


【解决方案1】:

您可以通过两种方式做到这一点,第一种是您正在使用的过程,即使用 createStatement

在您的情况下,您必须同时设置标题和年份。

CreateQuery("insert into movies (title,year) values('"+t1.getText()+"', " + t2.getText() + ")");

第二个是使用preparedStatement, 方法调用,

CreateQuery(t1.getText(), t2.getText());

方法,

public void CreateQuery(String title, String year){
        try{

            Class.forName("com.mysql.jdbc.Driver");

            conn=DriverManager.getConnection(server,user,pass);
             PreparedStatement state =  conn.prepareStatement("insert into movies (title,year) values('?', ?)");
             state.setString(1, title);
             state.setInt(1, new Integer(year));
             state.executeUpdate();
             JOptionPane.showMessageDialog(null, "Query Executed");
        }

        catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

    }

【讨论】:

  • 当我在 t1 文本字段上键入时,点击输入字符串“记录”时出现错误
  • 请说明您收到的错误。您可以通过直接运行查询轻松解决问题。首先,在控制台中输出查询,然后复制输出并直接运行。例如 System.out.println(query);在异常发生之前。请说明您收到的例外情况。
【解决方案2】:

你有insert into movies (title,year) values('"+t1.getText()+"'),你需要两个参数,而你只发送一个。

---编辑---

Statement 替换为PreparedStatement 并将参数与setIntsetString 方法一起使用。检查以下链接http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

是一个很好的做法

【讨论】:

  • 是的,但是如果您在 JTextField t1 中写入值“Clockwork Orange”,则将要执行的查询将插入到电影(标题,年份)值('Clockwork Orange')中,您需要像这样插入电影 (title,year) values('Clockwork Orange',2009) 所以你需要修改它像这样 CreateQuery("insert into movies (title,year) values('"+t1.getText( )+"',"+t2.getText()+") ");
【解决方案3】:

通过发送标题和年份两个参数可以解决问题

修改后的代码

CreateQuery("insert into movies (title,year) values('"+t1.getText()+"',"+t2.getText()+") ");

如果年份字段有任何默认值,那么下面是修改后的代码。

CreateQuery("insert into movies (title) values('"+t1.getText()+"') ");

【讨论】:

  • 但是第二列的后端数据类型是整数
  • varchar 值需要单引号。这里作为字符串返回的数字字段可以按原样传递(但由数字组成的字符串)。
  • 字符串 q = t2.getText(); int w = Integer.parseInt(q); try{ CreateQuery("插入电影(title,year) values('"+t1.getText()+"',"+w+") ");我试试这个,但它没有用
  • 在这种情况下 int w = Integer.parseInt(t2.getText()); //可以正常工作(或) String w = t2.getText( ); //会正常工作
【解决方案4】:
b1= new JButton("Insert");
        b1.setBounds(50, 222, 102, 37);
        add(b1);
        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){


                try{
int w = Integer.parseInt(t2.getText());

CreateQuery("insert into movies (title,year) values('"+t1.getText()+"',"+w+") ");                   


    }
                catch(Exception e1){
                    e1.printStackTrace();
}

点击时出现异常错误

java.lang.NumberFormatException: For input string: "World"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Queryahmad.C_03Update$1.actionPerformed(C_03Update.java:76)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2017-03-30
    相关资源
    最近更新 更多