having trouble with inserting data to a database - java

When I enter data to a database using the sample code below, the line System.out.println("Insertion complete") is shown on the console. When I go to the database, I find that the stored data is a blank.
I think the problem could be my sqlquery, but I don't see any problem with it.
Here is an example of my code:
public class SignUpFrame extends JFrame {
public SignUpFrame() {
super("SIGN UP");
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);
setResizable(false);
setLocation(500, 250);
getContentPane().setBackground(Color.WHITE);
ImageIcon FrameIcon = new ImageIcon("images/signup.png");
JLabel frameicon = new JLabel(FrameIcon);
frameicon.setBounds(150, 0, 100, 100);
add(frameicon);
JLabel firstNamelbl,LastNameLbl,EmailAddressLbl,PasswordLbl,ConfirmPasswordLbl;
JTextField firstNametxt,LastNametxt,EmailAddresstxt;
JPasswordField passwordtxt,ConfirmPasswordtxt;
JButton OKbtn;
JButton CANCELbtn;
firstNamelbl = new JLabel("FIRST NAME:");
firstNametxt = new JTextField();
firstNametxt.setBounds(150, 110, 200, 20);
firstNamelbl.setBounds(50, 110, 100, 20);
LastNameLbl = new JLabel("USERNAME:");
LastNametxt = new JTextField();
LastNametxt.setBounds(150, 140, 200, 20);
LastNameLbl.setBounds(50,140, 100, 20);
EmailAddressLbl = new JLabel("EMAIL ADDRESS:");
EmailAddresstxt = new JTextField();
EmailAddresstxt.setBounds(150, 170, 200, 20);
EmailAddressLbl.setBounds(50, 170, 150, 20);
PasswordLbl = new JLabel("PASSWORD:");
passwordtxt = new JPasswordField();
passwordtxt.setBounds(150, 200, 200, 20);
PasswordLbl.setBounds(50, 200, 150, 20);
ConfirmPasswordLbl = new JLabel("CONFIRM PASSWORD:");
ConfirmPasswordtxt = new JPasswordField();
ConfirmPasswordtxt.setBounds(200, 230, 150, 20);
ConfirmPasswordLbl.setBounds(50, 230, 150, 20);
add(firstNamelbl);
add(firstNametxt);
add(LastNameLbl);
add(LastNametxt);
add(EmailAddressLbl);
add(EmailAddresstxt);
add(PasswordLbl);
add(passwordtxt);
add(ConfirmPasswordLbl);
add(ConfirmPasswordtxt);
OKbtn = new JButton("OK");
OKbtn.setBounds(100, 270, 50, 20);
add(OKbtn);
char [] pass = passwordtxt.getPassword();
String passWord = new String(pass);
String FIRSTNAME,USERNAME,EMAIL,PASSWORD;
FIRSTNAME = firstNametxt.getText().toString();
USERNAME =LastNametxt.getText().toString();
EMAIL = EmailAddresstxt.getText().toString();
PASSWORD = passWord;
OKbtn.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
String url = "jdbc:mysql://localhost:3306/System";
String user = "root";
String password = "";
Connection con;
try {
con = DriverManager.getConnection(url, user, password);
Statement statement = con.createStatement();
String sqlquery = "insert into signUp_tb "+
"(FirstName,UserName,Email,Password) values ('"+FIRSTNAME+"','"+USERNAME+"','"+EMAIL+"','"+PASSWORD+"')";
statement.executeUpdate(sqlquery);
System.out.println("Insertion complete");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
CANCELbtn = new JButton("CANCEL");
CANCELbtn.setBounds(170, 270, 100, 20);
add(CANCELbtn);
CANCELbtn.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
dispose();
}
});
}
}

You need to initialize your FIRSTNAME, USERNAME etc in ActionListener for OK button. You had initialized those Strings when there was no input data, that's why everything was blank. You want to get JTextFields values when user presses button. Not before.
Tested on SQLite.
OKbtn.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
char [] pass = passwordTxt.getPassword();
String PASSWORD = new String(pass);
String FIRSTNAME,USERNAME,EMAIL;
FIRSTNAME = firstNameTxt.getText();
USERNAME = lastNameTxt.getText();
EMAIL = emailAddressTxt.getText();
String url = "jdbc:mysql://localhost:3306/System";
String user = "root";
String password = "";
Connection con;
try {
con = DriverManager.getConnection(url, user, password);
Statement statement = con.createStatement();
String sqlquery = "insert into signUp_tb "+
"(FirstName,UserName,Email,Password) values ('"+FIRSTNAME+"','"+USERNAME+"','"+EMAIL+"','"+PASSWORD+"')";
statement.executeUpdate(sqlquery);
System.out.println("Insertion complete");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
And setVisible(true) should be the last thing you do. Should look like:
SwingUtilities.invokeLater(() -> {
this.setVisible(true);
});
So you will launch it from EDT.
Edit: about setLayout(null) - Try those A Visual Guide to Layout Managers .
Although it is possible to do without a layout manager, you should use
a layout manager if at all possible. A layout manager makes it easier
to adjust to look-and-feel-dependent component appearances, to
different font sizes, to a container's changing size, and to different
locales. Layout managers also can be reused easily by other
containers, as well as other programs.
From Doing Without a Layout Manager (Absolute positioning)

Related

How can I avoid sending hardcoded values to mySQL database

In my project I've assembled a basic password book, the project is designed to send user information over to a mySQL database after the "Save Information" button has been clicked. It works fine when the String values are hardcoded, but when I try to use any kind of String variable or the toString() method I start getting errors. Does anyone know the correct way to send UN-hardcoded values to mySQL?
import javax.swing.*;
//import java.io.*;
//import java.lang.Thread.State;
import java.awt.event.*;
import java.sql.*;
public class PasswordBook implements ActionListener
{
private static JLabel websiteLabel;
private static JTextField websiteText;
private static JLabel userLabel;
private static JTextField userText;
private static JLabel passLabel;
private static JTextField passText;
private static JLabel emailLabel;
private static JTextField emailText;
private static JButton button;
private static JButton clearButton;
private static JLabel success;
//private static String websiteToString; (values I tried)
//private static String userToString;
//private static String emailToString;
//private static String passToString;
public static void main (String[]args)
{
JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setSize(400,350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
panel.setLayout(null); // rows columns
websiteLabel = new JLabel("Website"); //1st
websiteLabel.setBounds(10, 20, 80, 25);
panel.add(websiteLabel);
websiteText = new JTextField(); //1st
websiteText.setBounds(100, 20, 165, 25);
panel.add(websiteText);
//websiteToString = websiteText.toString();
userLabel = new JLabel("Username"); //2nd
userLabel.setBounds(10, 60, 80 ,25);
panel.add(userLabel);
userText = new JTextField(20); // 2nd
userText.setBounds(100, 60, 165, 25);
panel.add(userText);
//userToString = userText.toString();
emailLabel = new JLabel("Email"); //3rd
emailLabel.setBounds(10, 100, 80 ,25);
panel.add(emailLabel);
emailText = new JTextField(); //2nd
emailText.setBounds(100, 100, 165, 25);
panel.add(emailText);
//emailToString = emailText.toString();
passLabel = new JLabel("Password"); //4th
passLabel.setBounds(10, 140, 80, 25);
panel.add(passLabel);
passText = new JTextField(); // 4th
passText.setBounds(100, 140, 165, 25);
panel.add(passText);
//passToString = passText.toString();
button = new JButton("Save Information");
button.setBounds(10, 180, 150 ,25);
button.addActionListener(new PasswordBook()); // action listener to button
panel.add(button);
clearButton = new JButton("Clear");
clearButton.setBounds(180, 180, 150, 25);
// CLEARS THE TEXT FIELDS WHEN PRESSED
clearButton.addActionListener(new ActionListener() {
#Override // Override allows function to perfrom independently of the parent class
public void actionPerformed(ActionEvent event)
{
websiteText.setText("");
userText.setText("");
emailText.setText("");
passText.setText("");
success.setText("");
}
});
panel.add(clearButton);
success = new JLabel("");
success.setBounds(10, 220, 300, 25);
panel.add(success);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
try {
Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/passwordbook", "root", "password");
//Statement myStatement = myConn.createStatement();
String sq1 = "INSERT into website_and_user_info"
+ " (Website, Username, Email, Password)"
+ " values (?, ?, ?, ?)";
PreparedStatement statement = myConn.prepareStatement(sq1);
statement.setString(1, websiteText.toString()); // These values work when hardcoded
statement.setString(2, userText.toString());
statement.setString(3, emailText.toString());
statement.setString(4, passText.toString());
statement.executeUpdate();
System.out.println("insert complete");
} catch (Exception e) {
e.printStackTrace();
}
}
}
If I read it right, passText is a Textfild (advice use Hungarian notation, makes code easier to read) to get the text you need .gettext(). Like prepared preparedStatement.setString(int, passText.getText()); that should do the trick. But you need to get text before clearing the fields. You Code seems to first clear and you use .setTxt in the statement. If iam wrong I'm sry, atm.i just have my phone to browse.

Trying to take data from JFrame and insert into SQLite. Connection works but insertion only inserts blank line. Why?

I am trying to insert some data into my SQLite database with the method "insertSQLB1". However everytime I type something in my TextField it only inserts a blank line into the database. I am still a beginner in Java and thankful for all the advice I can get :)
Code is as follows:
import javax.swing.*;
public class Main {
public static void main(String args[]) {
JFrame frame1 = new JFrame();
frame1.setTitle("Password Saver");
frame1.setSize(600, 600);
frame1.setLocation(800, 200);
frame1.setResizable(false);
frame1.add(new JFrameFunctionality());
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);
}
}
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
public class JFrameFunctionality extends JPanel {
JTextField tf1;
JTextField tf2;
JTextField tf3;
PreparedStatement prepstat = null;
public JFrameFunctionality() {
setLayout(null);
//FIRST PART - Create a JLabel to let the user know what to enter in
first TextField
JLabel label1 = new JLabel("Neues Passwort:");
label1.setBounds(50, 70, 150, 40);
add(label1);
//FIRST PART - Create first TextField to enter password
tf1 = new JTextField();
tf1.setBounds(50, 100, 150, 40);
add(tf1);
repaint();
//FIRST PART - Create second TextField to enter name of the program
tf2 = new JTextField();
tf2.setBounds(50, 140, 150, 40);
add(tf2);
repaint();
//FIRST PART - Create first button to add new password
JButton button1 = new JButton("Add new Password");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
codeforButtons cfBobj1 = new codeforButtons();
cfBobj1.insertSQLB1();
}
});
button1.setBounds(200, 100, 150, 30);
add(button1);
//SECOND PART - Create a JLabel to let the user know where to enter when changing password
JLabel label2 = new JLabel("Enter new Password for change:");
label2.setBounds(50, 170, 200, 40);
add(label2);
//SECOND PART//Create second TextField to enter a new Password when changing Password
tf3 = new JTextField();
tf3.setBounds(50, 200, 150, 40);
add(tf3);
//SECOND PART//Create second button to take the changed Password and put it where the old password was
JButton button3 = new JButton("Change Password");
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {}
});
button3.setBounds(200, 200, 150, 30);
add(button3);
//THIRD PART//Create third button to display a existing password
JButton button2 = new JButton("Display Password");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//DatabaseConnection con2 = new DatabaseConnection ();
//con2.listPasswords();
}
});
button2.setBounds(200, 250, 150, 30);
add(button2);
} //Konstruktur Ende
public String retrieveTextTF1() { //Retrieve Text from TextField 1
return tf2.getText();
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;
public class codeforButtons extends JFrameFunctionality {
Connection con1 = null;
Connection con2 = null;
PreparedStatement stat1 = null;
Statement stat2 = null;
ResultSet rs = null;
public void getConnection() { //Establishes a connection to the database "passwords"
try {
Class.forName("org.sqlite.JDBC");
con1 =
DriverManager.getConnection("JDBC:sqlite:PasswordDatabase.sqlite");
System.out.println("Connection established...");
} catch (Exception e) {
System.out.println("Error: " + " " + e.getMessage());
}
}
public void insertSQLB1() { //Inserts the application name into the database *not working, inserts only a blank row*
try {
getConnection();
String query = "INSERT INTO passwords (Anwendung) VALUES (?)";
PreparedStatement stat1 = con1.prepareStatement(query);
stat1.setString(1, tf2.getText());
stat1.execute();
JOptionPane.showMessageDialog(null, "Data saved!");
con1.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
public void listPasswords() { //Gibt alle Passwörter aus der Datenbank aus und unterbricht dann die Verbindung zur DB
try {
getConnection();
this.stat2 = con2.createStatement();
ResultSet rs = stat1.executeQuery("SELECT * FROM passwords");
while (rs.next()) {
String password = rs.getString("Passwort");
String program = rs.getString("Anwendung");
System.out.println("Passwort: " + password + " " + "Anwendung: " + program);
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
The problem is that you have your codeforButtons class extending JFrameFunctionality so it is getting its own instance of tf2 which is hiding the instance that is used in the display. (You are creating 2 instance of tf2)
Move the codeforButtons to be a nested inner class of JFrameFunctionality and then remove the extends JFrameFunctionality from codeforButtons and you will have the correct scope to read the tf2 variable.
See below:
public class JFrameFunctionality extends JPanel {
JTextField tf1;
JTextField tf2;
JTextField tf3;
PreparedStatement prepstat = null;
public JFrameFunctionality() {
setLayout(null);
// FIRST PART - Create a JLabel to let the user know what to enter in
// first TextField
JLabel label1 = new JLabel("Neues Passwort:");
label1.setBounds(50, 70, 150, 40);
add(label1);
// FIRST PART - Create first TextField to enter password
tf1 = new JTextField();
tf1.setBounds(50, 100, 150, 40);
add(tf1);
// repaint();
// FIRST PART - Create second TextField to enter name of the program
tf2 = new JTextField();
tf2.setText("test");
tf2.setBounds(50, 140, 150, 40);
add(tf2);
// repaint();
// FIRST PART - Create first button to add new password
JButton button1 = new JButton("Add new Password");
button1.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
System.out.println("::" + tf2.getText());
codeforButtons cfBobj1 = new codeforButtons();
cfBobj1.insertSQLB1();
}
});
button1.setBounds(200, 100, 150, 30);
add(button1);
// SECOND PART - Create a JLabel to let the user know where to enter when changing password
JLabel label2 = new JLabel("Enter new Password for change:");
label2.setBounds(50, 170, 200, 40);
add(label2);
// SECOND PART//Create second TextField to enter a new Password when changing Password
tf3 = new JTextField();
tf3.setBounds(50, 200, 150, 40);
add(tf3);
// SECOND PART//Create second button to take the changed Password and put it where the old password was
JButton button3 = new JButton("Change Password");
button3.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
}
});
button3.setBounds(200, 200, 150, 30);
add(button3);
// THIRD PART//Create third button to display a existing password
JButton button2 = new JButton("Display Password");
button2.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
// DatabaseConnection con2 = new DatabaseConnection ();
// con2.listPasswords();
}
});
button2.setBounds(200, 250, 150, 30);
add(button2);
} // Konstruktur Ende
public static void main(String args[]) {
JFrame frame1 = new JFrame();
frame1.setTitle("Password Saver");
frame1.setSize(600, 600);
frame1.setLocation(800, 200);
frame1.setResizable(false);
frame1.add(new JFrameFunctionality());
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);
}
public class codeforButtons {
Connection con1 = null;
Connection con2 = null;
PreparedStatement stat1 = null;
Statement stat2 = null;
ResultSet rs = null;
public void getConnection() { // Establishes a connection to the database "passwords"
try {
Class.forName("org.sqlite.JDBC");
con1 = DriverManager.getConnection("JDBC:sqlite:PasswordDatabase.sqlite");
System.out.println("Connection established...");
} catch (Exception e) {
System.out.println("Error: " + " " + e.getMessage());
}
}
public void insertSQLB1() { // Inserts the application name into the database *not working, inserts only a blank
// row*
try {
getConnection();
String query = "INSERT INTO passwords (Anwendung) VALUES (?)";
PreparedStatement stat1 = con1.prepareStatement(query);
stat1.setString(1, tf2.getText());
stat1.execute();
JOptionPane.showMessageDialog(null, "Data saved!");
con1.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
public void listPasswords() { // Gibt alle Passwörter aus der Datenbank aus und unterbricht dann die Verbindung
// zur
// DB
try {
getConnection();
this.stat2 = con2.createStatement();
ResultSet rs = stat1.executeQuery("SELECT * FROM passwords");
while (rs.next()) {
String password = rs.getString("Passwort");
String program = rs.getString("Anwendung");
System.out.println("Passwort: " + password + " " + "Anwendung: " + program);
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
}
===
Or alternativly, remove the extends JFrameFunctionality from codeforButtons then change insertSQLB1 to accept a String as a parameter passed in.
public void insertSQLB1(String value) { // Inserts the application name into the database *not working, inserts only a blank
// row*
try {
getConnection();
String query = "INSERT INTO passwords (Anwendung) VALUES (?)";
PreparedStatement stat1 = con1.prepareStatement(query);
stat1.setString(1, value);
stat1.execute();
JOptionPane.showMessageDialog(null, "Data saved!");
con1.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
Then change the caller to
cfBobj1.insertSQLB1(tf2.getText());
This way you are passing the value into the data management class and would achieve a better split between the interface layer and the data management layer.

How to fix one keyPressed delayed in java swing?

I am trying to developing auto suggest Textfield. When i am typing in Textfield it is delay one key and suggest one key late **
When i am typing aaa it is querying as 'aa' only and suggest according to that in list.When i am pressing any key after aaa (extra key Press) then it will querying as aaa
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(10, 11, 414, 239);
frame.getContentPane().add(panel);
panel.setLayout(null);
textField = new JTextField();
textField.addKeyListener(new KeyAdapter() {
#Override
public void keyPressed(KeyEvent arg0) {
try {
addListItem();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
textField.setBounds(71, 24, 86, 20);
panel.add(textField);
textField.setColumns(10);
list = new JList<String>();
list.setBounds(71, 55, 86, 97);
list.setVisible(false);
list.getScrollableTracksViewportHeight();
panel.add(list);
}
public void addListItem() throws Exception {
list.setVisible(true);
Class.forName("com.mysql.jdbc.Driver");
c = DriverManager.getConnection("jdbc:mysql://localhost:3306/studentdemo", "root", "root");
ps = c.prepareStatement(
"SELECT stud_name FROM student_info where stud_name like '" + textField.getText().trim() + "%' ");
ResultSet s = ps.executeQuery();
model = new DefaultListModel<String>();
while (s.next()) {
model.addElement(s.getString("stud_name"));
System.out.println(s.getString("stud_name"));
}
list.setModel(model);
}
Use keyReleased instead of keyPressed method of KeyAdapter class.

How to save Data to mysql [duplicate]

This question already has answers here:
Connect Java to a MySQL database
(14 answers)
Closed 6 years ago.
I ve been working on a phonebook program on eclipse java
but and idk how to save information from a textfield to mysql and then be able use it in search, such as writing the name and finding all the info of the specific contact
I also want to save it to my sql
thats my code:
public class Phone {
private JFrame frame;
private JTextField firstfield;
private JTextField phonefield;
private JTextField emailfield;
private JTextField lastfield;
private JPanel MainScreen;
private JPanel newcontact;
private JPanel searchscreen;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Phone window = new Phone();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Phone() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new CardLayout(0, 0));
final JPanel MainScreen = new JPanel();
frame.getContentPane().add(MainScreen, "name_6058038854379");
MainScreen.setLayout(null);
MainScreen.setVisible(true);
final JPanel newcontact = new JPanel();
newcontact.setLayout(null);
frame.getContentPane().add(newcontact, "name_791613670731");
newcontact.setVisible(false);
final JPanel searchscreen = new JPanel();
frame.getContentPane().add(searchscreen, "name_6068807854350");
searchscreen.setVisible(false);
JButton newrecord = new JButton("New Record");
newrecord.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
newcontact.setVisible(true);
MainScreen.setVisible(false);
}
});
newrecord.setBounds(63, 99, 116, 52);
MainScreen.add(newrecord);
JButton Search = new JButton("Search");
Search.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
searchscreen.setVisible(true);
newcontact.setVisible(false);
}
});
Search.setBounds(243, 99, 102, 52);
MainScreen.add(Search);
JLabel myphonebook = new JLabel(" My Phonebook");
myphonebook.setBounds(162, 44, 102, 14);
MainScreen.add(myphonebook);
JLabel first = new JLabel("First Name:");
first.setBounds(118, 83, 66, 14);
newcontact.add(first);
JLabel last = new JLabel("Last Name:");
last.setBounds(118, 108, 66, 14);
newcontact.add(last);
JLabel Phone = new JLabel("Phone:");
Phone.setBounds(118, 143, 66, 14);
newcontact.add(Phone);
JLabel Emailadress = new JLabel("Email Adress:");
Emailadress.setBounds(118, 180, 66, 14);
newcontact.add(Emailadress);
firstfield = new JTextField();
firstfield.setColumns(10);
firstfield.setBounds(220, 80, 86, 20);
newcontact.add(firstfield);
lastfield = new JTextField();
lastfield.setColumns(10);
lastfield.setBounds(220, 108, 86, 20);
newcontact.add(lastfield);
phonefield = new JTextField();
phonefield.setColumns(10);
phonefield.setBounds(220, 140, 86, 20);
newcontact.add(phonefield);
emailfield = new JTextField();
emailfield.setColumns(10);
emailfield.setBounds(220, 177, 86, 20);
newcontact.add(emailfield);
JLabel lblNewContact = new JLabel("New Contact");
lblNewContact.setBounds(166, 30, 86, 14);
newcontact.add(lblNewContact);
JButton Save = new JButton("Save");
Save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String firstname=firstfield.getText();
String lastname=lastfield.getText();
String phonenumber=phonefield.getText();
String emailadress=emailfield.getText();
}
});
Save.setBounds(81, 232, 89, 23);
newcontact.add(Save);
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newcontact.setVisible(false);
MainScreen.setVisible(true);
}
});
cancel.setBounds(283, 232, 89, 23);
newcontact.add(cancel);
JPanel panel_1 = new JPanel();
frame.getContentPane().add(panel_1, "name_6081212161880");
}
}
Write this into your savecommand. You should only create a database an table and change the uppercased words.
try
{
// create a mysql database connection
String myDriver = "org.gjt.mm.mysql.Driver";
String myUrl = "jdbc:mysql://LOCATION/DATABASE";
Class.forName(myDriver);
Connection conn = DriverManager.getConnection(myUrl, "root", "");
// create a sql date object so we can use it in our INSERT statement
Calendar calendar = Calendar.getInstance();
java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime());
// the mysql insert statement
String query = " insert into TABLE (first_name, last_name, phone_number, email_adress)"
+ " values (?, ?, ?, ?)";
// create the mysql insert preparedstatement
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString (1, firstname);
preparedStmt.setString (2, lastname);
preparedStmt.setString (3, phonenumber);
preparedStmt.setString (4, emailadress);
// execute the preparedstatement
preparedStmt.execute();
conn.close();
}
catch (Exception e)
{
System.err.println("Got an exception!");
System.err.println(e.getMessage());
}
}

How do I insert Java variables into a MySQL query?

I am trying to create a register system for my MySQL database. I have a Java form that I created, in which the user inserts a username, password, and their email. I take that infromation and store it in a variable accordingly. The MySQL connection code works, and it does insert a new row, but the information is blank on the MySQL page. Am I doing someting wrong?
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField textField;
private JPasswordField passwordField;
private static Connection con;
private static PreparedStatement st;
private static int rs;
String username;
String password;
String email;
private JTextField textField_1;
String insertTableSQL = "INSERT INTO `users`" + "(username, password, email) VALUES" + "(?,?,?)";
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
setResizable(false);
setTitle("Barrage : Login / Register");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 350, 200);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("Username: ");
lblNewLabel.setBounds(60, 25, 68, 20);
contentPane.add(lblNewLabel);
JLabel lblPassword = new JLabel("Password: ");
lblPassword.setBounds(60, 59, 68, 20);
contentPane.add(lblPassword);
textField = new JTextField();
username = textField.getText();
textField.setBounds(138, 22, 120, 26);
contentPane.add(textField);
textField.setColumns(10);
passwordField = new JPasswordField();
password = passwordField.getText();
passwordField.setBounds(138, 56, 120, 26);
contentPane.add(passwordField);
JButton btnRegister = new JButton("Register");
btnRegister.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/barrage", "root", "");
st = con.prepareStatement(insertTableSQL);
st.setString(1, username);
st.setString(2, password);
st.setString(3, email);
st.executeUpdate();
} catch(Exception e) {
e.printStackTrace();
}
}
});
btnRegister.setBounds(119, 138, 89, 23);
contentPane.add(btnRegister);
JLabel lblEmail = new JLabel("E-mail: ");
lblEmail.setBounds(60, 96, 68, 20);
contentPane.add(lblEmail);
textField_1 = new JTextField();
email = textField_1.getText();
textField_1.setBounds(138, 93, 120, 26);
contentPane.add(textField_1);
textField_1.setColumns(10);
}
}
Don't do it this way. This is a security vulnerability called a SQL Injection. Instead use a PreparedStatement with variable binding (eg: ?). Here is a tutorial.
As for why it's blank in the database (which is what I think you're saying), you're going to have to prove that the value of those variables are not blank with traditional debugging. IMO, if your tables were set up with the correct constraints (eg: not null) it wouldn't even let you insert in that invalid state in the first place.

Categories