Gravar dados de um JTable no Banco de Dados Postgresql

Pessoal, antes de tudo já quero agradecer a ajuda de todos!

Sou novato em java e gostaria de uma ajuda de vocês, seguinte…

Gostaria de pegar os dados de um JTable e salvar no banco, segue abaixo o meu código.

Pacote: modelo - Classe: TesteMod:

package modelo;

public class TesteMod {
    
    int idusuario;
    String usuario;
    String telefone;
    
    public TesteMod(String usuario, String telefone){
    
        this.usuario = usuario;
        this.telefone = telefone;
    }

    public int getIdusuario() {
        return idusuario;
    }

    public void setIdusuario(int idusuario) {
        this.idusuario = idusuario;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}

Pacote: dao - Classe: TesteDao:

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import modelo.TesteMod;

public class TesteDao {
    
    PreparedStatement stmt = null;
    Connection con = null;
    ResultSet rs = null;
//------------------------------------------------------------------------------
    public void insertTeste(TesteMod tMod){
    try {
    con = ConexaoDao.getConnection();
    stmt = con.prepareStatement("INSERT INTO teste (usuario,telefone) VALUES (?,?)");
    stmt.setString(1, tMod.getUsuario());
    stmt.setString(2, tMod.getTelefone());
    stmt.executeUpdate();
    JOptionPane.showMessageDialog(null,"Usuario incluido com sucesso!");
    }catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Erro ao incluir o usuario!: " + ex.getMessage());
        }
    }

    public Iterable<TesteMod> insertTeste() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

Pacote: visao - Classe: TesteJTable:

public void insertJTableTeste(){
    
        DefaultTableModel modelo = (DefaultTableModel) jTableTeste.getModel();
        modelo.setNumRows(0);
        TesteDao tdao = new TesteDao();
        for (TesteMod c: tdao.insertTeste()){
            
            modelo.addRow(new Object[]{
                c.getUsuario(),
                c.getTelefone(),
            });
        }
    }

O que eu quero a princípio é preencher uma JTable e quando eu clicar no botão salvar mandar esses dados para o banco de dados.

pessoal desculpem usar o default table model, é que eu não tenho muita noção de como fazer minha própria table, agradeço desde já a ajuda de todos.

É complicado mesmo pq Swing nao tem uma forma decente de fazer data binding. Independente da forma que fizer continuará ruim pela natureza da ferramenta.

Aqui vai encontrar muita coisa que pode te ajudar:

https://www.youtube.com/results?search_query=crud+jtable

Agradeço eu vou dar uma olhada, eu estou montando um sistema de pedidos como uma nota fiscal eletrônica, com o pedido e os itens do pedido, o JTable entraria na parte dos itens do pedido, agradeço a indicação, vou olhar.

Vc perde muito não usando uma implementação própria de table model. Veja um exemplo que montei (usando sua classe TesteMod como base):

TesteModTableModel

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

import javax.swing.table.AbstractTableModel;

public class TesteModTableModel extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	
	private static final int COL_ID_USUARIO = 0;
	private static final int COL_USUARIO = 1;
	private static final int COL_TELEFONE = 2;
	
	private static final String[] colunas = {
		"ID", "Usuário", "Telefone"
	};
	
	private List<TesteMod> dados;
	
	public TesteModTableModel() {
		this.dados = new ArrayList<>();
	}
	
	public TesteModTableModel(List<TesteMod> dados) {
		this.dados = dados;
	}

	@Override
	public int getRowCount() {
		return dados.size();
	}

	@Override
	public int getColumnCount() {
		return colunas.length;
	}
	
	@Override
	public String getColumnName(int column) {
		return colunas[column];
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		switch (columnIndex) {
		case COL_ID_USUARIO:
			return this.dados.get(rowIndex).getIdusuario();
		case COL_USUARIO:
			return this.dados.get(rowIndex).getUsuario();
		case COL_TELEFONE:
			return this.dados.get(rowIndex).getTelefone();
		}
		
		return null;
	}
	
	public void add(TesteMod testeMod) {
		this.dados.add(testeMod);
		fireTableDataChanged();
	}
	
	public void addAll(List<TesteMod> dados) {
		this.dados.addAll(dados);
		fireTableDataChanged();
	}

	public List<TesteMod> getDados() {
		return dados;
	}
}

Tela que apresenta a jTable usando o table model com alguns registros:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Main extends JFrame {
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) throws Exception {
		new Main();
	}
	
	public Main() {
		super("Table");
		
		initComponents();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		pack();
		setVisible(true);
	}
	
	private void initComponents() {
		TesteModTableModel tableModel = new TesteModTableModel();
		JTable table = new JTable(tableModel);
		table.setSize(400, 350);
		
		tableModel.add(new TesteMod("Aaa", "111"));
		tableModel.add(new TesteMod("Bbb", "222"));
		tableModel.add(new TesteMod("Ccc", "333"));
		
		add(new JScrollPane(table));
	}
}

Dessa forma, para gravar os dados da jTable no banco, basta chamar o método getDados assim:

TesteModTableModel tableModel = new TesteModTableModel();
List<TesteMod> dados = tableModel.getDados();

e persistir a lista no banco.

1 curtida

Pessoal, bom dia!

Agradeço a ajuda de todos que tentaram me ajudar, estou postando aqui abaixo como eu resolvi esse problema, após pesquisar muito fiz da forma abaixo:

//Pacote modelo.

package modelo;

public class LinhaPedMod {

int codpedido;
int idlinha;
String usuario;
String Telefone;

public LinhaPedMod (){}

    public LinhaPedMod (int codpedido, int idlinha, String usuario, String Telefone) {
        
        this.codpedido = codpedido;
        this.idlinha = idlinha;
        this.usuario = usuario;
        this.Telefone = Telefone;
    }
public int getCodpedido() {
    return codpedido;
}

public void setCodpedido(int codpedido) {
    this.codpedido = codpedido;
}

public int getIdlinha() {
    return idlinha;
}

public void setIdlinha(int idlinha) {
    this.idlinha = idlinha;
}

public String getUsuario() {
    return usuario;
}

public void setUsuario(String usuario) {
    this.usuario = usuario;
}

public String getTelefone() {
    return Telefone;
}

public void setTelefone(String Telefone) {
    this.Telefone = Telefone;
}

}

//Pacote dao(insert)

public class LinhaPedDao {

PreparedStatement stmt = null;
Connection con = null;
ResultSet rs = null;

//------------------------------------------------------------------------------
public Iterable insertLinhaPedido(LinhaPedMod tMod) throws SQLException{

con = ConexDao.getConnection();
stmt = con.prepareStatement("INSERT INTO linhapedido (codpedido,idlinha,usuario,"
+ "telefone) VALUES (?,?,?,?)");

stmt.setInt(1, tMod.getCodpedido());
stmt.setInt(2, tMod.getIdlinha());
stmt.setString(3, tMod.getUsuario());
stmt.setString(4, tMod.getTelefone());
stmt.executeUpdate();
return null;
}

}

// TableMode Pacote modelo

package modelo;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;

public class JTableTestMod extends AbstractTableModel{

private List<LinhaPedMod> dados = new ArrayList<>();
private String[] colunas = {"ID Linha","Usuario","Telefone"};

//------------------------------------------------------------------------------
@Override
public int getColumnCount() {
return colunas.length;
} //Pega as colunas
//-----------------------------------------------------------------------------
@Override
public int getRowCount() {
return dados.size();
} //Pega as linhas
//------------------------------------------------------------------------------
@Override
public String getColumnName(int nomeColunas) {
return colunas[nomeColunas];
} //Pega os nomes das colunas
//------------------------------------------------------------------------------
@Override
public Object getValueAt(int linha, int coluna) {

    switch(coluna){
        case 0:
            return dados.get(linha).getIdlinha();
        case 1:
            return dados.get(linha).getUsuario();
        case 2:
            return dados.get(linha).getTelefone();
    }
    return null;
}   //Pega os Valores

//------------------------------------------------------------------------------
@Override
public void setValueAt(Object valor, int linha, int coluna) {
switch(coluna){
case 0:
dados.get(linha).setIdlinha(Integer.parseInt((String) valor));
break;
case 1:
dados.get(linha).setUsuario((String) valor);
break;
case 2:
dados.get(linha).setTelefone((String) valor);
break;
}
this.fireTableRowsUpdated(linha, linha);
} //Atualiza as linhas na view
//------------------------------------------------------------------------------
@Override
public boolean isCellEditable(int linha, int coluna) {
return true; //return coluna != 0;
} //Controla a edição dos campos
//--------------------------------------------------------------------------
public void addRow(LinhaPedMod tMod){
this.dados.add(tMod);
this.fireTableDataChanged();
} //Adiciona as linhas na view
//------------------------------------------------------------------------------
public void removeRow(int linha){
this.dados.remove(linha);
this.fireTableRowsDeleted(linha, linha);
} //Remove as linhas na view
//------------------------------------------------------------------------------
public void add(LinhaPedMod testeMod) {
this.dados.add(testeMod);
fireTableDataChanged();
}
//------------------------------------------------------------------------------
public void addAll(List dados) {
this.dados.addAll(dados);
fireTableDataChanged();
}
//------------------------------------------------------------------------------
public List getDados() {
return dados;
}
//------------------------------------------------------------------------------
}

//pacote visao somente o método

public void insertlinhaPedido() throws SQLException{
LinhaPedMod uMod = new LinhaPedMod();
LinhaPedDao tDao = new LinhaPedDao();

    uMod.setCodpedido(Integer.parseInt(jTextFieldCodPedido.getText()));
    
    for(int i=0; i<jTableTesteJF.getRowCount(); i++){        
    
    uMod.setIdlinha(Integer.parseInt(jTableTesteJF.getValueAt(i, 0).toString()));
    uMod.setUsuario(jTableTesteJF.getValueAt(i, 1).toString());    
    uMod.setTelefone(jTableTesteJF.getValueAt(i, 2).toString());
            
    tDao.insertLinhaPedido(uMod);
    }
}

Após isso eu chamei esse método insertlinhaPedido(); no botão salvar.

Pessoal desculpe se errei em alguma palavra na hora de postar o meu código, estou engatinhando em java, pode ser que daria para resolver de outra forma, porém essa foi a forma que encontrei depois de pesquisar horrores, kkk, valew pessoal.