如何将数据(实际上是 Jtable 数据)添加到数据库中。有没有办法使用preparedstmt将对象插入数据库?

Posted

技术标签:

【中文标题】如何将数据(实际上是 Jtable 数据)添加到数据库中。有没有办法使用preparedstmt将对象插入数据库?【英文标题】:How to add data (Jtable data actually) into database. Is there any way to insert an object into database using preparedstmt? 【发布时间】:2014-04-04 17:55:00 【问题描述】:
public cntctus() 

JTable 的列名

    String column[]=  "Name","Position","Phone";

JTable 的行

    Object [][]row = 
            "Prof. Renu Vig", "Director", "+123456",
            "Mr. Sukhbir singh", "Assistant Professor", "+9123568989",
            "Ms. shaweta", "BI teacher","9468645"
    ;


    table = new JTable(row,column);
    TableModel tm = table.getModel();
    java.sql.Connection con=null;
    try 
        Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/training","root","");
     try
         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 ");
//insert into table contacttable query 

PreparedStatement pstmt=con.prepareStatement("INSERT into contacttable select     distinct    values(?,?,?)");

获取一些包含数据的TableModel

        for (int i = 0; i < tm.getRowCount(); i++) 
          for (int j = 0; j < tm.getColumnCount(); j++) 
            Object o = tm.getValueAt(i, j);


 System.out.println("object from table is  : " +o);
 k=j+1;          
 pstmt.setString(k, (String)o);
  
 pstmt.executeUpdate();
        

      
     catch(SQLException s)
        
            System.out.println(s);
        
    
     catch(Exception e)
        
            e.printStackTrace();
         

我想将整个对象插入到数据库中。简而言之,如何将 jtable 数据插入到数据库中。??请帮忙。

错误是:第 1 行的 sql 语法有错误('"prof.renu vig, "director"...

【问题讨论】:

【参考方案1】:

如果您想在准备好的语句中包含多行,您可以使用您现在拥有的内容,并在外部循环内部和内部循环外部添加对 pstmt.addBatch() 的调用(循环遍历 JTable,IE 每行添加一次批处理)。然后在您遍历整个表后调用 pstmt.executeBatch()。

不过,明智的说法是,如果您在插入时生成密钥,驱动程序还必须支持在批量插入时返回多个密钥,否则您可能只会得到第一个生成的密钥,而不是所有密钥。或者,您可以在外部循环的每次迭代中执行该语句(即每行一次),确保在每次执行后调用 .clearParamters()。出于性能原因,您将希望重用preparedStatement。

您的插入语句也搞砸了。它只是将插入到联系人表值(?,?,?)。摆脱选择不同的东西。

完成后大概是这样的:

    String column[]=  "Name","Position","Phone";
    Object [][]row = 
            "Prof. Renu Vig", "Director", "+123456",
            "Mr. Sukhbir singh", "Assistant Professor", "+9123568989",
            "Ms. shaweta", "BI teacher","9468645"
    ;

    JTable table = new JTable(row,column);
    TableModel tm = table.getModel();
    java.sql.Connection con=null;
    try
    

        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/training","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=con.prepareStatement("INSERT INTO contacttable VALUES(?,?,?)");

        for (int i = 0; i < tm.getRowCount(); i++) 
            for (int j = 0; j < tm.getColumnCount(); j++) 
                Object o = tm.getValueAt(i, j);
                System.out.println("object from table is  : " +o);
                pstmt.setString(j+1, (String)o);
            
             pstmt.executeUpdate();
             pstmt.clearParameters();
        
    
    catch (Exception e) 
        e.printStackTrace();
    

【讨论】:

好的。让我解释一下我对代码所做的更改:- /* 获取一些包含数据的表模型 */ for (int i = 0; i 很难在评论中看到您的编辑,如果您可以将它们放在 OP 中,那就太好了。 完美!!你帮了我很多。 @Mark W,但我想阻止这些数据一次又一次地输入数据库。 (这就是我使用 SELECT DISTINCT 的原因。)但是选择不同的查询不起作用。有什么建议停止将 JTable 数据重新插入数据库吗?? 我在这里写了一些建议,但决定删除它们。数据完整性和验证的主题太宽泛了,我无法说出一个万能的答案。长话短说,您应该在您的数据库上使用完整性约束以确保没有重复插入数据库端,并在您的业务逻辑应用程序端执行验证,以便您可以做您认为合适的事情来通知用户重复记录. 哦哦哦。我得到了它。我现在要更改数据库约束。非常感谢@Mark。【参考方案2】:

您必须对代码进行的唯一一项更改,即

 for (int i = 0; i < tm.getRowCount(); i++) 
        for (int j = 0; j < tm.getColumnCount(); j++) 
            Object o = tm.getValueAt(i, j);
            System.out.println("object from table is  : " +o);
            pstmt.setObject(j+1, o);

它将您的实际 JTable 数据发送到您的数据库文件中。 我相信。它会起作用的。

【讨论】:

【参考方案3】:

我有一个 jpa 的例子,希望对你有所帮助

试试

          TableModel tm= table.getModel();

                  for (int i = 0; i < tm.getRowCount(); i++) 



                    Object  NumeroCin=tm.getValueAt(i, 0);
                    Object  Nomprenom=tm.getValueAt(i, 1);
                    Object  Tel =tm.getValueAt(i, 2);
                    Object  Adresse =tm.getValueAt(i, 3);
                    Object  DateNaissance=tm.getValueAt(i, 5);
                    Object  Sexe=tm.getValueAt(i, 4);



                    Etudiant e=new Etudiant();
                e.setAdresse((String) Adresse);
                e.setDateNaissance((String) DateNaissance);
                e.setNomprenom((String) Nomprenom);
                e.setNumeroCin((String) NumeroCin);
                e.setSexe( (String) Sexe );
                e.setTel((String) Tel);

                Ajouterobjet(e);

                

        catch (Exception e) 
            e.printStackTrace();
        

public void Ajouterobjet(Object o)

     EntityTransaction tx=entityManager.getTransaction();
     tx.begin();
     entityManager.persist(o);
     tx.commit();


 

【讨论】:

以上是关于如何将数据(实际上是 Jtable 数据)添加到数据库中。有没有办法使用preparedstmt将对象插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将选择列添加到显示搜索结果的 JTable

如何在按钮单击时将新行添加到数据库中的jTable而不清除现有行

如何在单击JButton后刷新JTable

swing 怎样实现表格内容刷新

如何在jTable中读取和搜索文件?

在 JTable 的单元格中添加按钮以及数据?