`
suhuanxi
  • 浏览: 40623 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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);
   }
  }
 }

}

 

 

7
2
分享到:
评论

相关推荐

    Microsoft Access数据库操作例子

    JAVA实现的Access数据库操作Demo,图形化界面,JTable显示数据,提供添加,删除,插入,刷新,更新,表行列大小手动调整,行记录可拖拽等多种强大功能

    java读数据库综合例子,包括读.properties配置文件

    标准三层结构。...通过读取外部.properties配置文件获取数据库连接字符串连接数据库并进行数据库操作。 附有详细的说明,我的日食项目直接导入。 赠送3752条中英文对照句子,这些句子相信会成为很多人座右铭。

    Java连接oracle数据例子.rar_java ORACLE jtable_java oracle_oracle_卫星轨道

    用Java连接oracle数据库实现简单的查询、插入、删除和更新操作。

    h_JAVA 2应用编程150例.rar

    很多很好的一些例子. 第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 实例6 在窗口中显示背景图 16 实例7 在窗体中...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作典型应用和数据库应用。全书分5篇24章,共计603个实例和603个经验技巧。每个实例都...

    Java开发技术大全 电子版

    14.8.9表格(Jtable)使用示例508 14.8.10树(JTree)使用示例518 14.8.11菜单使用示例523 14.9布局管理527 14.9.1流式布局(FlowLayout)回顾527 14.9.2边框布局(BorderLayout)使用示例528 14.9.3网格布局...

    疯狂JAVA讲义

    7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换操作 287 7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐的接口:Enumeration 289 7.10 本章小结 290 本章练习 290 第8...

    javaSE代码实例

    3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的优先级关系 38 3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2...

Global site tag (gtag.js) - Google Analytics