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();//关闭结果集
} }
最后要感谢同学的帮助~
Java 与 Mysql连接,并分页显示的更多相关文章
- 错误解决记录------------mysql连接本地数据库显示"can't get hostname for your address"
mysql连接本地数据库遇到 can't get hostname for your address 不明原因的本地mysql数据库连接不上,总是显示can't get hostname for yo ...
- 让Java和MySQL连接起来
Java 连接 MySQL 需要驱动包,可以下载菜鸟教程提供的 jar 包:http://static.runoob.com/download/mysql-connector-java-5.1.39- ...
- PHP+MySQL Smarty简单分页显示示例
一.分页程序的原理 分页程序有两个非常重要的参数:每页显示几条记录($pagesize)和当前是第几页($page). 有了这两个参数就可以很方便的写出分页程序,我们以MySql数据库作为数据源,在m ...
- appfog java jdbc mysql连接
本来用得好好的openshift被墙了,无奈只能找过一个免费的空间.同学推荐appfog,appfog的确是一个很好用的空间,支持几乎所有主流的技术.我自己喜欢写点java,刚好我就开始使用了.app ...
- java与mysql连接
package DBHelper; import java.sql.*; public class Demo { public static void main(String[] args) { St ...
- java中对list进行分页显示数据到页面
http://blog.csdn.net/Tang_Mr/article/details/76212184#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2 ...
- 基于MySQl的分页显示
<%@page import="java.sql.DriverManager"%> <%@page import="java.sql.ResultSet ...
- 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...
- java web 简单的分页显示
题外话:该分页显示是用 “表示层-控制层-DAO层-数据库”的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指 ...
随机推荐
- 利用 Python 写一个颜值测试小工具
我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...
- C#LeetCode刷题之#594-最长和谐子序列(Longest Harmonious Subsequence)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3800 访问. 和谐数组是指一个数组里元素的最大值和最小值之间的差 ...
- C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3736 访问. 给定一个包含了一些 0 和 1的非空二维数组 gr ...
- JavaScript npm/nrm 切换安装依赖的镜像源
nrm: npm registry manager npm 镜像源管理工具 安装nrm npm install -g nrm 查看所有的镜像源 nrm ls # nrm ls npm -------- ...
- myBatis源码解析-反射篇(4)
前沿 前文分析了mybatis的日志包,缓存包,数据源包.源码实在有点难顶,在分析反射包时,花费了较多时间.废话不多说,开始源码之路. 反射包feflection在mybatis路径如下: 源码解析 ...
- for语句——猜数字
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...
- for循环的插入元素
Scanner input = new Scanner(System.in); int[] num = new int[5]; for (int i = 0; i < num.length; ...
- 浅谈python深复制与浅复制区别
话不多说,看代码
- C#,js和sql实用技巧选1
我刚开始.net 开发的那几年,差不多每天坚持搜集实用的技巧和代码片断.几年下来也搜集了上千条.现在选出一些不太容易找或者自己有较多体会的,写在这里.内容太多,分两次发. 1.上传文件超过设置允许的最 ...