meu banco esta gravando a string null nos campos null.
alguem sabe pq??
banco: mysql
linguagem: JSP
abs
meu banco esta gravando a string null nos campos null.
alguem sabe pq??
banco: mysql
linguagem: JSP
abs
o meu insert ta mandando ‘null’ nos campos… ai ele salva como string ‘null’.
pois eu monto a string = "insert into tblprodutotejofran (nome, descricao) values " + “(’” + obj.getNome()+ “’,’” + obj.getDesc() + “’)”;
e se um deles for null… eu acabo salvando no banco como string… alguem tem alguma idéia para não salvar essas strings?
abs
Bom, do jeito que você está fazendo ele vai sempre inserir o valor do objeto e vai colocar como String porque você o coloca dentro dos apostrofos. Valide seus campos antes de chamar o SQL com, por exemplo:
if (!obj.getNome().equals(null) && !obj.getDesc().equals(null))
Se seu java for acmia de 1.5, voce pode usar o método isEmpty() da classe String.
eu to fazendo isso… mas no banco vai ficar “null” mesmo… como string ???
Então, para evitar isso, só chama o insert somente se obj.getNome() e obju.getDesc() não forem null.
Se um deles for, tenta voltar uma mensagem , tipo, não há um nome ou uma descrição…
Faça a inserção usando um PreparedStatement. Aí vc retira essa concatenação de String, que além de feia, está sujeita a dependency injection. Sem falar que você evita o problema de alguém resolver colocar um ’ na descrição e ferrar com seu SQL.
PreparedStatement stmt = conn.prepareStatement("insert into tblprodutotejofran (nome, descricao) values(?, ?)");
stmt.setString(1, obj.getNome());
stmt.setString(2, obj.getDesc());
stmt.executeUpdate();
A conversão implícita do valor null é o texto “null”. Por isso sua concatenação não funciona.
É assim como foi falado acima se você mandar null para uma coluna, o próprio banco vai “escrever” null. É mecanismo dele próprio.
[quote=ViniGodoy]Faça a inserção usando um PreparedStatement. Aí vc retira essa concatenação de String, que além de feia, está sujeita a dependency injection. Sem falar que você evita o problema de alguém resolver colocar um ’ na descrição e ferrar com seu SQL.
PreparedStatement stmt = conn.prepareStatement("insert into tblprodutotejofran (nome, descricao) values(?, ?)");
stmt.setString(1, obj.getNome());
stmt.setString(2, obj.getDesc());
A conversão implícita do valor null é o texto “null”. Por isso sua concatenação não funciona. [/quote]
O Vini tem razão. São muitos os sistemas vulneráveis a SQL Injection. Mas, no caso, também é necessária a validação de informação se seus campos no banco são NOT NULL. Se você usa um framework ORM, provavelmente vai ter um Annotation la que previne isso.
Não é um mecanismo do banco, mas a conversão implícita de null em string do Java. Veja:
String a = null;
String x = "O valor de a é: " + a; //Imprime "O valor de a é null"
O banco, por si só, aceita null, tanto que o código com o PreparedStatement irá funcionar tranquilamente, inserindo o valor null (e não a palavra null) na coluna. O problema está no fato dele estar montando a String do sql dele através de concatenação, o que força a conversão implícita do valor de obj.getNome() ou obj.getDesc().
E a montagem ainda é feita entre ‘’. Se houver nulos, o string final dele fica assim:
insert into tblprodutotejofran (nome, descricao) values(‘null’, ‘null’)
Que é exatamente pedir para o banco cadastrar a palavra “null” nos campos.
Não é um mecanismo do banco, mas a conversão implícita de null em string do Java. Veja:
String a = null;
String x = "O valor de a é: " + a; //Imprime "O valor de a é null"
O banco, por si só, aceita null, tanto que o código com o PreparedStatement irá funcionar tranquilamente, inserindo o valor null (e não a palavra null) na coluna. O problema está no fato dele estar montando a String do sql dele através de concatenação, o que força a conversão implícita do valor de obj.getNome() ou obj.getDesc().
E a montagem ainda é feita entre ‘’. Se houver nulos, o string final dele fica assim:
insert into tblprodutotejofran (nome, descricao) values(‘null’, ‘null’)
Que é exatamente pedir para o banco cadastrar a palavra “null” nos campos.[/quote]
Pelo que você disse o próprio JDBC manda uma string “null” para o banco, mas ainda sim se você tentar inserir direto no console do banco alguma linha omitindo uma coluna nullable o próprio banco vai escrever null, não?
Até onde eu sei, o banco nunca escreverá ‘null’ sozinho (a menos que seja algum recurso de um BD estranho por aí). Se tem escrito null numa coluna, foi pq vc mandou ele gravar isso, como fez o colega na hora que montou a String dele.
O JDBC, usando PreparedStatement, vai mandar o valor null para o banco, associado ao seu tipo de dado. O banco então irá gravar o valor null se a coluna assim o permitir, ou lançar uma exception, se não permitir.
No caso, usando executeQuery direto (como o colega fez) o texto null será mandado. Mas não por causa do java, e sim, pq a String que ele montou está errada. Ele até poderia tratar para que a palavra null não ficasse entre aspas simples, como ela está ficando agora, mas o tratamento já torna o código mais confuso do que usar o PreparedStatement de uma vez.
Até onde eu sei, o banco nunca escreverá ‘null’ sozinho (a menos que seja algum recurso de um BD estranho por aí). Se tem escrito null numa coluna, foi pq vc mandou ele gravar isso, como fez o colega na hora que montou a String dele.
O JDBC, usando PreparedStatement, vai mandar o valor null para o banco, associado ao seu tipo de dado. O banco então irá gravar o valor null se a coluna assim o permitir, ou lançar uma exception, se não permitir.
No caso, usando executeQuery direto (como o colega fez) o texto null será mandado. Mas não por causa do java, e sim, pq a String que ele montou está errada. Ele até poderia tratar para que a palavra null não ficasse entre aspas simples, como ela está ficando agora, mas o tratamento já torna o código mais confuso do que usar o PreparedStatement de uma vez.
[/quote]
Faça o teste aí em mysql pra você ver
mysql> create table teste(id int(10), valor varchar(10));
mysql> insert into teste (id) values(1);
mysql> select * from teste;
+------+-------+
| id | valor |
+------+-------+
| 1 | NULL |
+------+-------+
A não ser que isso só seja uma representação de “Você omitiu esse campo” realmente aparece nulo. :-o
Aquilo ali é o valor que diz que dentro do campo não tem nada. Não a string null.
São mesmo coisas diferentes.
Tanto que se vc fizer:
SELECT * FROM Teste WHERE valor LIKE ‘NU%’;
Ele não selecionará a coluna 1. Se lá dentro tivesse a string ‘NULL’ selecionaria.
Sim, use PreparedStatement. Não use drogas.
PreparedStatement forever
boa… vou usar o PreparedStatement…
pq alguns campos podem ser null…
vlw