Meu banco java precisa reparo

Gente gostaria saber como faço conectar ao Java porem não sei criar método inserir dados através codigo java.

package com.recibo.Recibo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.Statement;

import java.sql.ResultSet;

public class Recibo_Banco_de_dados {

private Connection connection = null;

private Statement statement = null;

private ResultSet resultSet = null;

public void connectar() {

    String servidor = "jdbc::mysql//127.0.0.1:3306/gerador";

    String usuario = "root";

    String senha = "admin";

    String driver = "com.mysql.jdbc.Driver";

    try {

        Class.forName(driver);

        this.connection = DriverManager.getConnection(servidor, usuario, senha);

        this.statement = this.connection.createStatement();

    } catch (Exception e) {

        System.out.println("Error" + e.getMessage());

    }

}

public boolean verificar() {

    if (this.connection != null) {

        return true;

    } else

        return false;

}

public void listcontato() {

    try {

        String query = "SELECT * FROM RECIBO ORDER BY nome";

        this.resultSet = this.statement.executeQuery(query);

        this.statement = this.connection.createStatement();

        while (this.resultSet.next()) {

            System.out.println("ID" + this.resultSet.getString("id") + "nome" + resultSet.getString("nome"));

        }

    } catch (Exception e) {

        System.out.println("error" + e.getMessage());

    }

}

}

O Statement e o ResultSet deveriam ser apenas variáveis locais, você declarou como variável de instância, não faz sentido, pois a cada query você vai recriá-los.

Prefira utilizar PreparedStatement ao invés de Statement.

No seu código você já está fazendo um SELECT, crie um método parecido que faça o seu INSERT.

Mas volto a repetir:
Prefira utilizar PreparedStatement ao invés de Statement.

1 curtida

bom refiz codigo com base das informações mas acho tem algo nao bate

veja só:
package com.recibo.Recibo;

import java.sql.Connection;

import java.sql.Date;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class Recibo_Banco_de_dados {

public void connectar() {

 Connection connection = null;

 PreparedStatement statement = null;

 ResultSet resultSet = null;

    String servidor = "jdbc::mysql//127.0.0.1:3306/gerador";

    String usuario = "root";

    String senha = "admin";

    String driver = "com.mysql.jdbc.Driver";

    try {

        Class.forName(driver);

        connection = DriverManager.getConnection(servidor, usuario, senha);

        statement = connection.prepareStatement(driver);

    } catch (Exception e) {

        System.out.println("Error" + e.getMessage());

    }

}



public void InserirDados(String nome, Date valor) {

    boolean validor;

    try {

        String startsql = "INSERT INFOR recibo(nome,valor) values  (" + nome + "," + valor +  ")";

        if(validor==true){

            System.out.println(PreparedStatement.SUCCESS_NO_INFO);

        }else

            System.out.println(PreparedStatement.EXECUTE_FAILED);

    } catch (Exception p) {

        System.out.println("error" + p.getMessage());

    }

}

}

}

}

não pode ser varáveis locais por conta , é usada outros métodos.

esta classe era para ser uma interface pós código principal é outro utilizar formLayout

package com.recibo.Recibo;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

import com.jgoodies.forms.layout.ColumnSpec;

import com.jgoodies.forms.layout.FormLayout;

import com.jgoodies.forms.layout.FormSpecs;

import com.jgoodies.forms.layout.RowSpec;

public class Recibo extends JFrame {

// --> atributos

private static final long serialVersionUID = 1L;

private JPanel panelNome;

private JPanel panelvalor;

private JLabel labelNome;

private JLabel labelvalor;

private JTextField textFieldNome;

private JTextField textFieldEndereco;

private JButton bt_gerarButton;

// --> construtor da classe

public Recibo() {

    JFrame windows = new JFrame();

    windows.setTitle("Recibo");

    windows.getContentPane().setLayout(new FormLayout(

            new ColumnSpec[] { FormSpecs.RELATED_GAP_COLSPEC, FormSpecs.DEFAULT_COLSPEC,

                    FormSpecs.RELATED_GAP_COLSPEC, FormSpecs.DEFAULT_COLSPEC, FormSpecs.RELATED_GAP_COLSPEC,

                    ColumnSpec.decode("default:grow"), },

            new RowSpec[] { FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,

                    FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC,

                    FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,

                    FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC,

                    FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,

                    FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, }));

    panelNome = new JPanel();

    panelvalor = new JPanel();

    labelNome = new JLabel("Nome: ");

    labelvalor = new JLabel("Valor: ");

    textFieldNome = new JTextField(15);

    textFieldEndereco = new JTextField(15);

    bt_gerarButton = new JButton("Enviar");

    // --> adiciona os componentes a janela

    panelNome.add(labelNome);

    panelNome.add(textFieldNome);

    panelvalor.add(labelvalor);

    panelvalor.add(textFieldEndereco);

    windows.add(panelNome);

    windows.add(panelvalor);

    windows.add(bt_gerarButton);

    windows.pack();

    windows.setLocationRelativeTo(null);

    windows.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    // --> mostra a janela

    setVisible(true);

}

// --> metodo main

public static void main(String[] args) {

    // muda o LookAndFeel para parecer com uma aplicacao nativa

    try {

        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    } catch (Exception e) {

        e.printStackTrace();

    }

    SwingUtilities.invokeLater(new Runnable() {

        public void run() {

            new Recibo();

        }

    });

}

}

Você não está usando essa query em nenhum lugar.

Esse if não funciona pois a variável validor não foi inicializada.

Em que outros lugares você vai usar um PreparedStatement e um ResultSet que só fazem sentido existir no método que vai executar a query?

Não faz sentido seu Recibo ser interface, está certo ser class, mas falta você implementar as funcionalidades, pois essa tela não está fazendo nada.

eu tirei esse validador , referente outra classe…

usarei este método

bt_gerarButton.addActionListener(new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

        String nome = textFieldNome.getText().toString();

        String valor = textFieldEndereco.getText().toString();

Recibo_Banco_de_dados banco = new Recibo_Banco_de_dados();

        }

porem não sei terei usa try para verificar conexão e ser caso for verdadeiro, inserir as informações no banco.

ele funciona assim você preencher recibo programa ira verificar tu preencheu tudo depois enviar para banco.

Beleza, você criou um objeto banco que é do tipo Recibo_Banco_de_dados, mas você não chamou o método connectar nem chamou o método InserirDados.

Você já teve alguma aula de programação em Java? Pergunto isso pois seu fonte não está compilando, a forma de escrever não está de acordo com a convenção de código Java.
Sua classe Recibo_Banco_de_dados tinha pequenos erros, mas agora você apagou quase tudo e recriou com mais erros, além de ter adicionado um método InserirDados que não faz nada.

Outra coisa, o valor do recibo é uma data? Também não faz sentido inclusive na sua tela você está pegando o valor a partir do campo endereço, faz menos sentido ainda.

Sugiro você apagar essa classe Recibo_Banco_de_dados e tentar utilizar essa classe de exemplo abaixo:

public final class BancoDados {

    private final Connection connection;

    // Não precisa de um método 'conectar', pode inicializar a conexão dentro do construtor da classe BancoDados
    public BancoDados() {
        try {
            String servidor = "jdbc::mysql//127.0.0.1:3306/gerador";
            String usuario = "root";
            String senha = "admin";
            String driver = "com.mysql.jdbc.Driver";
            Class.forName(driver);
            connection = DriverManager.getConnection(servidor, usuario, senha); // aqui está estabelecendo a conexão
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Não foi possível conectar ao banco de dados", e);
        }
    }

    // se o método é pra listar algo, não faz sentido ser 'void', ele tem que retornar o que foi listado
    public List<Recibo> listarRecibos() {
        // a lista de recibos que será devolvida pelo método listarRecibos
        List<Recibo> recibos = new LinkedList<>();
        try {
            // query a ser executada no banco de dados
            String query = "SELECT * FROM RECIBO ORDER BY nome";
            
            // cria um Statement com o select desejado
            PreparedStatement stmt =  = connection.prepareStatement(query);
            
            // executa o select a partir do Statement obtendo um ResultSet
            ResultSet rs = stmt.executeQuery();

            // agora vai lendo os registros obtidos
            while (rs.next()) {
                // lê o valor das colunas
                int id = rs.getInt("id");
                String nome = rs.getString("nome");
                double valor = rs.getDouble("valor");
                
                // cria um objeto do tipo Recibo com os valores lidos
                Recibo recibo = new Recibo(id, nome, valor);

                // adiciona o recibo na lista
                recibos.add(recibo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // devolve a lista de recibos para quem chamou o método 'listarRecibos'
        return recibos;
    }

    // se o método é para inserir, então ele vai receber por parâmetro o que precisa ser inserido
    public void inserirRecibo(Recibo recibo) {
        try {
            // query a ser executada no banco de dados
            String query = "INSERT INTO RECIBO (nome, valor) VALUES (?, ?)"; // cada ? vai receber um valor
            
            // cria um Statement com o insert desejado
            PreparedStatement stmt =  = connection.prepareStatement(query);
            
            // seta os parâmetros das colunas a serem inseridas
            stmt.setString(1, recibo.getNome());  // o primeiro parâmetro da query corresponde ao nome
            stmt.setDouble(2, recibo.getValor()); // o segundo parâmetro da query corresponde ao valor
            
            // executa o insert partir do Statement
            stmt.executeUpdate();
        } catch (Exception p) {
            e.printStackTrace();
        }
    }
}

Lembrando que você vai ter que criar uma classe Recibo com os atributos int id, String nome e double valor.

Então eu sou um estudante de análise e desenvolvimento de sistema, modelagem está incompleta…

consegui criar class tipo jframe de recibo utilizando Windowsbulder do Eclipse , claro modifiquei esta classe de exemplo:

package com.recibo.Recibo;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DropMode;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.FormSpecs;
import com.jgoodies.forms.layout.RowSpec;

public class Recibo3 extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField txtid;
private JTextField txtnome;
private JTextField txtvalor;
private JButton bt_enviar;
private int id;
private String nome;
private double Valor;

/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				Recibo3 frame = new Recibo3();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public Recibo3() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(new FormLayout(
			new ColumnSpec[] { FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(49dlu;default)"),
					FormSpecs.RELATED_GAP_COLSPEC, FormSpecs.DEFAULT_COLSPEC, FormSpecs.RELATED_GAP_COLSPEC,
					ColumnSpec.decode("default:grow"), },
			new RowSpec[] { FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,
					FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC,
					FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,
					FormSpecs.DEFAULT_ROWSPEC, }));

	JLabel labeid = new JLabel("Codigo :");
	getContentPane().add(labeid, "4, 4, right, default");
	getId();
	txtid = new JTextField();
	txtid.setDropMode(DropMode.ON);
	getContentPane().add(txtid, "6, 4, left, bottom");
	txtid.setColumns(10);
	JLabel labelnome = new JLabel("Nome beneficiario:");
	labelnome.setLabelFor(txtnome);
	getContentPane().add(labelnome, "4, 6, right, default");

	txtnome = new JTextField();
	getContentPane().add(txtnome, "6, 6, left, default");
	txtnome.setColumns(20);
	getNome();

	JLabel labelvalor = new JLabel("valor");
	labelvalor.setLabelFor(txtvalor);
	getContentPane().add(labelvalor, "4, 8, right, fill");

	txtvalor = new JTextField();
	getContentPane().add(txtvalor, "6, 8, left, default");
	txtvalor.setColumns(10);
	getValor();
	bt_enviar = new JButton("Enviar");
	bt_enviar.setVerticalAlignment(SwingConstants.TOP);
	contentPane.add(bt_enviar, "6, 10, left, bottom");
	bt_enviar.addActionListener(new ActionListener() {

boolean validador;
public void actionPerformed(ActionEvent e) {
id = Integer.parseInt(txtid.getText());
nome = txtnome.getText().toString();
Valor = Double.parseDouble(txtvalor.getText());

			BancoDados banco = new BancoDados();
			if(validador = false) { ///ira verificar se preenchir recibo corretamente  
			   id = 0;
			   nome = " ";
			   Valor = 0;
			}else 
				validador = true;
			
			try {
				banco.inserirRecibo(null);
			}catch(Exception p) {
				System.out.println("Erro"+p.getMessage());
			}
		}

	});

}

public int getId() {
	return id;

}

public String getNome() {
	return nome;
}

public double getValor() {
	return Valor;
}

try {
banco.inserirRecibo(null);
}catch(Exception p) {
System.out.println(“Erro”+p.getMessage());
}

este problema é inserir no banco.

E você quer inserir null no banco?

ai esta, no caso se bota getNome esta dado error direito

Mas você precisa criar um objeto do tipo Recibo para passar como parâmetro para o método inserirRecibo.

Posta os seus códigos atualizados, pois não tem como adivinhar o que e como você está fazendo.

esta classe atualizada recibo3

package com.recibo.Recibo;

import java.awt.EventQueue;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.DropMode;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.SwingConstants;

import javax.swing.border.EmptyBorder;

import com.jgoodies.forms.layout.ColumnSpec;

import com.jgoodies.forms.layout.FormLayout;

import com.jgoodies.forms.layout.FormSpecs;

import com.jgoodies.forms.layout.RowSpec;

public class Recibo3 extends JFrame {

/**

 *

 */

private static final long serialVersionUID = 1L;

private JPanel contentPane;

private JTextField txtid;

private JTextField txtnome;

private JTextField txtvalor;

private JButton bt_enviar;

private int id;

private String nome;

private double Valor;

public boolean validador;

/**

 * Launch the application.

 */

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {

        public void run() {

            try {

                Recibo3 frame = new Recibo3();

                frame.setVisible(true);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    });

}

/**

 * Create the frame.

 */

public Recibo3() {

    setOpacity(20.1f);

    setTitle("Recibo");

    setAlwaysOnTop(true);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setBounds(100, 100, 450, 300);

    contentPane = new JPanel();

    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

    setContentPane(contentPane);

    contentPane.setLayout(new FormLayout(

            new ColumnSpec[] { FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(49dlu;default)"),

                    FormSpecs.RELATED_GAP_COLSPEC, FormSpecs.DEFAULT_COLSPEC, FormSpecs.RELATED_GAP_COLSPEC,

                    ColumnSpec.decode("default:grow"), },

            new RowSpec[] { FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,

                    FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC,

                    FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC,

                    FormSpecs.DEFAULT_ROWSPEC, }));

    JLabel labeid = new JLabel("Codigo :");

    getContentPane().add(labeid, "4, 4, right, default");

    getId();

    txtid = new JTextField();

    txtid.setDropMode(DropMode.ON);

    getContentPane().add(txtid, "6, 4, left, bottom");

    txtid.setColumns(10);

    JLabel labelnome = new JLabel("Nome beneficiario:");

    labelnome.setLabelFor(txtnome);

    getContentPane().add(labelnome, "4, 6, right, default");

    txtnome = new JTextField();

    getContentPane().add(txtnome, "6, 6, left, default");

    txtnome.setColumns(20);

    getNome();

    JLabel labelvalor = new JLabel("valor");

    labelvalor.setLabelFor(txtvalor);

    getContentPane().add(labelvalor, "4, 8, right, fill");

    txtvalor = new JTextField();

    getContentPane().add(txtvalor, "6, 8, left, default");

    txtvalor.setColumns(10);

    getValor();

    bt_enviar = new JButton("Enviar");

    bt_enviar.setVerticalAlignment(SwingConstants.TOP);

    contentPane.add(bt_enviar, "6, 10, left, bottom");

    bt_enviar.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            id = Integer.parseInt(txtid.getText());

            nome = txtnome.getText().toString();

            Valor = Double.parseDouble(txtvalor.getText());

            BancoDados recibo = new BancoDados();

            if (validador = false) {

                id = 0;

                nome = " ";

                Valor = 0;

            } else

                validador = true;

            try {

                recibo.inserirRecibo(id, nome, Valor);

            } catch (Exception p) {

                System.out.println("Erro" + p.getMessage());

            }

        }

    });

}

public int getId() {

    return id;

}

public String getNome() {

    return nome;

}

public double getValor() {

    return Valor;

}

}

Então eu uso windowbulder no eclipse, não sei terei que outro layout, swing normalmente complicado você precisar layout fique certinho.

FormLayout do pacote JGoodies.
se caso tenha eclipe e extensao windosBuilder instalado tenta ai exercuta ai.

package com.recibo.Recibo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

public final class BancoDados {

private final Connection connection;



public BancoDados() {

    try {

        String servidor = "jdbc::mysql//127.0.0.1:3306/gerador";

        String usuario = "root";

        String senha = "admin";

        String driver = "com.mysql.jdbc.Driver";

        Class.forName(driver);

        connection = DriverManager.getConnection(servidor, usuario, senha);

    } catch (Exception e) {

        e.printStackTrace();

        throw new RuntimeException("Nao foi possivel conectar ao banco de dados", e);

    }

}



public void inserirRecibo(int id, String nome, double valor) {

   

    Recibo3 recibo = new Recibo3();

    try {

        // query a ser executada no banco de dados

        String query = "INSERT INTO RECIBO (id,nome, valor) VALUES (?,?,?)"; // cada ? vai receber um valor

       

        PreparedStatement stmt  = connection.prepareStatement(query);

       

        stmt.setInt(0, recibo.getId());

        stmt.setString(1, recibo.getNome());  

        stmt.setDouble(2, recibo.getValor());

        stmt.executeUpdate();

        stmt.close();

    } catch (Exception p) {

        p.printStackTrace();

    }

}

versão atualizada

Prezado, essa classe Recibo3 é uma tela, faz parte da camada view de sua aplicação.
Você não criou uma classe Recibo na camada model?
Deveria ter criado, contendo os atributos que representam um recibo.

boa noite, camada modelo ou model, precisei de um tempo ainda não chegou nenhuma matéria da faculdade que trata desse tipo de aplicação.
não sei se trata camada model mas criei uma classe chamada Recibomodel

package com.recibo;

public class Recibomold {
public Recibo iniciar = new Recibo();

public Recibomold() {
	
	iniciar.start(); //iniciar aplicação do projeto..
	
}

public static void main(String[] args) {
	new Recibomold(); // constructor da classe 
			
	
}
    public int getId() {
    	int id = iniciar.id;
		return id;
	}
           
    public String getNome() {
    	String nome = iniciar.nome;
    	return nome;
    }
    
    public double getvalor() {
    	double valor = iniciar.valor;
    	return valor;
    }

}

Outra coisa gostaria comenta aqui, um error esta ocorrendo classe referente banco de dados

java.sql.sqlexception: parameter index out of range (1 > number of parameters, which is 0).

Com certeza deve ser Ue mas classe da aplicação view mudou? sim tive mudar Layout acabou dando uma quebra na aplicação.
GroupLayout não se conhece…

Poxa muito ocupado com faculdade mas enfim havia pegado um projeto semelhante a esse.
Como a linguagem Java foi criado atráves do c++.
1° getId não existe nenhuma lógica e uso já que em Java não pode inserir elemento tipo Int como chave primária.

Então foi necessário criar numa estrutura de repetição, baseando naturalmente como uma Lista.

List id = new Arrylist();

for(int i = 0; i:id ; i++){
String query = “INSERT INTO RECIBO (id,nome, valor) VALUES (?,?,?)”; // cada ? vai receber um valor
PreparedStatement stmt
= connection.prepareStatement(query);
stmt.setInt(i, id);

    stmt.setString(i, recibo.getNome());  

    stmt.setDouble(i, recibo.getValor());

    stmt.executeUpdate();

    stmt.close();

}

} catch (Exception p) {

    p.printStackTrace();

}