Comment insérer une valeur dans une table MySql à partir de la saisie de l'utilisateur component swing jtextfield
J'ai essayé d'insérer une valeur dans une table à partir de la saisie de l'utilisateur dans le component swing jtextfield. Le code s'exécute avec une erreur:
Vous avez une erreur dans votre syntaxe SQL; consultez le manuel
correspond à votre versions du serveur MySQL pour la bonne syntaxe
Quelqu'un peut-il m'aider à résoudre ce problème? Merci!
Voici mon code.
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);
}
}
Voici ma table MySQL
CREATE TABLE `route` (
`rid` int(11) NOT NULL AUTO_INCREMENT,
`route` varchar(100) ,
`price` decimal(5,2) ,
PRIMARY KEY (`rid`)
)
- vous pourriez avoir cherché ce problème sur google facilement.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il vous manque le nom de la table:
deuxièmement, vous ne devriez pas utiliser la virgule
'
avec les noms de colonnes. Utiliser le backtick plutôt comme ceci:Les deux points sont utilisés pour transmettre des valeurs littérales.
INSERT INTO Tablename(column1, column2, ...) VALUES('value1', 'value2', ...)
. Le backtick n'est cependant pas obligatoire, il est utilisé uniquement pour échapper à des mots réservés et il est OK pour l'utiliser pour les noms de colonnes.Il vous manque le nom de la table dans votre requête SQL. Vous avez besoin de ne pas mettre les noms de colonnes dans des guillemets simples. Seuls les non-valeurs numériques doivent être placés entre guillemets simples.
Que vous allez avec déclaration préparée à l'avance, alors pourquoi ne pas le réglage des paramètres en utilisant
PreparedStatement#setParamater()
. Par ce code actuel, je ne pense pas que si vous prenez PreparedStatement est d'en profiter pleinement. Préparé états ont leur propre ensemble d'avantages.Tout d'abord, il aide à éviter les injection SQL, puis améliore les performances des Requêtes. Vous pouvez google le plus de détails.
Point 1
Vous sont manquants nom de la table
Point 2
La façon dont vous traitez avec l'instruction préparée est pas la bonne façon. Toujours comme ci-dessous.
Point 3
Aussi, je pense
'route', 'price'
ne fonctionnera pas. Je pense que vous avez voulu utiliser ` (backtick) au lieu d'une seule citation 'Donc, votre déclaration finale devrait être