我遇到了GUI问题。当我点击JButton b1
时,JTextField text
中的文字为空时,它不会捕获异常。
查询仅在单击按钮时执行一次,如果再次单击则抛出异常并且查询未执行
代码:
public class A extends JFrame{
private JTextField text;
private JButton b1;
private JLabel l1;
private Connection conn;
private Statement state;
private ResultSet set;
String server = "jdbc:mysql://localhost";
String user="tim";
String pass="u";
//query enter in textfield | select * from universty.student where rollno=2
public A() throws ClassNotFoundException, SQLException{
super("Frame");
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(server,user,pass);
state = conn.createStatement();
getContentPane().setLayout(null);
text = new JTextField();
text.setBounds(35, 132, 346, 35);
getContentPane().add(text);
l1= new JLabel();
l1.setFont(new Font("Tahoma", Font.PLAIN, 22));
l1.setBounds(35, 305, 384, 27);
getContentPane().add(l1);
b1 = new JButton("Submit");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
String query = text.getText();
set = state.executeQuery(query);
set.next();
String answer = set.getString(2);
l1.setText(answer);
}
catch (Exception e){
JOptionPane.showMessageDialog( null,
e.getMessage(), "Database error",
JOptionPane.ERROR_MESSAGE );
return;
}
finally{
try{
set.close();
state.close();
conn.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}});
b1.setBounds(132, 178, 129, 35);
getContentPane().add(b1);
setSize(450,450);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
}
主要方法:
public class Main {
public static void main(String args[]) throws ClassNotFoundException, SQLException{
A obj = new A();
}
}
答案 0 :(得分:2)
您应该在:
中打开和关闭数据库连接actionPerformed()
因为当你调用构造函数时,它会打开数据库连接并再次关闭它。当您单击数据库连接已再次关闭时
public void actionPerformed(ActionEvent arg0) {
conn = DriverManager.getConnection(server,user,pass);
state = conn.createStatement();
//do query here
set.close();
state.close()
conn.close();
}
答案 1 :(得分:0)
在第一次点击结束时,您将使用以下语句关闭所有内容。
finally{
try{
set.close();
state.close();
conn.close();
这就是原因。
<强> __ UPDATE __ 强>
我被要求提供解决方案。实际上我通过指出问题给出了一半的解决方案。但是,让我详细说明,因为有人问我。
简单的解决方案不是关闭连接或声明或其他任何东西。但这将是一个糟糕的解决方案,因为不必要的资源可以保持活跃。没必要。
我不知道你的申请。所以我不能给你一个确切的答案,而是,我可以给你一些指导,并帮助你自己找到正确的答案。
只要您需要,就可以保留资源。一旦你完成它们就立即摆脱它们。对于这种情况,如果需要用户单击该按钮并在数据库中进行更改,则不要关闭连接等,而是重用它们。如果它是一个多页面应用程序,您可以在用户移动到另一个页面时关闭这些资源。 (或活动,如果它是一个移动应用程序)。
我希望它有意义=]
答案 2 :(得分:0)
我不确定您的代码的用途,但您应该尝试将您的视图逻辑与业务逻辑分开。同时允许用户从文本框中运行SQL并提交按钮听起来很危险,但如果这真的是你想要做的,这里有一个你可以使用的实现。请注意,由于您希望执行查询的方式,DAO不是真正的DAO
public class A extends JFrame {
private final JTextField text;
private final JButton b1;
private final JLabel l1;
private AService service;
public A() {
super("Frame");
service = new AServiceImpl(new ADAOJDBCImpl());
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
text = new JTextField();
text.setBounds(35, 132, 346, 35);
getContentPane().add(text);
l1= new JLabel();
l1.setFont(new Font("Tahoma", Font.PLAIN, 22));
l1.setBounds(35, 305, 384, 27);
getContentPane().add(l1);
b1 = new JButton("Submit");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String query = text.getText();
try {
String answer = service.executeQuery(query);
l1.setText(answer);
} catch (SQLException e){
JOptionPane.showMessageDialog( null,
e.getMessage(), "Database error",
JOptionPane.ERROR_MESSAGE );
return;
}
}});
b1.setBounds(132, 178, 129, 35);
getContentPane().add(b1);
setSize(450,450);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
pack();
setVisible(true);
}
}
public interface AService {
public String executeQuery(String query) throws SQLException;
}
public class AServiceImpl implements AService {
private ADAO dao;
public AServiceImpl(ADAO dao) {
this.dao = doa;
}
@Override
public String executeQuery(String query) throws SQLException {
return dao.executeQuery();
}
}
/**
* Note usually a DAO is specfically for accessing data, NOT
* for executing User defined queries from a GUI text box
* so it would usually have methods such as add, find, delete, update etc.
*/
public interface ADAO {
public String executeQuery(String query) throws SQLException;
}
public class ADAOJDBCImpl implements ADAO {
@Override
public String executeQuery(String query) throws SQLException {
String server = "jdbc:mysql://localhost";
String user="tim";
String pass="u";
String answer = "":
try (Connection conn = DriverManager.getConnection(server,user,pass);
Statement state = conn.createStatement();
ResultSet set = state.executeQuery(query);) {
if(set.next()) {
answer = set.getString(2);
}
}
return answer;
}
}