这是我第一个上规模的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();//关闭结果集
} }
最后要感谢同学的帮助~