第一页 netbeans连接access

来源:互联网 发布:mysql小于号写法 编辑:程序博客网 时间:2024/04/27 05:46

           最近想来想去,想自己在代码这一块那方面学得最好,想了很久觉得SQL数据库这块我比较容易上手,而我现在的目标是先做一个系统。做系统离不开数据库,于是我就从数据库这模块开始。我想学习技术本是一件很容易让人烦躁的事,所以我觉得最好从自己拿手的那块开始,这样你才有做下去的欲望。

运行结果:

 

代码如下:

/*
 * AccessQuery.java
 *
 * Created on 2007年9月14日, 下午4:07
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package accessquery;

/**
 *使用JDBC-ODBC桥连接数据库
 * 1.注册数据库驱动程序
 * Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
 * 2.连接数据库
 *    connection = DriverManager.getConnection(
            url, username, password );
 * @author cai.cn
 */
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class AccessQuery extends JFrame {

   //数据库变量定义
   private Connection connection;
   private Statement statement;
   private ResultSet resultSet;
   private ResultSetMetaData rsMetaData;

   //GUI变量定义
   private JTable table;
   private JTextArea inputQuery;
   private JButton submitQuery;
   
   public AccessQuery() { 
      //Form的标题 
      super( "输入SQL语句,按查询按钮查看结果。" );
      //url中指定ODBC中设置的DSN名称
      String url = "jdbc:odbc:accesstxl";
      String username = "";
      String password = "";
      //加载驱动程序以连接数据库
      try {
         Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
         connection = DriverManager.getConnection(
            url, username, password );
      }
      //捕获加载驱动程序异常
      catch ( ClassNotFoundException cnfex ) {
         System.err.println(
            "装载 JDBC/ODBC 驱动程序失败。" );
         cnfex.printStackTrace();
         System.exit( 1 );  // terminate program
      }
      //捕获连接数据库异常
      catch ( SQLException sqlex ) {
         System.err.println( "无法连接数据库" );
         sqlex.printStackTrace();
         System.exit( 1 );  // terminate program
      }
      //如果数据库连接成功,则建立GUI
      //SQL语句
      String test="SELECT * FROM Tbltxl";
      inputQuery = new JTextArea( test, 4, 30 );
      submitQuery = new JButton( "查  询" );
      //Button事件
      submitQuery.addActionListener(
         new ActionListener() {
            public void actionPerformed( ActionEvent e )
            {
               getTable();
            }
         }  
      );

      JPanel topPanel = new JPanel();
      topPanel.setLayout( new BorderLayout() );
      //将"输入查询"编辑框布置到 "CENTER"
//      JScrollPane滚动条
      topPanel.add( new JScrollPane( inputQuery), BorderLayout.CENTER );
      //将"提交查询"按钮布置到 "SOUTH"
      topPanel.add( submitQuery, BorderLayout.SOUTH );
      table = new JTable();
      Container c = getContentPane();
      c.setLayout( new BorderLayout() );
      //将"topPanel"编辑框布置到 "NORTH"
      c.add( topPanel, BorderLayout.NORTH );
      //将"table"编辑框布置到 "CENTER"
      c.add( table, BorderLayout.CENTER );     
      getTable();
      setSize( 500, 300 );
      //显示Form
      this.setVisible(true);
   }

   private void getTable() {
      try {
        //执行SQL语句
         String query = inputQuery.getText();
//         创建一个 Statement 对象来将 SQL 语句发送到数据库。
         statement = connection.createStatement();
//         Statement.executeQuery(String sql) ,String sql为执行语句query
//           执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
       
         resultSet = statement.executeQuery( query );        
         //在表格中显示查询结果
         displayResultSet( resultSet );
      }
      catch ( SQLException sqlex ) {
         sqlex.printStackTrace();
      }
   }

   private void displayResultSet( ResultSet rs ) throws SQLException {
      //定位到达第一条记录
      boolean moreRecords = rs.next(); 
      //如果没有记录,则提示一条消息
      if ( ! moreRecords ) {
//     JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
         JOptionPane.showMessageDialog( this,
            "结果集中无记录" );
         setTitle( "无记录显示" );
         return;
      }
//      定义列与行容器
      Vector columnHeads = new Vector();
      Vector rows = new Vector();
      try {
         //获取字段的名称
//          ResultSetMetaData可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。说明就是获取表格的列
//          Column列 Row行
         ResultSetMetaData rsmd = rs.getMetaData();
//    getColumnCount()列的总数    
         for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
//             addElement(E obj)
//          将指定的组件添加到此向量的末尾,将其大小增加 1
            columnHeads.addElement( rsmd.getColumnName( i ) );
         //获取记录集
         do {
            rows.addElement( getNextRow( rs, rsmd ) );
         } while ( rs.next() );
         //在表格中显示查询结果
         table = new JTable( rows, columnHeads );
//         给表格添加滚动条
         JScrollPane scroller = new JScrollPane( table );
// ??不明白为什么又有写这句话   Container c = getContentPane();     
         Container c = getContentPane();
         c.remove(1);
//         把装有滚动条的表格添加到中间
         c.add( scroller, BorderLayout.CENTER );
         //刷新Table
         c.validate();
      }
      catch ( SQLException sqlex ) {
         sqlex.printStackTrace();
      }
   }

//??不明白是干什么的
   private Vector getNextRow( ResultSet rs, ResultSetMetaData rsmd ) throws SQLException {
      Vector currentRow = new Vector();
      for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
         currentRow.addElement( rs.getString( i ) );
      //返回一条记录  
      return currentRow;
   }
//关闭
   public void shutDown() {
      try {
        //断开数据库连接
         connection.close();
      }
      catch ( SQLException sqlex ) {
         System.err.println( "Unable to disconnect" );
         sqlex.printStackTrace();
      }
   }

   public static void main( String args[] ) {
//       定义一个 AccessQuery实例
      final AccessQuery app = new AccessQuery();
//      ??不明白为什么用窗口事件的侦听器接口 ,求讲解。。
      app.addWindowListener(
         new WindowAdapter() {
            public void windowClosing( WindowEvent e ) { 
               app.shutDown();
//               正常关闭
               System.exit( 0 );
            }
         }
      );
   }
}

 

原创粉丝点击