一个通用的SQL客户程序

能够与任何关系数据库建立连接,并且交互地执行SQL命令,该客户程序能够连接任何jdbc数据源,也可以提交要执行的sqlSELECT命令和非SELECT命令。对于SELECT查询命令,显示执行结果;对于非select命令,显示执行状态。(我的电脑上只有mysql,所以只测了mysql,没有问题)

如下图所示:

代码实现:

  1 import java.awt.*;
  2 import java.awt.event.ActionEvent;
  3 import java.awt.event.ActionListener;
  4 import java.sql.*;
  5 import javax.swing.*;
  6 import javax.swing.border.*;
  7 
  8 
  9 public class SQLClient extends JApplet{
 10     //连接数据库
 11     private Connection connection;
 12     //执行sql命令
 13     private Statement statement;
 14     //输入sql命令 的文本框
 15     private JTextArea jtaSQLCommand=new JTextArea();
 16     //显示sql命令的执行结果的文本框
 17     private JTextArea jtaSQLResult=new JTextArea();
 18     //连接数据库的JDBC相关信息,包括用户名,密码,数据库url,数据库驱动器
 19     JTextField jtfUserName=new JTextField();
 20     JPasswordField jpfPassword=new JPasswordField();
 21     JComboBox jcboURL=new JComboBox(new String[]{
 22             "jdbc:mysql://localhost/world",
 23             "jdbc:odbc:exampleMDBDataSource",
 24             "jdbc:oracle:thin:@liang.armstrong.edu:1521:orcl"
 25     });
 26     JComboBox jcboDriver = new JComboBox(new String[]{
 27             "com.mysql.jdbc.Driver",
 28             "sun.jdbc.odbc.jdbcOdbcDriver",
 29             "oracle.jdbc.driver.OracleDriver"
 30     });
 31     
 32     JButton jbtExecuteSQL =new JButton("Execute SQL Command");
 33     JButton jbtClearSQLCommand=new JButton("Clear");
 34     JButton jbtConnectDB1=new JButton("Connect to DataBase");
 35     JButton jbtClearSQLResult=new JButton("Clear Result");
 36     
 37     //create titled borders
 38     Border titledBorder1=new TitledBorder("Enter an SQL Command");
 39     Border titledBorder2=new TitledBorder("SQL Execute Result");
 40     Border titledBorder3=new TitledBorder("Enter Database Information");
 41     
 42     JLabel jlblConnectionStatus=new JLabel("No connection now");
 43     
 44     public void init(){
 45         JScrollPane jScrollPane1=new JScrollPane(jtaSQLCommand);
 46         jScrollPane1.setBorder(titledBorder1);
 47         JScrollPane jScrollPane2=new JScrollPane(jtaSQLResult);
 48         jScrollPane2.setBorder(titledBorder2);
 49         
 50         JPanel jPanel1=new JPanel(new FlowLayout(FlowLayout.RIGHT));
 51         jPanel1.add(jbtClearSQLCommand);
 52         jPanel1.add(jbtExecuteSQL);
 53         
 54         JPanel jPanel2=new JPanel();
 55         jPanel2.setLayout(new BorderLayout());
 56         jPanel2.add(jScrollPane1,BorderLayout.CENTER);
 57         jPanel2.add(jPanel1,BorderLayout.SOUTH);
 58         jPanel2.setPreferredSize(new Dimension(100,100));
 59         
 60         JPanel jPanel3=new JPanel();
 61         jPanel3.setLayout(new BorderLayout());
 62         jPanel3.add(jlblConnectionStatus,BorderLayout.CENTER);
 63         jPanel3.add(jbtConnectDB1,BorderLayout.EAST);
 64         
 65         JPanel jPanel4=new JPanel();
 66         jPanel4.setLayout(new GridLayout(4,1,10,5));
 67         jPanel4.add(jcboDriver);
 68         jPanel4.add(jcboURL);
 69         jPanel4.add(jtfUserName);
 70         jPanel4.add(jpfPassword);
 71         
 72         JPanel jPanel5=new JPanel();
 73         jPanel5.setLayout(new GridLayout(4,1,10,5));
 74         jPanel5.add(new JLabel("JDBC Driver"));
 75         jPanel5.add(new JLabel("Database URL"));
 76         jPanel5.add(new JLabel("UserName"));
 77         jPanel5.add(new JLabel("Password"));
 78         
 79         JPanel jPanel6 = new JPanel();
 80         jPanel6.setLayout(new BorderLayout());
 81         jPanel6.setBorder(titledBorder3);
 82         jPanel6.add(jPanel4,BorderLayout.CENTER);
 83         jPanel6.add(jPanel5,BorderLayout.WEST);
 84         
 85         JPanel jPanel7 = new JPanel();
 86         jPanel7.setLayout(new BorderLayout());
 87         jPanel7.add(jPanel3,BorderLayout.SOUTH);
 88         jPanel7.add(jPanel6,BorderLayout.CENTER);
 89         
 90         JPanel jPanel8 = new JPanel();
 91         jPanel8.setLayout(new BorderLayout());
 92         jPanel8.add(jPanel2,BorderLayout.CENTER);
 93         jPanel8.add(jPanel7,BorderLayout.WEST);
 94         
 95         JPanel jPanel9=new JPanel(new FlowLayout(FlowLayout.LEFT));
 96         jPanel9.add(jbtClearSQLCommand);
 97         
 98         jcboURL.setEditable(true);
 99         jcboDriver.setEditable(true);
100         
101         add(jPanel8,BorderLayout.NORTH);
102         add(jScrollPane2,BorderLayout.CENTER);
103         add(jPanel9,BorderLayout.SOUTH);
104         //点击execute按钮执行sql语句
105         jbtExecuteSQL.addActionListener(new ActionListener(){
106             public void actionPerformed(ActionEvent arg0) {
107                 executeSQL();
108             }
109         });
110         //连接数据库
111         jbtConnectDB1.addActionListener(new ActionListener(){
112             public void actionPerformed(ActionEvent e) {
113                 // TODO Auto-generated method stub
114                 connectToDB();
115             }
116         });
117         //中兴清除命令的
118         jbtClearSQLCommand.addActionListener(new ActionListener(){
119             public void actionPerformed(ActionEvent e) {
120                 jtaSQLCommand.setText(null);
121             }
122         });
123         
124         jbtClearSQLResult.addActionListener(new ActionListener(){
125             public void actionPerformed(ActionEvent e){
126                 jtaSQLResult.setText(null);
127             }
128         });
129     }
130     
131     private void connectToDB(){
132         String driver=(String)jcboDriver.getSelectedItem();
133         String url=(String)jcboURL.getSelectedItem();
134         String userName=jtfUserName.getText().trim();
135         String password=new String(jpfPassword.getPassword());
136         
137         //连接数据库
138         try{
139             Class.forName(driver);
140             connection=DriverManager.getConnection(url,userName,password);
141             jlblConnectionStatus.setText("Connected to "+url);
142         }catch(java.lang.Exception ex){
143             ex.printStackTrace();
144         }
145     }
146     
147     private void executeSQL(){
148         if(connection==null){
149             jtaSQLResult.setText("Please connect to a database first");
150             return;
151         }else{
152             String sqlCommands=jtaSQLCommand.getText().trim();
153             //trim返回字符串的副本,忽略前导空白和尾部空白。
154             String[] commands=sqlCommands.replace('\n', ' ').split(";");
155             
156             for(String aCommand: commands){
157                 if(aCommand.trim().toUpperCase().startsWith("SELECT")){
158                     //是否以前缀SELECT开始
159                     processSQLSelect(aCommand);
160                 }
161                 else{
162                     processSQLNonSelect(aCommand);
163                 }
164             }
165         }
166     }
167 //执行选择命令
168     private void processSQLSelect(String sqlCommand) {
169         
170         try{
171             statement = connection.createStatement();
172             ResultSet resultSet=statement.executeQuery(sqlCommand);
173             
174             int columnCount=resultSet.getMetaData().getColumnCount();
175             String row=" ";
176             for(int i=1;i<=columnCount;++i)
177                 row+=resultSet.getMetaData().getColumnName(i)+"\t";
178             
179             jtaSQLResult.append(row+"\n");
180             while(resultSet.next()){
181                 row=" ";
182                 for(int i=1;i<=columnCount;++i)
183                     row+=resultSet.getString(i)+"\t";
184                 jtaSQLResult.append(row+'\n');
185             }
186         }catch(SQLException ex){
187             jtaSQLResult.setText(ex.toString());
188         }
189     }
190     //执行非选择命令
191     private void processSQLNonSelect(String sqlCommand) {
192         try{
193             statement=connection.createStatement();
194             statement.executeUpdate(sqlCommand);
195             jtaSQLResult.setText("SQL command excuted");
196         }catch(SQLException ex){
197             jtaSQLResult.setText(ex.toString());
198         }
199     }
200     
201 }
原文地址:https://www.cnblogs.com/redlight/p/2592194.html