JTable操作数据库的例子

最近需要使用JTable,第一次使用,很多不懂,到网上找了很多资料和例子,发现很多例子都没有完全的实现操作数据库里一张表的数据,摸了两天终于懂了一点,写了一个例子,把代码直接复制,修改一下数据库的连接就可以运行了.使用JTable操作数据库的一张表,实现增删改,显示表里所有的数据,点击''添加''按钮在表格插入一行填写数据保存到数据库,可一次插入多行,一次可选择任意多行进行删除,一次可以修改多行的值.有写得不好的地方希望大家指出,一起进步.

共九个类:

一:

package product;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class ProductTableModel extends AbstractTableModel {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 /**changeList用来存放被修改过的数据值,这样做是为了一次修改多行多值,
  * 保存的对象是ChangedProduct,只记录被修改过的值.
  */
 private static List changeList = new ArrayList();
 private List list = new ArrayList();
 private String[] column = { "Product_id", "Product Name",
   "Product Description", "Status" };

 public ProductTableModel() {
 }

 public ProductTableModel(List list) {
  this();
  setList(list);
 }

 public int getColumnCount() {
  return column.length;
 }

 public int getRowCount() {
  return list.size();
 }
/**
 * getValueAt方法就是使得数据在Table显示出来,给每个单元格设值
 */
 public Object getValueAt(int arg0, int arg1) {
  ProductBean p = (ProductBean) list.get(arg0);
  return getPropertyValueByCol(p, arg1);
 }

 public void addRow(int index, ProductBean p) {
  if (index < 0 || index > list.size() - 1) {
   list.add(p);
   fireTableRowsInserted(list.size(), list.size());
  } else {
   list.add(index + 1, p);
   fireTableRowsInserted(index, index);
  }
 }

 public boolean deleteRow(int index) {
  if (index >= 0 && index < list.size()) {
   list.remove(index);
   fireTableRowsDeleted(index, index);
   return true;
  } else
   return false;
 }

 public boolean saveRow(int index, ProductBean p) {
  if (index >= 0 && index < list.size()) {
   list.set(index, p);
   fireTableRowsUpdated(index, index);
   return true;
  } else
   return false;
 }

 public ProductBean getRow(int index) {
  if (index >= 0 && index < list.size()) {
   return (ProductBean) list.get(index);

  } else
   return null;
 }
 public List getNewRow(){
  List list=new ArrayList();
  List listProduct=getList();
  Iterator it=listProduct.iterator();
  while(it.hasNext()){
   ProductBean p=new ProductBean();
   p=(ProductBean)it.next();
   if(p.getProduct_id()==0){
    list.add(p);
   }
  }
  return list;
 }

 public List getList() {
  return list;
 }

 public void setList(List list) {
  this.list = list;
  fireTableDataChanged();
 }

 public String getColumnName(int i) {
  return column[i];
 }

 public void setColumn(String[] column) {
  this.column = column;
 }

 public Object getPropertyValueByCol(ProductBean p, int col) {
  switch (col) {
  case 0:
   return p.getProduct_id();
  case 1:
   return p.getProduct_name();
  case 2:
   return p.getProduct_desc();
  case 3:
   return p.getProduct_status();
  }
  return null;
 }

 public void setPropertyValueByCol(ProductBean p, String value, int col) {
  switch (col) {
  case 1:
   p.setProduct_name(value);
   break;
  case 2:
   p.setProduct_desc(value);
   break;
  case 3:
   p.setProduct_status(value);
   break;
  }
  fireTableDataChanged();
 }

 public boolean isCellEditable(int row, int column) {
  return true;
 }

 /**
  * setValueAt方法是使增加或修改值的时候生效,aValue就是你在单元格填的值,
  * 要把这些值保存到数据源中
  */
 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  ProductBean p = (ProductBean) list.get(rowIndex);
  setPropertyValueByCol(p, aValue.toString(), columnIndex);
  this.fireTableCellUpdated(rowIndex, columnIndex);
 }

 public static List getChangeList() {
  return changeList;
 }

 public static void setChangeList(List changeList) {
  ProductTableModel.changeList = changeList;
 }

}


二:

package product;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;

public class ProductFrame extends JFrame {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 private JPanel panelTop = null;
 private JLabel labHeader = null;
 private JPanel panelBottom = null;
 private JButton add = null;
 private JButton delete = null;
 private JButton save = null;
 private JScrollPane scroll = null;
 private JTable table = null;
 private ProductTableModel model = null;
 private List listProduct = null;

 public ProductTableModel getModel() {
  if (null == model) {
   model = new ProductTableModel(listProduct);
   //给model添加一个监听,当修改的时候将触发该事件,代表事件的类是ChangeEvent
   model.addTableModelListener(new ChangeEvent(model));
   return model;
  }
  return model;
 }

 public JLabel getLabHeader() {
  if (null == labHeader) {
   labHeader = new JLabel("Maintaince Product Information");
   return labHeader;
  }
  return labHeader;
 }

 public JTable getTable() {
  if (null == table) {
   table = new JTable(getModel());
   table.setEnabled(true);
   table.setRowSelectionAllowed(true);
   table.setBackground(Color.YELLOW);
   /**
    * 隐藏第一列ID,不显示出来
    */
   DefaultTableColumnModel dcm = (DefaultTableColumnModel)table.getColumnModel();
      dcm.getColumn(0).setMinWidth(0);
      dcm.getColumn(0).setMaxWidth(0);     
   return table;
  }
  return table;
 }

 public JScrollPane getPanTable() {
  if (null == scroll) {
   scroll = new JScrollPane();
   scroll.setViewportView(getTable());
   return scroll;
  }
  return scroll;
 }

 public JPanel getPanelTop() {
  if (null == panelTop) {
   panelTop = new JPanel();
   panelTop.setLayout(new FlowLayout(FlowLayout.CENTER));
   panelTop.add(getLabHeader());
   return panelTop;
  }
  return panelTop;
 }

 public JPanel getPanelBottom() {
  if (null == panelBottom) {
   panelBottom = new JPanel();
   panelBottom.setLayout(new FlowLayout(FlowLayout.CENTER));
   panelBottom.add(getAdd());
   panelBottom.add(getDelete());
   panelBottom.add(getSave());
   return panelBottom;
  }
  return panelBottom;
 }

 public JButton getAdd() {
  /**
   * 点该按钮的时候调用addProduct()方法,在数据源(listProduct)将
   * 增加一个元素,没设值前都是null.
   */
  if (null == add) {
   add = new JButton("New");
   add.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     addProduct();  
    }

   });
   return add;
  }
  return add;
 }

 public JButton getDelete() {
  if (null == delete) {
   delete = new JButton("Delete");
   delete.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     /**
      * 支持一次选中多行后删除
      */
     int[] rows=getTable().getSelectedRows();
     if(rows.length>0){
     int flag=JOptionPane.showConfirmDialog(null, "确定删除?");
     if(flag==JOptionPane.YES_OPTION)
     deleteProduct();
     }
     else
      JOptionPane.showMessageDialog(null,"请选择要删除的行!");
    }

   });
   return delete;
  }
  return delete;
 }

 public JButton getSave() {
  if (null == save) {
   save = new JButton("save");
   save.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     saveProduct();
     JOptionPane.showMessageDialog(null,"更新成功!");
    }

   });
   return save;
  }
  return save;
 }
 public void addProduct() {
  ProductBean p = new ProductBean();
  getModel().addRow(getTable().getSelectedRow(), p);
 }
 public void saveProduct() {
  DaoInterface dao=DaoFactory.getDao();
  List changeList=getModel().getChangeList();
  //如果有修改过就调用update方法
  if(changeList.size()>0){
   dao.update(changeList);
   changeList.clear();
  }
  List newRow=getModel().getNewRow();
  //如果是新增就调用saveList,支持一次增加多行
        if(newRow.size()>0){
   dao.saveList(newRow);
   getModel().setList(dao.getList());
   getTable().updateUI();
   newRow.clear();
        }
  
 }
 public void deleteProduct() {
  /**支持一次删除多行,先获得所有选中的行,然后按照行数取得Product实例,
   * 放进一个list,然后传给操作数据库的deleteList方法.
  */
  int[] rows=getTable().getSelectedRows();
  ArrayList list=new ArrayList();
  DaoInterface dao=DaoFactory.getDao();
  for(int i=rows.length-1;i>=0;i--){
  list.add(getModel().getRow(rows[i]));
  getModel().deleteRow(rows[i]);
  }
  dao.deleteList(list);
  getTable().updateUI();
  list.clear();
 }
 public void initData() {
  /**
   * 初始化数据源,从数据库里把数据拿出来,然后它会调用
   * getValueAt方法来一个单元格一个单元格来设值,让它显示出来.
   */
  listProduct = new ArrayList();
     DaoInterface dao=DaoFactory.getDao();
     listProduct=dao.getList();
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public ProductFrame() {
  initData();
  Container c = this.getContentPane();
  c.setLayout(new BorderLayout());
  c.add(getPanelTop(), BorderLayout.NORTH);
  c.add(getPanelBottom(), BorderLayout.SOUTH);
  c.add(getPanTable(), BorderLayout.CENTER);
  this.setSize(new Dimension(600, 400));
  this.setVisible(true);
 }
 public static void main(String[] args) {
  ProductFrame frame = new ProductFrame();
  frame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
 }
   
}

 

三:

package product;

public class ProductBean {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 private int product_id;
 private String product_name;
 private String product_desc;
 private String product_status;

 public String getProduct_name() {
  return product_name;
 }

 public void setProduct_name(String product_name) {
  this.product_name = product_name;
 }

 public String getProduct_desc() {
  return product_desc;
 }

 public void setProduct_desc(String product_desc) {
  this.product_desc = product_desc;
 }

 public String getProduct_status() {
  return product_status;
 }

 public void setProduct_status(String product_status) {
  this.product_status = product_status;
 }

 public int getProduct_id() {
  return product_id;
 }

 public void setProduct_id(int product_id) {
  this.product_id = product_id;
 }

}

四:

package product;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBConnection {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 private static Connection conn;
 public static Connection getConn() {
  String driverName = "oracle.jdbc.driver.OracleDriver";
  String url = "jdbc:oracle:thin:@192.168.0.66:1521:test";
  String userName = "JACKTRAINING";
  String pwd = "JACKTRAINING";
  try {
   Class.forName(driverName);
   conn = DriverManager.getConnection(url, userName, pwd);
  } catch (ClassNotFoundException e) {
   System.out.println("装载驱动出错!");
  } catch (SQLException e) {
   System.out.println("获取数据库连接出错!");
   e.printStackTrace();
  }

  return conn;
 }
}

五:

package product;


import java.util.ArrayList;
import java.util.List;

public interface DaoInterface {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
public List getList();
public void saveList(List list);
public void deleteList(List list);
public void update(List list);
}

六:

package product;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JOptionPane;

public class DaoImpl implements DaoInterface {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 public List getList() {
  Connection conn = JDBConnection.getConn();
  String s1 = "select * from justin_jtable_product order by product_id asc";
  PreparedStatement ps = null;
  ResultSet rs = null;
  List list = new ArrayList();
  try {
   ps = conn.prepareStatement(s1);
   rs = ps.executeQuery();
  } catch (SQLException e) {
   System.out.println("取出全部数据出错!");
   JOptionPane.showMessageDialog(null, "取出全部数据出错!");
   e.printStackTrace();
  }
  try {
   while (rs.next()) {
    ProductBean p = new ProductBean();
    p.setProduct_id(rs.getInt(1));
    p.setProduct_name(rs.getString(2));
    p.setProduct_desc(rs.getString(3));
    p.setProduct_status(rs.getString(4));
    list.add(p);
   }
  } catch (SQLException e) {
   JOptionPane.showMessageDialog(null, "取出全部数据出错!");
   e.printStackTrace();
  } finally {
   try {
    rs.close();
    ps.close();
    conn.close();
   } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
    e.printStackTrace();
   }
  }
  return list;
 }

 public void saveList(List list) {
  String s1 = "";
  Connection conn = JDBConnection.getConn();
  PreparedStatement ps = null;
  try {
   Iterator it = list.iterator();
   while (it.hasNext()) {
    ProductBean p = (ProductBean) it.next();
    String name = p.getProduct_name();
    String desc = p.getProduct_name();
    String status = p.getProduct_status();
    int id = p.getProduct_id();
    s1 = "insert into justin_jtable_product(product_name,"
      + "product_desc,product_status) values(?,?,?)";
    ps = conn.prepareStatement(s1);
    ps.setString(1, name);
    ps.setString(2, desc);
    ps.setString(3, status);
    ps.executeUpdate();
   }
  } catch (SQLException e) {
   System.out.println("添加数据时出错!");
   JOptionPane.showMessageDialog(null, "添加数据时出错!");
   e.printStackTrace();
  } finally {
   try {
    ps.close();
    conn.close();
   } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
    e.printStackTrace();
   }
  }
 }

 public void deleteList(List list) {
  String str = "delete from justin_jtable_product where product_id=?";
  int id = 0;
  Iterator it = list.iterator();
  Connection conn = JDBConnection.getConn();
  PreparedStatement ps = null;
  try {
   while (it.hasNext()) {
    id = ((ProductBean) it.next()).getProduct_id();
    ps = conn.prepareStatement(str);
    ps.setInt(1, id);
    ps.executeUpdate();
   }
  } catch (SQLException e) {
  } finally {
   try {
    ps.close();
    conn.close();
   } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
    e.printStackTrace();
   }
  }
 }

 public void update(List list) {
  Connection conn = JDBConnection.getConn();
  PreparedStatement ps = null;
  Iterator it = list.iterator();
  int id = 0;
  int col = 0;
  String value = "";
  String str = "";
  try {
   while (it.hasNext()) {
    ChangedProduct ch = (ChangedProduct) it.next();
    id = ch.getId();
    col = ch.getCol();
    value = ch.getValue();
    switch (col) {
    case 1:
     str = "update justin_jtable_product set product_name=? where product_id=?";
     break;
    case 2:
     str = "update justin_jtable_product set product_desc=? where product_id=?";
     break;
    case 3:
     str = "update justin_jtable_product set product_status=? where product_id=?";
    }
    ps = conn.prepareStatement(str);
    ps.setString(1, value);
    ps.setInt(2, id);
    ps.executeUpdate();
   }
  } catch (SQLException e) {
   JOptionPane.showMessageDialog(null, "修改数据时出错!");
   e.printStackTrace();
  } finally {
   try {
    ps.close();
    conn.close();
   } catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "关闭数据连接时出错!");
    e.printStackTrace();
   }
  }
 }
}


七:

package product;

public class DaoFactory {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 synchronized public static DaoInterface getDao(){
 DaoInterface dao=null;
 if(dao==null){
 dao=new DaoImpl();
 return dao;
 }
 return dao;
}
}

八:

package product;

public class ChangedProduct {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 private int id;
 private int col;
 private String value;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getValue() {
  return value;
 }

 public void setValue(String value) {
  this.value = value;
 }

 public int getCol() {
  return col;
 }

 public void setCol(int col) {
  this.col = col;
 }
}

九:

package product;

import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class ChangeEvent implements TableModelListener {


 /**
  * 神恋科技:http://suhuanxi.iteye.com
  */
 /**
  * 监听table被改动的事件,只要目的是用来记录被修改过的值,
  * 这样做可以一次任意行的修改值,修改一个单元格的值就记录一次,
  * 主要记录id,新值,烈数.
  */
 ProductTableModel model = null;
 public ChangeEvent(ProductTableModel model) {
  this.model = model;
 }
 List list = model.getChangeList();
 int id = 0;
 String value = "";

 public void tableChanged(TableModelEvent arg0) {
  int row = arg0.getFirstRow();
  int col = arg0.getColumn();
  if (col != -1) {
   ChangedProduct cp = new ChangedProduct();
   id = ((Integer) model.getValueAt(row, 0)).intValue();
   if (id != 0) {
    value = model.getValueAt(row, col).toString();
    cp.setId(id);
    cp.setCol(col);
    cp.setValue(value);
    list.add(cp);
   }
  }
 }

}

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值