功能介绍:
大体用的是卡片布局
该系统使用的是JTable来显示数据库里的数据
/**
* 调用数据库显示学生信息。
*/
private void showxsxx() {
String sql="select *from studentdata";
try {
xuesxx= sqlcz.select(Studentdata.class, sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//创建行和列二维数组。
tzhi=new Object[xuesxx.size()][Studentdata.size];
Studentdata stdat=null;
for(int i=0;i<xuesxx.size();i++) {
stdat=xuesxx.get(i);
for(int j=0;j<Studentdata.size;j++) {
tzhi[i][j]=stdat.getValue(j);
}
}
// 新建表模型
tablemodel=new DefaultTableModel(tzhi,columns);
jtable=new JTable(tablemodel);
// 设置专业那一列的列宽
jtable.getColumnModel().getColumn(6).setPreferredWidth(170);
//设置表格大小
// jtable.setPreferredScrollableViewportSize(new Dimension(500,300));
/*// 选择模式为单选,就只能选一行
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);*/
/*// 关闭表格列的自动调整功能 ,默认自动调整
jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);*/
// 被选择行的背景色为黄色
jtable.setSelectionBackground(Color.LIGHT_GRAY);
// 被选择行的前景色(文字颜色)为黄色
jtable.setSelectionForeground(Color.YELLOW);
jtable.setRowHeight(30); // 表格的行高为30像素
//填充整个视图
jtable.setFillsViewportHeight(true);
jtable.setFont(font);
//设置表格显示在滚动面板
scroll.setViewportView(jtable);
}
jdbc关键代码:数据的增删改查操作代码
这里我用的是只针对学生数据表的增删改操作。
查询则是针对不同表的
package student;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import utils.SqlUtils;
//?占位符不可以用来设置不要加'的,因为会自动加'
public class CrudOption {
private Connection con;
/**
* 数据增改操作 用的数据库事务。防止出错,保护数据,即一条出错全部取消执行。
* 该方法使用batch批量处理数据执行,增加效率.
* @param String sql
* @param Vector datas要填充预编译(?)的条件数据。
* @return boolean
* @throws SQLException
*/
public boolean zenGai(String sql,Vector<Studentdata> datas){
con=SqlUtils.getConnection();
if(datas==null) {
//没有数据直接返回
return false;
}
PreparedStatement prs = null;
try {
//预编译语句对象
prs= con.prepareStatement(sql);
// 关闭自动提交, 启用事务
con.setAutoCommit(false);
Studentdata stda=null;
for(int i=0;i<datas.size();i++) {
//每一行的数据
stda=(Studentdata) datas.get(i);
//填充每一条sql预编译语句
for(int col=0;col<stda.size;col++) {
//数据库操作以1为第一个
prs.setObject(col+1, stda.getValue(col));
// 有两倍?所以再加一遍.
prs.setObject(col+1+stda.size, stda.getValue(col));
}
//添加进批处理batch集
prs.addBatch();
}
//执行所有语句
prs.executeBatch();
//提交事务
con.commit();
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
// 关闭占用的资源
SqlUtils.closeConnnction(con, prs);
}
return false;
}
/**
* clazz 为类的
* 不同的表的查询操作
* @param Class clazz
* @param sql
* @param 可变数组 fill
* @return
* @throws SQLException
*/
// T泛型表示是那个类的对象,即哪张表的数据。
public <T> Vector<T> select(Class<T> clazz,String sql,Object ...fill) throws SQLException {
Vector<T> alist=new Vector<>();//存取查询的每一行数据
//获取连接对象
con=SqlUtils.getConnection();
PreparedStatement prs=con.prepareStatement(sql);
for(int i=0;i<fill.length;i++) {
prs.setObject(i+1, fill[i]);
}
// 执行查询语句获得查询结果。查询结果集ResultSet
ResultSet executeQuery = prs.executeQuery();
//metaData对象主要是为了获取列名和列的数量。
ResultSetMetaData metaData = executeQuery.getMetaData();
try {
while(executeQuery.next()) {
T rdata=clazz.newInstance();
//数据库操作以1表示第一个数据,有多少列就要等于多少。
for(int i=1;i<=metaData.getColumnCount();i++) {
//学生表类要设置和数据库学生表字段列名一摸一样。才能获取相对应的字段。
Field field = clazz.getDeclaredField(metaData.getColumnName(i));
// 将数据添加进rdata对象
field.setAccessible(true);
field.set(rdata,executeQuery.getObject(i));
}
// 将该行的数据添加进集合以供返回给查询者
alist.add(rdata);
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}finally {
//关闭连接
SqlUtils.closeConnnction(con, prs);
}
return alist;
}
}
更多细节下次补充。关于该系统的编写可以评论或者私信我了解哦