我尝试在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`)
)
答案 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);