Programando um CRUD - problema no insert com PK inteiro e campos boolean

Cordiais saudações, povo do GUJ.

Durante a execução de um insert apareceu o seguinte erro:

Java.sql.SQLException: Column count doesn’t match value count at row 1

Abaixo tem o trecho de código da classe DAO onde ocorre o erro, gostaria que notassem que o arquivo do MySQL tem a chave primaria como integer e possui vários campos boolean. Vou mandar junto a classe MODEL que forma os getters and setters.

package dao;

import model.Usuarios;
import empresaiv.BD;
import java.sql.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class UsuariosDAO {
    
    public Usuarios usuario;
    public BD bd;
    private PreparedStatement statement;
    private ResultSet resultSet;
    private String men, sql;
    public static final byte INCLUSAO = 1;
    public static final byte ALTERACAO = 2;
    public static final byte EXCLUSAO = 3;
    
    public UsuariosDAO() {
        bd = BD.getInstance();
        usuario = new Usuarios();
    }
    
    public boolean localizar() {
        sql = "select * from usuarios where nome = ?";
        try {
            statement = bd.connection.prepareStatement(sql);
            statement.setString(1, String.valueOf(usuario.getNome()));
            resultSet = statement.executeQuery();
            resultSet.next();
            usuario.setId(Integer.parseInt(resultSet.getString(1)));
            usuario.setNome(resultSet.getString(2));
            usuario.setSenha(resultSet.getString(3));
            usuario.setCadastroClientes(Boolean.valueOf(resultSet.getString(4)));
            usuario.setCadastroFornecedores(Boolean.valueOf(resultSet.getString(5)));
            usuario.setCadastroProdutos(Boolean.valueOf(resultSet.getString(6)));
            usuario.setCadastroCategoria(Boolean.valueOf(resultSet.getString(7)));
            usuario.setCadastroEnderecoEntregaCliente(Boolean.valueOf(resultSet.getString(8)));
            usuario.setCadastroEnderecoEntregaFornecedor(Boolean.valueOf(resultSet.getString(9)));
            usuario.setCadastroFornecedoresProduto(Boolean.valueOf(resultSet.getString(10)));
            usuario.setCadastroUnidades(Boolean.valueOf(resultSet.getString(11)));
            usuario.setPedidoCliente(Boolean.valueOf(resultSet.getString(12)));
            usuario.setPedidoFornecedor(Boolean.valueOf(resultSet.getString(13)));
            usuario.setConsultaClientes(Boolean.valueOf(resultSet.getString(14)));
            usuario.setConsultaFornecedor(Boolean.valueOf(resultSet.getString(15)));
            usuario.setConsultaProduto(Boolean.valueOf(resultSet.getString(16)));
            usuario.setConsultaCategoria(Boolean.valueOf(resultSet.getString(17)));
            usuario.setConsultaEnderecoEntregaCliente(Boolean.valueOf(resultSet.getString(18)));
            usuario.setConsultaEnderecoEntregaFornecedor(Boolean.valueOf(resultSet.getString(19)));
            usuario.setRelatorioClientes(Boolean.valueOf(resultSet.getString(20)));
            usuario.setRelatorioFornecedor(Boolean.valueOf(resultSet.getString(21)));
            usuario.setRelatorioProduto(Boolean.valueOf(resultSet.getString(22)));
            usuario.setRelatorioCategoria(Boolean.valueOf(resultSet.getString(23)));
            usuario.setRelatorioUnidades(Boolean.valueOf(resultSet.getString(24)));
            return true;
        } catch(SQLException erro) {
            System.out.println("erro: " + erro.toString() + sql + usuario.getId());
            return false;
        }
    }

    public String atualizar(int operacao) {
        men = "Operação realizada com sucesso!";
        try {
            if(operacao == INCLUSAO) {
                sql = "insert into usuarios values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
                                                + " ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
                                                + " ?, ?, ?)";
                statement = bd.connection.prepareStatement(sql);
                
                //statement.setString(1, categoria.getId());
                
                statement.setString(1,usuario.getNome());
                statement.setString(2,usuario.getSenha());
                statement.setString(3,String.valueOf(usuario.isCadastroClientes()));
                statement.setString(4,String.valueOf(usuario.isCadastroFornecedores()));
                statement.setString(5,String.valueOf(usuario.isCadastroProdutos()));
                statement.setString(6,String.valueOf(usuario.isCadastroCategoria()));
                statement.setString(7,String.valueOf(usuario.isCadastroEnderecoEntregaCliente()));
                statement.setString(8,String.valueOf(usuario.isCadastroEnderecoEntregaFornecedor()));
                statement.setString(9,String.valueOf(usuario.isCadastroFornecedoresProduto()));
                statement.setString(10,String.valueOf(usuario.isCadastroUnidades()));
                statement.setString(11,String.valueOf(usuario.isPedidoCliente()));
                statement.setString(12,String.valueOf(usuario.isPedidoFornecedor()));
                statement.setString(13,String.valueOf(usuario.isConsultaClientes()));
                statement.setString(14,String.valueOf(usuario.isConsultaFornecedor()));
                statement.setString(15,String.valueOf(usuario.isConsultaProduto()));
                statement.setString(16,String.valueOf(usuario.isConsultaCategoria()));
                statement.setString(17,String.valueOf(usuario.isConsultaEnderecoEntregaCliente()));
                statement.setString(18,String.valueOf(usuario.isConsultaEnderecoEntregaFornecedor()));
                statement.setString(19,String.valueOf(usuario.isRelatorioClientes()));
                statement.setString(20,String.valueOf(usuario.isRelatorioFornecedor()));
                statement.setString(21,String.valueOf(usuario.isRelatorioProduto()));
                statement.setString(22,String.valueOf(usuario.isRelatorioCategoria()));
                statement.setString(23,String.valueOf(usuario.isRelatorioUnidades()));
            } else if(operacao == ALTERACAO) {
                sql = "update categorias set nome = ?,"
                    + " senha = ?,"
                    + " cadastroClientes = ? "
                    + " cadastroFornecedores = ?,"
                    + " cadastroProdutos = ?,"
                    + " cadastroCategoria = ?,"
                    + " cadastroEnderecoEntregaCliente = ?,"
                    + " cadastroEnderecoEntregaFornecedor = ?,"
                    + " cadastroFornecedoresProduto = ?,"
                    + " cadastroUnidades = ?,"
                    + " pedidoCliente = ?,"
                    + " pedidoFornecedor = ?,"
                    + " consultaClientes = ?,"
                    + " consultaFornecedor = ?,"
                    + " consultaProduto = ?,"
                    + " consultaCategoria = ?,"
                    + " consultaEnderecoEntregaCliente = ?,"
                    + " consultaEnderecoEntregaFornecedor = ?,"
                    + " relatorioClientes = ?,"
                    + " relatorioFornecedor = ?,"
                    + " relatorioProduto = ?,"
                    + " relatorioCategoria = ?,"
                    + " relatorioUnidades = ?"
                    + " where id = ?";

                statement = bd.connection.prepareStatement(sql);
                statement.setString(1, usuario.getNome());
                statement.setString(2, usuario.getSenha());
                statement.setString(3, String.valueOf(usuario.isCadastroClientes()));
                statement.setString(4, String.valueOf(usuario.isCadastroFornecedores()));
                statement.setString(5, String.valueOf(usuario.isCadastroProdutos()));
                statement.setString(6, String.valueOf(usuario.isCadastroCategoria()));
                statement.setString(7, String.valueOf(usuario.isCadastroEnderecoEntregaCliente()));
                statement.setString(8, String.valueOf(usuario.isCadastroEnderecoEntregaFornecedor()));
                statement.setString(9, String.valueOf(usuario.isCadastroFornecedoresProduto()));
                statement.setString(10, String.valueOf(usuario.isCadastroUnidades()));
                statement.setString(11, String.valueOf(usuario.isPedidoCliente()));
                statement.setString(12, String.valueOf(usuario.isPedidoFornecedor()));
                statement.setString(13, String.valueOf(usuario.isConsultaClientes()));
                statement.setString(14, String.valueOf(usuario.isConsultaFornecedor()));
                statement.setString(15, String.valueOf(usuario.isConsultaProduto()));
                statement.setString(16, String.valueOf(usuario.isConsultaCategoria()));
                statement.setString(17, String.valueOf(usuario.isConsultaEnderecoEntregaCliente()));
                statement.setString(18, String.valueOf(usuario.isConsultaEnderecoEntregaFornecedor()));
                statement.setString(19, String.valueOf(usuario.isRelatorioClientes()));
                statement.setString(20, String.valueOf(usuario.isRelatorioFornecedor()));
                statement.setString(21, String.valueOf(usuario.isRelatorioProduto()));
                statement.setString(22, String.valueOf(usuario.isRelatorioCategoria()));
                statement.setString(23, String.valueOf(usuario.isRelatorioUnidades()));
                statement.setString(24, String.valueOf(usuario.getId()));
            } else if(operacao == EXCLUSAO) {
                sql = "delete from categorias where id = ?";
                statement = bd.connection.prepareStatement(sql);
                statement.setString(1, String.valueOf(usuario.getId()));
            }
            
            if(statement.executeUpdate() == 0) {
                men = "Falha na operação!";
            }
            
        } catch (SQLException erro) {
            men = "Falha na operação! " + erro.toString()+" "+sql;
        }
        
        return men;
        
    }
    
}

/*
id int AI PK 
Nome varchar(50) 
senha varchar(50) 
cadastroClientes tinyint(1) 
cadastroFornecedores tinyint(1) 
cadastroProdutos tinyint(1) 
cadastroCategoria tinyint(1) 
cadastroEnderecoEntregaCliente tinyint(1) 
cadastroEnderecoEntregaFornecedor tinyint(1) 
cadastroFornecedoresProduto tinyint(1) 
cadastroUnidades tinyint(1) 
pedidoCliente tinyint(1) 
pedidoFornecedor tinyint(1) 
consultaClientes tinyint(1) 
consultaFornecedor tinyint(1) 
consultaProduto tinyint(1) 
consultaCategoria tinyint(1) 
consultaEnderecoEntregaCliente tinyint(1) 
consultaEnderecoEntregaFornecedor tinyint(1) 
relatorioClientes tinyint(1) 
relatorioFornecedor tinyint(1) 
relatorioProduto tinyint(1) 
relatorioCategoria tinyint(1) 
relatorioUnidades tinyint(1)
*/

Separação das duas classes DAO e MODEL

package model;

/**
 *
 * @author Ronaldo Rodrigues Godoi
 */
public class Usuarios {
    private int id;
    private String nome, senha;
    private boolean cadastroClientes, cadastroFornecedores, cadastroProdutos,
            cadastroCategoria, cadastroEnderecoEntregaCliente, 
            cadastroEnderecoEntregaFornecedor, cadastroFornecedoresProduto,
            cadastroUnidades, pedidoCliente, pedidoFornecedor, consultaClientes,
            consultaFornecedor, consultaProduto, consultaCategoria,
            consultaEnderecoEntregaCliente, consultaEnderecoEntregaFornecedor,
            relatorioClientes, relatorioFornecedor, relatorioProduto, 
            relatorioCategoria, relatorioUnidades;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public boolean isCadastroClientes() {
        return cadastroClientes;
    }

    public void setCadastroClientes(boolean cadastroClientes) {
        this.cadastroClientes = cadastroClientes;
    }

    public boolean isCadastroFornecedores() {
        return cadastroFornecedores;
    }

    public void setCadastroFornecedores(boolean cadastroFornecedores) {
        this.cadastroFornecedores = cadastroFornecedores;
    }

    public boolean isCadastroProdutos() {
        return cadastroProdutos;
    }

    public void setCadastroProdutos(boolean cadastroProdutos) {
        this.cadastroProdutos = cadastroProdutos;
    }

    public boolean isCadastroCategoria() {
        return cadastroCategoria;
    }

    public void setCadastroCategoria(boolean cadastroCategoria) {
        this.cadastroCategoria = cadastroCategoria;
    }

    public boolean isCadastroEnderecoEntregaCliente() {
        return cadastroEnderecoEntregaCliente;
    }

    public void setCadastroEnderecoEntregaCliente(boolean cadastroEnderecoEntregaCliente) {
        this.cadastroEnderecoEntregaCliente = cadastroEnderecoEntregaCliente;
    }

    public boolean isCadastroEnderecoEntregaFornecedor() {
        return cadastroEnderecoEntregaFornecedor;
    }

    public void setCadastroEnderecoEntregaFornecedor(boolean cadastroEnderecoEntregaFornecedor) {
        this.cadastroEnderecoEntregaFornecedor = cadastroEnderecoEntregaFornecedor;
    }

    public boolean isCadastroFornecedoresProduto() {
        return cadastroFornecedoresProduto;
    }

    public void setCadastroFornecedoresProduto(boolean cadastroFornecedoresProduto) {
        this.cadastroFornecedoresProduto = cadastroFornecedoresProduto;
    }

    public boolean isCadastroUnidades() {
        return cadastroUnidades;
    }

    public void setCadastroUnidades(boolean cadastroUnidades) {
        this.cadastroUnidades = cadastroUnidades;
    }

    public boolean isPedidoCliente() {
        return pedidoCliente;
    }

    public void setPedidoCliente(boolean pedidoCliente) {
        this.pedidoCliente = pedidoCliente;
    }

    public boolean isPedidoFornecedor() {
        return pedidoFornecedor;
    }

    public void setPedidoFornecedor(boolean pedidoFornecedor) {
        this.pedidoFornecedor = pedidoFornecedor;
    }

    public boolean isConsultaClientes() {
        return consultaClientes;
    }

    public void setConsultaClientes(boolean consultaClientes) {
        this.consultaClientes = consultaClientes;
    }

    public boolean isConsultaFornecedor() {
        return consultaFornecedor;
    }

    public void setConsultaFornecedor(boolean consultaFornecedor) {
        this.consultaFornecedor = consultaFornecedor;
    }

    public boolean isConsultaProduto() {
        return consultaProduto;
    }

    public void setConsultaProduto(boolean consultaProduto) {
        this.consultaProduto = consultaProduto;
    }

    public boolean isConsultaCategoria() {
        return consultaCategoria;
    }

    public void setConsultaCategoria(boolean consultaCategoria) {
        this.consultaCategoria = consultaCategoria;
    }

    public boolean isConsultaEnderecoEntregaCliente() {
        return consultaEnderecoEntregaCliente;
    }

    public void setConsultaEnderecoEntregaCliente(boolean consultaEnderecoEntregaCliente) {
        this.consultaEnderecoEntregaCliente = consultaEnderecoEntregaCliente;
    }

    public boolean isConsultaEnderecoEntregaFornecedor() {
        return consultaEnderecoEntregaFornecedor;
    }

    public void setConsultaEnderecoEntregaFornecedor(boolean consultaEnderecoEntregaFornecedor) {
        this.consultaEnderecoEntregaFornecedor = consultaEnderecoEntregaFornecedor;
    }

    public boolean isRelatorioClientes() {
        return relatorioClientes;
    }

    public void setRelatorioClientes(boolean relatorioClientes) {
        this.relatorioClientes = relatorioClientes;
    }

    public boolean isRelatorioFornecedor() {
        return relatorioFornecedor;
    }

    public void setRelatorioFornecedor(boolean relatorioFornecedor) {
        this.relatorioFornecedor = relatorioFornecedor;
    }

    public boolean isRelatorioProduto() {
        return relatorioProduto;
    }

    public void setRelatorioProduto(boolean relatorioProduto) {
        this.relatorioProduto = relatorioProduto;
    }

    public boolean isRelatorioCategoria() {
        return relatorioCategoria;
    }

    public void setRelatorioCategoria(boolean relatorioCategoria) {
        this.relatorioCategoria = relatorioCategoria;
    }

    public boolean isRelatorioUnidades() {
        return relatorioUnidades;
    }

    public void setRelatorioUnidades(boolean relatorioUnidades) {
        this.relatorioUnidades = relatorioUnidades;
    }
}

/*
id int AI PK 
Nome varchar(50) 
senha varchar(50) 
cadastroClientes tinyint(1) 
cadastroFornecedores tinyint(1) 
cadastroProdutos tinyint(1) 
cadastroCategoria tinyint(1) 
cadastroEnderecoEntregaCliente tinyint(1) 
cadastroEnderecoEntregaFornecedor tinyint(1) 
cadastroFornecedoresProduto tinyint(1) 
cadastroUnidades tinyint(1) 
pedidoCliente tinyint(1) 
pedidoFornecedor tinyint(1) 
consultaClientes tinyint(1) 
consultaFornecedor tinyint(1) 
consultaProduto tinyint(1) 
consultaCategoria tinyint(1) 
consultaEnderecoEntregaCliente tinyint(1) 
consultaEnderecoEntregaFornecedor tinyint(1) 
relatorioClientes tinyint(1) 
relatorioFornecedor tinyint(1) 
relatorioProduto tinyint(1) 
relatorioCategoria tinyint(1) 
relatorioUnidades tinyint(1)
*/

O que está errado para não ocorrer a inserção do registro?
Atenciosamente,
Ronaldo

Pelo o que vc mandou, eu consigo assumir que o erro surge pq vc não especificou as colunas que estão sendo inseridas para o novo registro. Se seu id é auto-incremento vc vai precisar fazer isso para poder omiti-lo no insert. No erro é dito que a quantidade de colunas não bate por causa disso. Vc manda 23 parâmetros, mas como o insert não especifica as colunas, ele está esperando 24 (com o id).

Uma tabela com tantos atributos assim cheira a falta de normalização. Parece que vc está projetando algum tipo de subsistema de permissões correto? Não dá para melhorar isso não? Ter uma tabela de permissões e então amarrar usuários a permissões com um relacionamento n-m?

Procure postar mais informações do erro. Outra coisa, os SGBDs suportam o tipo boolean, cada um da sua forma, e o seu driver JDBC consegue fazer a serialização/deserialização apropriadamente. Ficar lidando com Strings e conversões para lá e para cá é perda de tempo.

1 curtida

Muito obrigado pela atenção.

Você pode contar 23 interrogações no comando insert. O interrogação 24 não existe justamente porque a tabela tem PK integer auto incremento.

Atenciosamente,
Ronaldo

quando voce nao vai inserir no banco todos as colunas da tabela, voce precisa adicionar o nome das coluanas no insert. por isso esta dando o problema.

nesse caso voce tem duas opcoes. alterar o insert para

insert into usuarios (nome, senha,cadastroClientes,...) values (?,?,?,...)

ou voce pode colocar as 24 ? e passar o id como 0, que o banco gera o auto incremento

String sql = "insert into usuario (?,?,?,...)";
statement.setInt(1,0);
statement.setString(2,usuario.getNome());
statement.setString(3,usuario.getSenha());
//...
1 curtida

Perfeito, parece que a estratégia de citar todos os campos que deveriam ser inseridos deu certo, thimor. Porém apareceu outro erro. Veja só a situação:

O MySQL criou um campo tinyint(1) quando eu mandei ele criar boolean e este campo não está aceitando o argumento true, são uns vinte campos boleanos que estão como tinyint(1). O que eu devo fazer?

Veja a mensagem de erro que o programa responde:
java.sql.SQLException: Incorrect integer value: ‘true’ for column ‘cadastroClientes’ at row 1

Atenciosamente,
Ronaldo

1 curtida

O MySQL utiliza o menor tipo inteiro possível para representar colunas boolean, nesse caso serão TinyInt de tamanho 1.

Mas o Driver JDBC sabe receber um boolean e tratar corretamente.

Tem certeza de que está usando o statement.setBoolean ou está setando tudo com statement.setString?

1 curtida

Staroski, eu não sabia da existência deste comando setBoolean, usei e deu certo. Obrigado.
Ronaldo

1 curtida

Isso não é um comando, é um método da classe PreparedStatement.
Aliás essa classe existe justamente para você setar diferentes tipos de dado nos parâmetros de uma query.
Recomendo sempre consultar a documentação das classes que utiliza.

e tambem nao pode ser um statement.setInt(), tem que ser setBoolean()