我正在尝试创建一个允许用户将数据插入表中的程序。 这是我的代码:
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);
}
}
我还创建了另一个类来保存文本字段并从用户那里获取输入。我只为插入按钮添加了一个actionlistener for now.Here是类:
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);
}
}
当我运行第二个类并尝试将记录插入数据库时,我得到空指针异常。
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)
我不知道为什么,如果有人能提供帮助,那就太好了。
答案 0 :(得分:2)
如果您通过调用main(....)
中的DbInterface
方法启动该计划,则DbMethods
中的语句变量将为null
,如果您通过调用main(...)
启动它在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+"'"+....+")");
}
}
}
在DbInterface
课程中,您可以像这样调用insert(...)
方法:
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();
}
});
您应该考虑使用PreparedStatement
而不是Statement
,并且只创建一个与数据库的连接。