Dúvida montando sql

Bom dia pessoal!!
Estou fazendo um rotina para inserir dados no banco, e estou montando o sql. Alguns campos do formulário não são obrigatórios, se eles não forem preenchidos, quero que eles fiquem NULL.

Gostaria de saber se existe uma maneira mais simples do que a que estou fazendo

[code]
private void inserir() {
try {
StringBuilder sql1 = null;
StringBuilder sql2 = null;

        sql1.append("insert into Produtos(Codigo_Barras, Descricao, Descricao_Reduzida, ");
        sql2.append("' ");
        sql2.append(txtCodigoBarras.getText().trim());
        sql2.append("', '");
        sql2.append(txtDescricao.getText().trim());
        sql2.append("', '");
        sql2.append(txtDescricaoReduzida.getText().trim());
        sql2.append("', ");
        if (txtFabricacao.getText().trim().length() > 0) {
            sql1.append("Fabricacao, ");
            sql2.append("'");
            sql2.append(txtValidade.getText().trim());
            sql2.append("',");
        }
        if (txtValidade.getText().trim().length() > 0) {
            sql1.append("Validade, ");
            sql2.append(txtValidade.getText().trim());
            sql2.append(",");
        }

[/code]Grato

Bom dia.
Não sei a possibilidade de usar o pacote SQL do Java, mas se puder usar, mesmo que não use realmente uma conexão, use o PreparedStatement.
Ex:

   PreparedStatement pstmt = con.prepareStatement("INSERT INTO Produtos(Codigo_Barras, Descricao) VALUES (?, ?)");
   String codigo = txtCodigoBarras.getText().trim().lenght() > 0 ? txtCodigoBarras.getText().trim() : null;
   String descricao = txtDescricao.getText().trim().lenght() > 0 ? txtDescricao.getText().trim() : null;
   pstmt.setString(1, codigo)
   pstmt.setString(1, descricao)

http://java.sun.com/j2se/1.3/docs/api/java/sql/PreparedStatement.html

Uma das melhores idéias é utilizar um ORM como o HIBERNATE.

Fora isso existem outras idéias como esta:

Você cria uma classe que gera uma objeto especialista em manipular strings que representa uma instrução sql (acho que tem APIs para isso).
Então vc utilizaria a coisa + ou - desta maneira:

[code]String sql = “Select t.id, t.nome, t.endereco from tabela t where t.valor >= :paramA and t.valor <= :paramB”

YourMagicClass yourMagicObject = new YourMagicClass(sql);

yourMagicObject.setDouble(“paramA”, valorA );
yourMagicObject.setDouble(“paramB”, valorB );

String sql = yourMagicObject.getSql();
[/code]
Daqui por diante é só aplicar o sql resultante no banco de dados e pronto.

Se algum dos parametros não for informado o objeto tem que ser esperto o suficiente para não considera-lo na instrução resultante.

Espero ter ajudado.

flws

Estou seguindo a idéia do bzy, porém não estou conseguindo formatar a data

DateFormat df = new SimpleDateFormat(“dd/MM/yyyy”);
pstmt.setDate(5,(Date) df.parse(txtFabricacao.getText()));

assim que eu fazer rodar coloco o resto do código aqui

		SimpleDateFormat d = new SimpleDateFormat("dd/MM/yyyy");
		Date dd;
		try {
			dd = d.parse(txtFabricacao.getText());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Não consegui converter o string vindo do jtextfield para data, não teve jeito :frowning:
fiz assim para testar o código, e esta inserindo blz, porém teria que acertar essa captura da data

      private void inserir() {
        Connection conexao = new Conexao().getConexao();
        PreparedStatement pstmt;         
        try {
            String query = ("INSERT INTO Produtos(Codigo_Barras, Descricao, Descricao_Reduzida," +
                    " Validade, Fabricacao, Valor_Prod, Nome_Fabricante, Nome_Fornecedor, " +
                    "Cod_Departamento, und_medida, Porcao, Valor_Calorico, Carboidratos, " +
                    "Proteinas, Gorduras_Totais, Gorduras_Saturadas, Gorduras_Trans, " +
                    "Fibra_Alimentar, Calcio, Ferro, Msg_Conservacao, Msg_Promocional, Receita)" +
                    " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            pstmt = conexao.prepareStatement(query);
            pstmt.setString(1, txtCodigoBarras.getText());
            pstmt.setString(2, txtDescricao.getText());
            pstmt.setString(3, txtDescricaoReduzida.getText());
            pstmt.setInt(4, Integer.parseInt(txtValidade.getText()));
            pstmt.setString(5,"2008/01/01");
            pstmt.setFloat(6, Float.parseFloat(txtValor.getText()));
            pstmt.setString(7, txtFabricante.getText());
            pstmt.setString(8, txtFornecedor.getText());
            pstmt.setInt(9, 1);
            pstmt.setString(10, txtUndMedida.getText());
            pstmt.setInt(11, Integer.parseInt(txtPorcao.getText()));
            pstmt.setInt(12, Integer.parseInt(txtValor_Calorico.getText()));
            pstmt.setFloat(13, Float.parseFloat(txtCarboidratos.getText()));
            pstmt.setFloat(14, Float.parseFloat(txtProteinas.getText()));
            pstmt.setFloat(15, Float.parseFloat(txtGorduras_Totais.getText()));
            pstmt.setFloat(16, Float.parseFloat(txtGorduras_Saturadas.getText()));
            pstmt.setFloat(17, Float.parseFloat(txtGorduras_Trans.getText()));
            pstmt.setFloat(18, Float.parseFloat(txtFibra_Alimentar.getText()));
            pstmt.setFloat(19, Float.parseFloat(txtCalcio.getText()));
            pstmt.setInt(20, Integer.parseInt(txtFerro.getText()));
            pstmt.setString(21, txtMsgConservacao.getText());
            pstmt.setString(22, txtMsgPromocional.getText());
            pstmt.setString(23, txtIngredientes.getText());
            pstmt.executeUpdate();
            clearAllTextComponents(this);
        } catch (SQLException ex) {
            Logger.getLogger(Produtos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

a

Esse código não é recomendado:

	String[] arr = txtFabricacao.getText().split("/");//Supondo: 19/02/2009
	String d = arr[2] + "/" + arr[1] + "/" +arr[0];//Formato para  o banco: 2009/02/19
	....
	pstmt.setString(5, d);
	...