如何从用户输入JTextField将值插入MySql表

时间:2012-12-24 08:53:15

标签: java mysql swing

我尝试在JTextField中的用户输入中将值插入表中。代码运行时出错:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以获得正确的语法

任何人都可以帮我解决这个问题吗?谢谢!

这是我的代码。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

class InputRoute
{

JTextField text1;
JTextField text2;
JTextField text3;
String c;
Float d;

public void inputRoute() 
{

    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "YarraTram";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "root";
    String password = "abc123";

    try 
    {
        Class.forName(driver).newInstance();
        conn = DriverManager.getConnection(url + dbName, userName, password);

        PreparedStatement statement = conn.prepareStatement("INSERT INTO  ('route', 'price') VALUES ('"+c+"', '"+d+"')");
        statement.executeQuery();

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

 public void createAndShowGUI() 
{

    final JFrame frame = new JFrame("Yarra Tram Route Finder(New Route)");

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new FlowLayout());

    JLabel label1 = new JLabel("From: ");
    JLabel label2 = new JLabel("To: ");
    JLabel label3 = new JLabel("Price: ");

    text1 = new JTextField(20);
    text2 = new JTextField(20);
    text3 = new JTextField(20);

    JButton button1 = new JButton("Add");
    JButton button2 = new JButton("Close");

    frame.add(label1, BorderLayout.WEST);
    frame.add(text1, BorderLayout.EAST);
    frame.add(label2, BorderLayout.WEST);
    frame.add(text2, BorderLayout.EAST);
    frame.add(label3, BorderLayout.WEST);
    frame.add(text3, BorderLayout.EAST);
    frame.add(button1);
    frame.add(button2);

    button2.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            String a = text1.getText();
            String b = text2.getText();
            d = Float.parseFloat(text3.getText());

            c = a + " - " + b;

            inputRoute();
        }
    });
    button2.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            frame.dispose();
        }
    });

    frame.setSize( 500,120 );
    frame.setLocationRelativeTo( null );
    frame.pack();
    frame.setVisible(true);
} 
}

这是我的MySQL表

 CREATE TABLE `route` (
 `rid` int(11) NOT NULL AUTO_INCREMENT,
 `route` varchar(100) ,
 `price` decimal(5,2) ,
 PRIMARY KEY (`rid`)
 )

4 个答案:

答案 0 :(得分:1)

首先,您缺少表格名称:

... ("INSERT INTO  ('route', 'price') VALUES ...
                 /\
                  here

第二,你不应该使用冒号'和列的名字。改为使用反引号:

... ("INSERT INTO  `route` (`route`, `price`) VALUES ...

冒号用于传递文字值。

答案 1 :(得分:1)

INSERT INTO "table_name" ("column1", "column2", ...)
VALUES ("value1", "value2", ...)

答案 2 :(得分:1)

您在SQL查询中缺少表名。您不需要将列名称放在单引号中。只需将非数字值放在单引号中。

当您使用预备语句时,为什么不使用PreparedStatement#setParamater()设置参数。通过这个当前的代码,我不认为你是否采取PreparedStatement的全部优势。准备好的陈述有各自的优点。 首先,它有助于避免SQL注入,然后提高查询性能。您可以进一步了解详情。

String c = <your_route>;
float d = <your_price>;      
PreparedStatement statement = conn.prepareStatement("INSERT INTO TABLE_NAME('route', 'price') VALUES (?, ?)");
statement.setString(1,c);
statement.setFloat(2,d);
statement.executeQuery();

答案 3 :(得分:0)

第1点

您缺少表名

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName ('route', 'price') VALUES ('"+c+"', '"+d+"')");
                                                                 ^^^^^^^^^

第2点

你处理预备陈述的方式不正确。总是如下所示。

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName (route, price) VALUES (?, ?)");
statement.setString(1, c);
statement.setFloat(2, d);

第3点

我认为'route', 'price'也行不通。我觉得你想用`(反引号)代替单引号'


所以,你的最终陈述应该是

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName
(route, price) VALUES (?, ?)");
statement.setString(1, c);
statement.setFloat(2, d);