如何在java中从文本字段向sql表插入数据
我正在尝试创建一个程序,允许用户将数据插入表中。 这是我的密码:如何在java中从文本字段向sql表插入数据,java,sql,database,swing,nullpointerexception,Java,Sql,Database,Swing,Nullpointerexception,我正在尝试创建一个程序,允许用户将数据插入表中。 这是我的密码: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.JOptionPane; public class DbMethods { static St
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
public class DbMethods {
static String query="";
static Statement statement = null;
public static void main(String[] args) throws SQLException, ClassNotFoundException{
// throws SQLException, ClassNotFoundException {
// Load the JDBC driver
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded");
// Establish a connection
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost/javabook","root","");
System.out.println("Database connected");
// Create a statement
statement = (Statement)connection.createStatement();
}
public static void insert() throws SQLException{
if(!DbInterface.ID.getText().equals("")){
statement.executeUpdate("INSERT INTO personnel(ID, LastName, FirstName, mi, Address, City, State, Telephone)" + "VALUES('" + DbInterface.ID.getText() + "','" + DbInterface.lastName.getText() + "','" + DbInterface.firstName.getText() + "','" + DbInterface.mi.getText() + "','" + DbInterface.address.getText() + "','" + DbInterface.city.getText() + "','" + DbInterface.state.getText() + "','" + DbInterface.tel.getText() + "')");
}
else
JOptionPane.showMessageDialog(DbInterface.contentPane, "The ID cannot be null!", "Invalid info", JOptionPane.WARNING_MESSAGE);
}
}
我还创建了另一个类来保存textfields并从用户处获取输入。我现在只为insert按钮添加了一个actionlistener。下面是该类:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class DbInterface extends JFrame {
//text_fields
static JPanel contentPane;
static JTextField ID;
static JTextField lastName;
static JTextField firstName;
static JTextField mi;
static JTextField address;
static JTextField city;
static JTextField state;
static JTextField tel;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DbInterface frame = new DbInterface();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public DbInterface() {
setTitle("Personnel Table");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 656, 422);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout(null);
JLabel lblPersonel = new JLabel("Personnel Information");
lblPersonel.setBounds(12, 0, 126, 16);
panel.add(lblPersonel);
JLabel lblId = new JLabel("ID");
lblId.setBounds(12, 29, 56, 16);
panel.add(lblId);
ID = new JTextField();
ID.setBounds(80, 26, 204, 22);
panel.add(ID);
ID.setColumns(10);
JLabel lblLastName = new JLabel("Last Name");
lblLastName.setBounds(12, 68, 78, 16);
panel.add(lblLastName);
lastName = new JTextField();
lastName.setBounds(79, 65, 171, 22);
panel.add(lastName);
lastName.setColumns(10);
JLabel lblFirstName = new JLabel("First Name");
lblFirstName.setBounds(262, 68, 78, 16);
panel.add(lblFirstName);
firstName = new JTextField();
firstName.setBounds(332, 65, 171, 22);
panel.add(firstName);
firstName.setColumns(10);
JLabel lblMi = new JLabel("mi");
lblMi.setBounds(529, 68, 56, 16);
panel.add(lblMi);
mi = new JTextField();
mi.setBounds(560, 65, 56, 22);
panel.add(mi);
mi.setColumns(10);
JLabel lblAdress = new JLabel("Address");
lblAdress.setBounds(12, 116, 56, 16);
panel.add(lblAdress);
address = new JTextField();
address.setBounds(79, 113, 424, 22);
panel.add(address);
address.setColumns(10);
JLabel lblCity = new JLabel("City");
lblCity.setBounds(12, 158, 56, 16);
panel.add(lblCity);
city = new JTextField();
city.setBounds(79, 155, 216, 22);
panel.add(city);
city.setColumns(10);
JLabel lblState = new JLabel("State");
lblState.setBounds(332, 158, 56, 16);
panel.add(lblState);
state = new JTextField();
state.setBounds(387, 155, 116, 22);
panel.add(state);
state.setColumns(10);
JLabel lblTelephone = new JLabel("Telephone");
lblTelephone.setBounds(12, 204, 78, 16);
panel.add(lblTelephone);
tel = new JTextField();
tel.setBounds(80, 201, 423, 22);
panel.add(tel);
tel.setColumns(10);
JButton btnNewButton = new JButton("View");
btnNewButton.setBounds(80, 289, 97, 25);
panel.add(btnNewButton);
JButton btnNewButton_1 = new JButton("Insert");
btnNewButton_1.setBounds(187, 289, 97, 25);
panel.add(btnNewButton_1);
btnNewButton_1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
try {
DbMethods.insert();
} catch (SQLException e) {
e.printStackTrace();
}
}
});
JButton btnNewButton_2 = new JButton("Update");
btnNewButton_2.setBounds(291, 289, 97, 25);
panel.add(btnNewButton_2);
JButton btnNewButton_3 = new JButton("Clear");
btnNewButton_3.setBounds(400, 289, 97, 25);
panel.add(btnNewButton_3);
}
}
当我运行第二个类并尝试将一条记录插入数据库时,我得到了null指针异常
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at DbMethods.insert(DbMethods.java:45)
at DbInterface$2.actionPerformed(DbInterface.java:162)
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)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
我不知道为什么,如果有人能帮忙,那就太好了。如果您通过调用
DbInterface
中的main(…)
方法启动程序,如果您通过调用main(…)启动程序,DbMethods
中的语句变量将为null
DbMethods
中的DbInterface
中的所有变量将null
另外,不要在EDT上执行数据库操作
您可以将DbMethods
类修改为如下内容:
public class DbMethods {
public void insert(String f1,String f2 ....){
if(f1.isEmpty()){
JOptionPane.showMessageDialog(DbInterface.contentPane, "The ID cannot be null!", "Invalid info", JOptionPane.WARNING_MESSAGE);
}else{
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/javabook","root","");
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO personnel(ID, LastName, FirstName, mi, Address, City, State, Telephone) VALUES('"+f1+"','"+f2+"'"+....+")");
}
}
}
btnNewButton_1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
new Thread(new Runnable(){
public void run(){
new DbMethods().insert(id.getText(), lastName.getText(),....);
}
}).start();
}
});
在DbInterface
类中,可以调用insert(…)
方法,如下所示:
public class DbMethods {
public void insert(String f1,String f2 ....){
if(f1.isEmpty()){
JOptionPane.showMessageDialog(DbInterface.contentPane, "The ID cannot be null!", "Invalid info", JOptionPane.WARNING_MESSAGE);
}else{
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/javabook","root","");
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO personnel(ID, LastName, FirstName, mi, Address, City, State, Telephone) VALUES('"+f1+"','"+f2+"'"+....+")");
}
}
}
btnNewButton_1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
new Thread(new Runnable(){
public void run(){
new DbMethods().insert(id.getText(), lastName.getText(),....);
}
}).start();
}
});
您应该考虑使用<代码> PraveRealds< /C> >而不是<代码>语句>代码>,只创建一个与数据库的连接。< /P>如果您在解决Null PoExtExchange(NPE)上做了一些搜索,您将知道,我们需要的最重要的信息是异常的相关stacktrace和导致异常的行的一些标识,stacktrace会告诉您一些信息,不幸的是,您在这里没有发布任何一条信息。请修复此问题,以便我们能够帮助您。我编辑了问题并添加了有关错误的所有信息,我希望这会有所帮助。如果您通过调用
DbInterface
中的main(..)
方法启动程序,DbMethods
中的语句
变量将null
,如果您通过调用DbMethods
中的main(…)
启动它,DbInterface
中的所有变量将null
使用调试器如何?这表明您可能是在“本末倒置”,即试图学习Java的一个复杂角落,在学习Java的基础知识以及如何使用Java进行面向对象编程之前,这里介绍了Swing GUI编程与数据库编程的结合。如果你想避免很多挫折,从一开始就开始,先学习基础知识。