Java 如何在数据库中存储entier jtable并检索它

Java 如何在数据库中存储entier jtable并检索它,java,sql,swing,Java,Sql,Swing,我正在用java构建一个计费应用程序。在我的JTable中,可能有n行。如何将其压缩到数据库中,然后从数据库中检索 例如,假设有一个客户ABC,他们在这个列表或账单中有100个项目。如何将这100项和相关列字段(即完整的JTable)放在数据库的一列中 我正在使用MySQL JTable table = new JTable(row,column); TableModel tm = table.getModel(); try { ByteArrayOutputStream baos =

我正在用java构建一个计费应用程序。在我的JTable中,可能有n行。如何将其压缩到数据库中,然后从数据库中检索

例如,假设有一个客户ABC,他们在这个列表或账单中有100个项目。如何将这100项和相关列字段(即完整的JTable)放在数据库的一列中

我正在使用MySQL

JTable table = new JTable(row,column);
TableModel tm = table.getModel();
try
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    ObjectOutputStream oos = new ObjectOutputStream(baos);  
    oos.writeObject(table.getModel());  
    oos.flush();  
    oos.close();  
    byte[] b = baos.toByteArray();  

    java.sql.Connection con=null;


    Class.forName("com.mysql.jdbc.Driver");
    con=DriverManager.getConnection("jdbc:mysql://localhost:3306/ankit","root","");
    java.sql.Statement stmt =con.createStatement();

    String maketable = "CREATE TABLE if not exists contacttable(Name Varchar(25),Position Varchar(20),Phone Varchar(20))";
    stmt.executeUpdate(maketable);

    System.out.print("table created ");
    //PreparedStatement pstmt = null; ;
    // pstmt.setBytes(1, b);
    PreparedStatement pstmt = (PreparedStatement) con.prepareStatement("INSERT INTO contacttable VALUES(?,?,?)");
    pstmt.setBytes(1, b);


    // . . . 

您可以通过在循环中读取JTable,然后生成SQL命令,将其存储在数据库中,例如,您可以:

List<String> Columns = new ArrayList();
for (int i = 0; i < jTable1.getColumnCount(); i++) {
     Columns.Add(jTable.GetModel.getColumnName(i));
}

检索将是相同的,但相反

简单的回答是,不要。这既不是数据库的工作方式,也不是序列化的使用方式。这种方法可能会使您的数据在将来变得无用,并且在应用程序的不同实例之间不兼容。规范化数据库应该可以做到这一点。如果你不知道这意味着什么,我听说过这本书的好东西,为凡人设计数据库。你需要另一张表,可能叫做bills,它与通过customer_id链接的customer表具有外键关系。JTable中的每一行都将复制为bills中的一行table@ankit12您需要对数据库和数据库设计进行一些研究。你设计数据库的方式将对你的应用程序的行为以及它的维护/升级效果产生巨大的影响。Dan Bracuk推荐了上面的一本书;我建议你研究一下这个或类似的事情。存储数据是数据库设计的目的!在进一步讨论之前,我同意其他建议对数据库设计进行研究的意见@MadProgrammer给了你一个很好的开始建议……你的答案与问题无关,他要求将整个jtable存储为一条记录。@PierreOverFlow:很抱歉误解了这个问题,但我个人认为这是不可能的。jtable没有GetModel字段,StringBuilder和Append方法,nor dos ArrayList有一个Add方法,你应该使用准备好的语句,以避免可能的SQL注入问题。我同意这些建议,但我想说的是,假设用户让20个不同的客户每天用100个项目支付账单。那么,如果我将其存储在账单表中,我的数据库将不会在一个表中存储20x100x30行n月这将影响我的数据库..那么有没有其他方法来保存如此庞大的数据??
List<List<String>> Rows = new ArrayList();
for (int i = 0; i < jTable1.getRowCount(); i++) {
    List<String> Temp = new ArrayList();
    for (int x = 0; x < jTable1.getColumnCount(); x++) {
        Rows.Add(jTable.GetModel.getValueAt(i,x));
     }
}
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO ")
for (String s: Rows) {
  sb.Append(s).append(", ");
}
// and so on.