本文将展示将数据库中表的数据呈现在java的JTabel中并实现查询,添加,删除的功能。
涉及内容包括jdbc连接数据库、JTable表格、滚动面板的设置、java实现sql增删改查语句等。
PS: 本文实现对数据库驱动等的连接是通过properties类来保存相关属性,也可以在方法中直接书写。博主调用数据库的表是博主当时的课程设计,是一个病人基本信息的表格。
下面是示例:
添加操作:
删除操作:
1.创建propertie类保存连接数据库相关属性
driver = com.microsoft.sqlserver.jdbc.SQLServerDriver url = jdbc:sqlserver://127.0.0.1:1433;DatabaseName=hospital user = sa password = Yj0717
在桌面创建文本文档写入其中信息,在添加至eclipse中
2. 创建Config类来调用我们在sqlserber.properties中写的相关信息
package cn.edu.hnucm.util; import java.io.FileInputStream; import java.util.Properties; //配置类 public class Config { private static Properties p = null; static { try { p = new Properties(); // 加载配置文件 p.load(new FileInputStream("config/sqlserver.properties")); } catch (Exception e) { e.printStackTrace(); } } // 获取键对应的值 public static String getValue(String key) { return p.get(key).toString(); } }
之后便可以使用其中的getValue()方法调用。
3.连接数据库并在其中书写增删改查executeQuery和executeUpdate方法
(1)连接数据库基本操作
package dbutil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import config.Config; public class DBexecute { Connection conn; private PreparedStatement pstm; private ResultSet rs; public Connection getConnection() throws Exception{ String Driver = Config.getValues("driver");//数据库驱动 String url = Config.getValues("url");//数据库连接 String user = Config.getValues("user");//获取登录用户名 String password = Config.getValues("password");//获取登录密码 try { Class.forName(Driver); conn = DriverManager.getConnection(url,user,password); return conn; } catch (Exception e){ throw new SQLException("驱动错误或连接失败!"); } }
书写execuQuery方法,之后可在主界面中调用方法实现查询。
//查询操作 public ResultSet executeQurey(String sql,String[] data){ try { //得到preparaStatement语句 pstm = conn.prepareStatement(sql); if (data!=null){ for(int i=0;i<data.length;i++){ pstm.setString(i+1, data[i]);//注意是i+1 } } //执行sql语句 rs = pstm.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回查询结果集 return rs; }
executeUpdate方法,实现插入、删除,不可以实现查询
//插入、删除操作 public int executeUpdate(String sql,String[] data){ int count = 0; try { pstm = conn.prepareStatement(sql); if(data!=null){ for(int i=0;i<data.length;i++){ pstm.setString(i+1, data[i]); } count = pstm.executeUpdate(); } }catch (Exception e){ e.printStackTrace(); } //返回修改成功的行数 return count; }
还有最后一个closeAll方法,用于关闭所有数据流
public void closeAll() { // 如果rs不空,关闭rs if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } // 如果pstm不空,关闭pstm if (pstm != null) { try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } // 如果conn不空,关闭conn if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
接下来,便是主界面的书写,通过监听器来实现功能。
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import dbutil.DBexecute; public class JTableDemo extends JFrame{ //滚动面板 private JScrollPane sptable; //表格 private JTable table; //放置按钮的面板 private JPanel panel; //设置按钮 private JButton btsave,btdelete,btadd,btflush; //设置默认表格格式 private DefaultTableModel model; public JTableDemo() { //调用父类方法设置标题 super("数据库数据"); //设置表格 model = new DefaultTableModel(); table = new JTable(model); //将表格放入滚动面板中 sptable = new JScrollPane(table); //将滚动面板放入主面板中部 this.add(sptable,BorderLayout.CENTER); btsave = new JButton("保存"); btadd = new JButton("添加"); btdelete = new JButton("删除"); btflush = new JButton("刷新"); panel = new JPanel(); panel.add(btadd); panel.add(btsave); panel.add(btdelete); panel.add(btflush); btsave.setVisible(false); this.add(panel,BorderLayout.SOUTH); //显示初始数据 showData(); //设置界面基本数据 this.setSize(1000,600); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); //添加监听器,因为每个实现的功能不同,所以这里使用匿名内部类来实现 btadd.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { addData(); } }); btsave.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub saveDate(); } }); btdelete.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub deleteDate(); } }); btflush.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub showData(); } }); }
showData其实就是对数据库表的再一次查询,并显示数据放入table中,其中使用了Vector集合来实现。
private void showData() { // TODO Auto-generated method stub String sql = "select* from patient"; DBexecute db = new DBexecute(); try { //连接数据库 db.getConnection(); //获取返回集 ResultSet rs = db.executeQurey(sql, null); //获取列名 ResultSetMetaData rsmt = rs.getMetaData(); //获取列数 int count = rsmt.getColumnCount(); //创建一个Vector集合存放列名title Vector<String> title = new Vector<>(); //存放列名 for(int i=1;i<=count;i++){ title.add(rsmt.getColumnLabel(i)); } //存放集合(行数据)的集合 Vector<Vector<String>> data = new Vector<Vector<String>>(); //判断表中有无数据 int rowCount = 0; //将数据放入data中 while(rs.next()){ rowCount++; //设置一个集合存放行数据,在放入data中 Vector<String> rowData = new Vector<>(); for(int i = 1;i<=count;i++){ rowData.add(rs.getString(i)); } data.add(rowData); } if(rowCount==0){ //若行为0即数据库表中没有数据,便将title列名放入table即可 model.setDataVector(null, title); }else { //若有数据,则将调用setDataVector将title插入data的第0列 model.setDataVector(data, title); } }catch (Exception e){ e.printStackTrace(); JOptionPane.showMessageDialog(this, "系统错误!请仔细检查!"); } }
addData方法,在表格下方加入一行全为0的行,输入数据后在点击保存(即调用saveData方法实现插入操作)。
private void addData() { // TODO Auto-generated method stub int rowCount = model.getRowCount(); //最好使用Object[] model.insertRow(rowCount, new String[]{"0","0","0","0","0","0","0","0","0","0","0","0"}); btadd.setVisible(false); btsave.setVisible(true); }
saveData方法,插入操作的核心。其主要已经在上文的executeUpdate方法中实现,需联合起来阅读代码并理解。
private void saveDate() { // TODO Auto-generated method stub int rowCount = table.getRowCount()-1; //获取自己填写的数据 String name = table.getValueAt(rowCount, 0).toString(); String sex = table.getValueAt(rowCount, 1).toString(); String age = table.getValueAt(rowCount, 2).toString(); String bdate = table.getValueAt(rowCount, 3).toString(); String idate = table.getValueAt(rowCount, 4).toString(); String num = table.getValueAt(rowCount, 5).toString(); String address = table.getValueAt(rowCount, 6).toString(); String link = table.getValueAt(rowCount, 7).toString(); String flink = table.getValueAt(rowCount, 8).toString(); String doctor = table.getValueAt(rowCount, 9).toString(); String email = table.getValueAt(rowCount, 10).toString(); String ps = table.getValueAt(rowCount, 11).toString(); DBexecute db = new DBexecute(); try{ db.getConnection(); String sql = "insert patient values(?,?,?,?,?,?,?,?,?,?,?,?)"; int count = db.executeUpdate(sql,new String[]{name,sex,age,bdate,idate,num,address,link,flink,doctor,email,ps}); showData(); btadd.setVisible(true); btsave.setVisible(false); if(count == 1){ JOptionPane.showMessageDialog(this, "插入数据成功!"); }else { JOptionPane.showMessageDialog(this, "插入数据失败!"); } }catch(Exception e){ e.printStackTrace(); }finally { db.closeAll(); } }
最后一个删除操作,deleteData方法。
private void deleteDate() { // TODO Auto-generated method stub int index[] = table.getSelectedRows(); if(index==null){ JOptionPane.showMessageDialog(this, "请选择需要删除的数据!","删除",JOptionPane.PLAIN_MESSAGE); }else{ try { int k = JOptionPane.showConfirmDialog(this, "是否要删除这条记录?", "删除", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (k == JOptionPane.YES_OPTION) { DBexecute db = new DBexecute(); try { db.getConnection(); String sql = "delete from patient where name=?"; String name = table.getValueAt(index[0], 0).toString(); int count = db.executeUpdate(sql, new String[] { name }); showData(); if (count == 1) { JOptionPane.showMessageDialog(this, "删除数据成功!", "成功", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, "删除数据失败!", "失败", JOptionPane.WARNING_MESSAGE); } } catch (Exception e) { e.printStackTrace(); } finally { db.closeAll(); } } } catch (Exception ee) { JOptionPane.showMessageDialog(this, "抱歉!删除数据失败!【系统异常!】", "失败:", 0); } } }
最后在主函数中调用即可。
public static void main(String[] args){ new JTableDemo(); }