这是我第一个上规模的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();//关闭结果集
} }

最后要感谢同学的帮助~

Java 与 Mysql连接,并分页显示的更多相关文章

  1. 错误解决记录------------mysql连接本地数据库显示"can't get hostname for your address"

    mysql连接本地数据库遇到 can't get hostname for your address 不明原因的本地mysql数据库连接不上,总是显示can't get hostname for yo ...

  2. 让Java和MySQL连接起来

    Java 连接 MySQL 需要驱动包,可以下载菜鸟教程提供的 jar 包:http://static.runoob.com/download/mysql-connector-java-5.1.39- ...

  3. PHP+MySQL Smarty简单分页显示示例

    一.分页程序的原理 分页程序有两个非常重要的参数:每页显示几条记录($pagesize)和当前是第几页($page). 有了这两个参数就可以很方便的写出分页程序,我们以MySql数据库作为数据源,在m ...

  4. appfog java jdbc mysql连接

    本来用得好好的openshift被墙了,无奈只能找过一个免费的空间.同学推荐appfog,appfog的确是一个很好用的空间,支持几乎所有主流的技术.我自己喜欢写点java,刚好我就开始使用了.app ...

  5. java与mysql连接

    package DBHelper; import java.sql.*; public class Demo { public static void main(String[] args) { St ...

  6. java中对list进行分页显示数据到页面

    http://blog.csdn.net/Tang_Mr/article/details/76212184#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2 ...

  7. 基于MySQl的分页显示

    <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.ResultSet ...

  8. 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

             分页查询信息       使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...

  9. java web 简单的分页显示

    题外话:该分页显示是用 “表示层-控制层-DAO层-数据库”的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指 ...

随机推荐

  1. vue中模块局部刷新

    父组件: 一. 父组件中引入子组件           data中定义变量 二. 定义provide函数 三.写reload方法 需要刷新的那个子组件: 一.引入                   ...

  2. CustomPlot 在Qt下 鼠标点击曲线 显示当前坐标

    此次记录主要是为了下次使用时能回忆起来才做得笔记,若有需改进的地方,请不吝珠玉. widget.cpp #include "widget.h" #include "ui_ ...

  3. 如果连这10个Python缩写都不知道,那你一定是Python新手

    简介 对于许多开始学习编程的人来说,Python已经成为他们的首选.Python有非常直观的语法和支持动态类型的灵活性.此外,它是一种解释语言,这使得使用交互式控制台进行学习成为可能.基本上,我们只需 ...

  4. application.yml使用@符合问题:'@' that cannot start any token. (Do not use @ for indentation)

    在application配置文件中使用@出现异常: Exception in thread "main" while scanning for the next tokenfoun ...

  5. git使用-分支管理

    1.查看分支 git branch 2.创建分支 git branch name 3.切换分支 git checkout name 4.合并分支上的内容到master分支 切换到master分支上 g ...

  6. 微信小程序开发着工具获取和更新newticket

    newticket是微信开发者工具和微信后台交互的凭证.大多数工具的操作都是需要newticket. 如何获取newticket? 打开开发者工具,依次点击菜单设置->通用设置->代理,使 ...

  7. Kafka2.6.0发布——性能大幅提升

    近日Kafka2.6版本发布,距离2.5.0发布只过去了不到四个月的时间. Kafka 2.6.0包含许多重要的新功能.以下是一些重要更改的摘要: 默认情况下,已为Java 11或更高版本启用TLSv ...

  8. Manacher(马拉车)算法(jekyll迁移)

    layout: post title: Manacher(马拉车)算法 date: 2019-09-07 author: xiepl1997 cover: 'assets/img/manacher.p ...

  9. 没有Qt Quick UI,没有 Qt Quick Project

    书上写的是File ‣ New File or Project ‣ Qt Quick Project ‣ Qt Quick UI 但实际上是File ‣ New File or Project ‣ O ...

  10. 【SDOI2009】 HH的项链 - 莫队

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...