1. 程式人生 > >Java 與 Mysql連線,並分頁顯示

Java 與 Mysql連線,並分頁顯示

這是我第一個上規模的Java專案,我們必須在一週內完成的作業,零基礎學習Java,網上收集了很多資料,逐漸對面向物件的思想有所瞭解,但還是半灌水,後期打算結合專案系統地學習一遍Java。老師佈置的任務主要有四個:1、實現Java與mysql連線,並利用JTable分頁顯示資料(即要有上一頁、下一頁等等),並匯入到Excel表格;2、Java實現兩臺計算機利用網路傳資料;3、編寫上位機、下位機實現收發資料的功能;4、結合2的網路功能以及3的上位機功能,實現對物體的控制。
這篇文章講的是問題1,實現Java與mysql的連線(為什麼要使用Java與mysql,還有Linux系統,老師給我們講得很清楚,主要是避免版權糾紛~(^_^)),這也是才剛完成的任務,具體的做法如下:

1、用到的類

建立了三個類StudentTable、WriteStudent、DataToExcel,分別實現的功能是初始化窗體並連線資料庫、查到的資料寫入到函式、匯出資料到外部Excel.

2、以下說明幾個關鍵方法:
a、public Object[][] getPageData()
獲取分頁資料,根據每頁顯示的條數,來計算出當前頁資料currentPageData。如果當前頁小於總頁數,那麼每頁數目應為pageCount,據此來寫滿表格;如果當前頁沒有資料了就回到前一頁。
b、public int getNextPage()
獲取下一頁,當前頁不是最後一頁時,點選下一頁就使當前頁+1。同樣,上一頁、第一頁、最後一頁的操作與此類似。
c、public void initTable()
初始化表格的函式,作用主要是從結果集rs中獲取資料,
並存入二維陣列Object[][]中,如果結果集沒有資料,那麼就用
空來替代資料集的每一行。
d、box.addActionListener(new ActionListener()
下拉框事件監聽,這個問題浪費了我很多時間。首先是忘記加入監聽;其次是監聽不能改變pageCount的值,於是解決方法是將初始化表格函式initTable()放入到監聽內,就ok了。
操作指南:

在主機上使用該程式沒問題,在其他計算機上使用該程式需要新增jxl.jar以及mysql-connector-java-5.1.26-bin.jar這兩個包。在Windows上的Eclipse中匯入檔案後有時候需要在專案下右擊滑鼠選擇Run as- - -Java Application執行程式。宣告:該程式未在Linux環境下除錯過。


圖1 操作介面

總結:

由於該專案是第一次Java程式設計,很多地方不懂 ,難免會出點小bug,我看了很多別人的程式碼,然後在自己的理解基礎上修改程式碼,實現全部功能,成了屬於自己的程式碼,站在巨人的肩膀上,也是有一定道理的。下面是整個程式碼的無私奉獻,希望能給像我這樣苦苦尋找的初學者一點點幫助~

1、類StudentTable

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")


public class StudentTable extends JFrame implements ActionListener {
	private JScrollPane panel;
	private JButton next,previous,add,delete,export,first,last;
	private JLabel label1,label2;	//	1.顯示總頁數和當前頁數 2.每頁顯示數
	private JMenuBar bar;
	private JMenu menu1;
	private JMenu menu2;
	private JMenuItem item1;
	private JMenuItem item2;
	private JMenuItem item3;
	private JTable table;
	public int currentPage=1;		// 當前頁
	public int totalPage=0;			// 總頁數
	public int totalRowCount=0;		// 總行數
	public int pageCount;			// 每頁顯示數目	
	public int column=0;
	public int restCount;			// 最後一頁數目
	public Object[][] resultData;	// 結果集二維陣列
	
	/*宣告下拉選單資料*/
	String []array =  {"10","20","30","40","60","80"};
	JComboBox box = new JComboBox(array);
	
	/*JTable表資訊相關變數*/
	public List<WriteStudent> students=WriteStudent.students;
	public String[] columnNames={"序號","姓名","學號","成績","身份證號"};
	public DefaultTableModel model=null;
	
	/*
	 * 窗體及表的建立
	 */
	public StudentTable(){
		super("資料庫MySQL操作");		
		this.setSize(640,480);
		table=new JTable();
		box.setBounds(490, 15, 100, 20);
		label2 = new JLabel("每頁顯示條數:");
		label2.setBounds(400, 3, 120, 50);
		panel=new JScrollPane();
		panel.getViewport().add(table);
		panel.setBounds(42, 36, 550, 320);
		first = new JButton("第一頁");
		first.setBounds(34, 380, 90,30);
		previous=new JButton("上一頁");
		previous.setBounds(154,380, 90, 30);
		next=new JButton("下一頁");
		next.setBounds(274, 380, 90, 30);
		last = new JButton("最後一頁");
		last.setBounds(394, 380, 90, 30);
		export = new JButton("匯出");
		export.setBounds(514, 380, 90, 30);
		bar = new JMenuBar();
		bar.setBounds(0, 0, 400, 35);
		add=new JButton("新增");
		add.setBorderPainted(false);
		delete=new JButton("刪除");
		delete.setBorderPainted(false);
		menu1 = new JMenu("開始");
		menu2 = new JMenu("版權資訊");
		item1 = new JMenuItem("開啟Excel表格");
		item2 = new JMenuItem("退出程式");
		item3 = new JMenuItem("作者資訊");
		
		/*新增監聽*/
		previous.addActionListener(this);
		next.addActionListener(this);
		add.addActionListener(this);
		delete.addActionListener(this);
		export.addActionListener(this);
		first.addActionListener(this);
		last.addActionListener(this);
		
		label1=new JLabel();
		label1.setBounds(420, 400, 180, 60);
		bar.add(menu1);
		bar.add(menu2);
		bar.add(add);
		bar.add(delete);
		menu2.add(item3);
		menu1.add(item1);
		menu1.add(item2);
		this.getContentPane().setLayout(null);
		this.getContentPane().add(bar);
		this.getContentPane().add(box);
		this.getContentPane().add(label2);
		this.getContentPane().add(panel);
		this.getContentPane().add(previous);
		this.getContentPane().add(next);
		this.getContentPane().add(first);
		this.getContentPane().add(last);
		this.getContentPane().add(export);
		this.getContentPane().add(label1);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		
		/*從MySQL資料庫中獲取資料*/
		try{
			Class.forName("org.gjt.mm.mysql.Driver");
			Connection conn=DriverManager. getConnection("jdbc:mysql://localhost:3306/student","root", "rootroot");
			Statement stmt=conn.createStatement();		
			ResultSet rs=stmt.executeQuery("select * from mytable");
			ResultSetMetaData   metaData;
			metaData = rs. getMetaData();
			int number=metaData.getColumnCount();
			while(rs.next()){
				int id = rs.getInt("idMyTable");
				String name = rs.getString("myname");
				int number1 = rs.getInt("mynumber");
				int grade = rs.getInt("mygrade");
				int myid = rs.getInt("myID");
				WriteStudent s=new WriteStudent(id,name,number1,grade,myid);
				WriteStudent.students.add(s);
			}
		}
		catch (ClassNotFoundException ex) {
	        System.err.println("Cannot find the database driver classes.");
	        System.err.println(ex);
	       	}
		catch (SQLException ex) {
					String[] options3 ={"新建MyTable資料表","取消"};
					int strength3 = JOptionPane.showOptionDialog(null,"表MyTable不存在!", "資訊", JOptionPane.YES_OPTION,JOptionPane.INFORMATION_MESSAGE, null, options3, options3[0]);
					if(strength3 == javax.swing.JOptionPane.YES_OPTION){
						System.out.println("The Table not exsits.");
				}
				if(strength3 == javax.swing.JOptionPane.INFORMATION_MESSAGE){
					System.exit(0);
				}
			
	        }
		
		/**
		 * 事件監聽
		 */
		/*下拉選單事件監聽*/
		box.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				String Str=(String) box.getSelectedItem();
				 pageCount=Integer.parseInt(Str);
				 initTable();
				 System.out.println(pageCount);
				
			}
		});
		
		/*選單項事件監聽*/
		item3.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				JOptionPane.showMessageDialog(null, "物聯網1104\n李少軍\n0307110210", "作者資訊", JOptionPane.INFORMATION_MESSAGE);
			}
		});
		item1.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				try {
					Runtime.getRuntime().exec("cmd /c D:\\Mytable.xls /f");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		item2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
					 System.exit(0);
			
			}
		});
	}
	
	/**
	 * 獲取下一頁
	 */
	public int getNextPage(){
		if(this.currentPage!=this.totalPage){
			return ++currentPage;
		}
		return -1;
	}
	
	/**
	 * 獲取上一頁
	 */
	public int getPreviousPage(){
		if(this.currentPage!=1){
			return --currentPage;
		}
		return -1;
	}

	/**
	 * 獲取最後一頁
	 */
	public int getLastPage(){
		currentPage = totalPage;
		return currentPage;
	}
	
	/**
	 * 獲取第一頁
	 */
	public int getFirstPage(){
		currentPage = 1;
		return currentPage;
	}
	
	/**
	 * 獲取總頁數
	 */
	public int getTotolPage(){
		return this.totalPage;
	}
	
	/**
	 * 獲取當前頁
	 */
	public int getCurrentPage(){
		return this.currentPage;
	}
	
	/**
	 * 獲得原始資料集
	 * @param students
	 * @return
	 */
	public Object[][] getData(List<WriteStudent> students){
		if(students.size()>0){
			Object[][] data=new Object[students.size()][4];
			for(int i=0;i<students.size();i++){
				WriteStudent s=students.get(i);
				Object[] a={s.getId(),s.getName(),s.getnumber(),s.getgrade(),s.getID()};//把List**的資料賦給Object陣列
				data[i]=a;//把陣列的值賦給二維陣列的一行
			}
			return data;
		}
		return null;
	}
	
	/**
	 * 初始化結果集
	 * @param data
	 */
	public void initResultData(Object[][] data){
		if(data!=null){
			resultData=data;//總的結果集
			column=data[0].length;//表的列數
			totalRowCount=data.length;//表的長度
			totalPage=totalRowCount%pageCount==0?totalRowCount/pageCount:totalRowCount/pageCount+1;//結果集的總頁數
			restCount=totalRowCount%pageCount==0?pageCount:totalRowCount%pageCount;//最後一頁的資料數
			label1.setText("總共"+totalRowCount+"記錄|當前第"+currentPage+"頁");
		}
	}
	
	/**
	 * 獲取分頁資料
	 * @return
	 */	
	public Object[][] getPageData(){
		Object[][] currentPageData=new Object[pageCount][column];//構造每頁資料集
		if(this.getCurrentPage()<this.totalPage){//如果當前頁數小於總頁數,那麼每頁數目應該是規定的數pageCount
			for(int i=pageCount*(this.getCurrentPage()-1);i<pageCount*(this.getCurrentPage()-1)+pageCount;i++){
				for(int j=0;j<column;j++){
					//把結果集中對應每頁的每一行資料全部賦值給當前頁的每一行的每一列
					currentPageData[i%pageCount][j]=resultData[i][j];
				}
			}
		}else{
			//在動態改變資料結果集的時候,如果當前頁沒有資料了,則回到前一頁(一般針對最後一頁而言)
			if(pageCount*(this.getCurrentPage()-1)>=totalRowCount)this.currentPage--;
			for(int i=pageCount*(this.getCurrentPage()-1);i<pageCount*(this.getCurrentPage()-1)+restCount;i++){
				for(int j=0;j<column;j++){
					currentPageData[i%pageCount][j]=resultData[i][j];
				}
			}
		} 
		return currentPageData;
	}
	
	/**
	 * 初始化表格資料
	 */
	public void initTable(){
		Object[][] data=getData(students);
		if(data!=null){
			initResultData(data);
			model=new DefaultTableModel(getPageData(),columnNames); 
		}else{
			//如果結果集中沒有資料,那麼就用空來代替資料集中的每一行
			Object[][] nothing={{},{},{},{},{}};
			model=new DefaultTableModel(nothing,columnNames);
			totalRowCount=0;
		}
		table.setModel(model);
		table.setRowHeight(20);
		DefaultTableCellRenderer r=new DefaultTableCellRenderer();
		r.setHorizontalAlignment(JLabel.CENTER);
		table.setDefaultRenderer(Object.class, r);
	}
	
	/**
	 * 按鈕事件
	 */
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		//String ItemName = e.getActionCommand();
		JButton button=(JButton) e.getSource();
		if(button.equals(first)){
			int i=getFirstPage();
			if(i==-1)return;
		}
		if(button.equals(previous)){
			int i=getPreviousPage();
			if(i==-1)return;
		}
		if(button.equals(next)){
			int i=getNextPage();
			if(i==-1)return;
		}
		if(button.equals(last)){
			int i=getLastPage();
			if(i==-1)return;
		}
		if(button.equals(delete)){
			int i=table.getSelectedRow();
			if(i==-1)return ;
			Integer id=(Integer) table.getValueAt(i,0);
			if(id==null)return ;
			WriteStudent s=null;
			for(WriteStudent stu:WriteStudent.students){
				if(stu.getId().equals(id))
					s=stu;
			}
			int index=WriteStudent.students.indexOf(s);
			WriteStudent.students.remove(index);
			initTable();
			label1.setText("總共"+totalRowCount+"記錄|當前第"+currentPage+"頁");
			return;
		}
		if(button.equals(add)){
			Integer id=0;
			for(WriteStudent stu:WriteStudent.students){
				if(stu.getId()>id)id=stu.getId();
			}
			WriteStudent student=new WriteStudent(id+1,"Lynn",0307110222,145,31312577);
			WriteStudent.students.add(student);
			initTable();
			label1.setText("總共"+totalRowCount+"記錄|當前第"+currentPage+"頁");
			return;
		}
		if(button.equals(export)){
			try{
				Class.forName("org.gjt.mm.mysql.Driver");
			
			Connection conn=DriverManager. getConnection("jdbc:mysql://localhost:3306/student","root", "rootroot");
			Statement stmt=conn.createStatement();		
			ResultSet rs=stmt.executeQuery("select * from MyTable");
			DataToExcel excel= new  DataToExcel();
			File newFile = new File("D:\\MyTable.xls");
			excel.WriteExcel(newFile, rs);
			//System.out.println("HI");
			}
			catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		
		Object[][] currentPageData=new Object[pageCount][column];//構造每頁資料集
		if(this.getCurrentPage()<this.totalPage){//如果當前頁數小於總頁數,那麼每頁數目應該是規定的數pageCount
			for(int i=pageCount*(this.getCurrentPage()-1);i<pageCount*(this.getCurrentPage()-1)+pageCount;i++){
				for(int j=0;j<column;j++){
					//把結果集中對應每頁的每一行資料全部賦值給當前頁的每一行的每一列
					currentPageData[i%pageCount][j]=resultData[i][j];
				}
			}
		}else{
			//在動態改變資料結果集的時候,如果當前頁沒有資料了,則回到前一頁(一般針對最後一頁而言)
			if(pageCount*(this.getCurrentPage()-1)>=totalRowCount)this.currentPage--;
			for(int i=pageCount*(this.getCurrentPage()-1);i<pageCount*(this.getCurrentPage()-1)+restCount;i++){
				for(int j=0;j<column;j++){
					currentPageData[i%pageCount][j]=resultData[i][j];
				}
			}
		}
		
		DefaultTableModel model=new DefaultTableModel(currentPageData,columnNames);
		table.setModel(model);
		label1.setText("總共"+totalRowCount+"記錄|當前第"+currentPage+"頁");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
			// TODO Auto-generated method stub

			new StudentTable();
		}
}  

2、類WriteStudent
import java.util.ArrayList;
import java.util.List;

/*
 * 獲得表資訊
 */
public class WriteStudent {
	private Integer id;
	private String name;
	private int number1;
	private int grade;
	private int myid;

	public static List<WriteStudent> students=new ArrayList<WriteStudent>();

	public WriteStudent(){}

	public WriteStudent(Integer id,String name,int number1,int grade,int myid){
		super();
		this.id=id;
		this.name=name;
		this.number1=number1;
		this.grade=grade;
		this.myid=myid;
	}
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public int getnumber() {
		return number1;
	}
	
	public void getnumber(String number) {
		this.number1 = number1;
	}

	public int getgrade() {
		return grade;
	}
	
	public void getgrade(int grade) {
		this.grade = grade;
	}
	
	public int getID() {
		return myid;
	}
	
	public void setID(int myid) {
		this.myid = myid;
	}
} 

3、類DataToExcel
import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/* 主要是用來建立excel工作薄*/
public class DataToExcel {

 /**
  * 按照資料庫中查詢到的結果集建立一個新的工作薄,建議傳入引數為Resultset結果集
  * 
  * @param fileName 包含檔案的路徑以及檔名
  * @param rs
  * @throws Exception	
  */
 public void WriteExcel(File fileName,ResultSet rs) throws Exception{
  
  //建立一個新的工作薄,fileName 包含了檔名以及路徑。
  WritableWorkbook book = null;
  WritableSheet sheet = null;
  try {
	book = Workbook.createWorkbook(fileName);
	sheet = book.createSheet("sheet1", 0);//給工作薄新增一個工作表,命名為 sheet1
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  int i = 0;
  int j = 0;
  for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) 
  {
	  sheet.addCell(new Label(k, 0, rs.getMetaData().getColumnName(k + 1)));
  }
  while (rs.next()) {
   //演算法,依次新增資料庫中所有符合的資料到excel中
   for (int k = 0; k < rs.getMetaData().getColumnCount(); k++) {
	   sheet.addCell(new Label(k, j + i + 1, rs.getString(k + 1)));
   }
   i++;                                                                                                                                   
  }
  book.write();//寫入工作薄
  book.close();//關閉工作薄
  rs.close();//關閉結果集
 }
 

}
最後要感謝同學的幫助~