Duvida: gerar numeros

Tenho um cadastro de clientes, toda vez que eu salvo no banco de dados quero que ele gere um numero de controle, por exemplo:

nome: guj
codigo: 001

nome: java
codigo: 002

Isso eu faco criando uma coluna no banco de dados chamada ID ou qq nome que seja e pego esse valor e desponiobilizo para o usuário ou o java pode criar ?? Que classe ou classes eu poderia usar para fazer isso, valew

Bancos de dados normalmente têm um recurso normalmente chamado “auto-increment” ou “sequence”; depende do seu banco.
Geração de números seqüenciais normalmente deve ser deixada a cargo do banco.

seria o sql server
mas quero que quando eu faca isso o proprio banco adiciona no campo chamado ID e na proxima vez em que eu for fazer uma busca ele ja traga no campo destinado o valor determinado ! Como eu faco isso, nao sei

Com auto-increment(no caso do SQL Server) ele sempre vai te adicionar o próximo valor no campo. É como se ele fizesse um SELECT MAX(id) e acrescentasse mais um.
Basta você definir o campo como auto-increment

Segue uma classe q faz isso:

[code]/*

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
*

  • @author Rodrigo Rocha
    */
    public class Id {
    private static Conexao cx = new Conexao();
    private static Connection conexao = cx.getConexao();

    public Id() {
    }

    public Integer gerarId(String tabela, String id) throws Exception {
    Integer idGerado = null;
    ResultSet rs = null;
    PreparedStatement ps = null;
    Statement st = conexao.createStatement();

     try {
         String sql = "SELECT MAX("+id+")+1 "+id+" FROM "+tabela+" ";
         ps = conexao.prepareStatement( sql );
         rs = ps.executeQuery();
         if( rs.next() ) {
             idGerado = new Integer(rs.getInt(id));
         } else {
             idGerado = new Integer(1);
         }
     } finally {
         if(rs!=null) try { rs.close(); } catch( Exception e ) {}
         if(ps!=null) try { ps.close(); } catch( Exception e ) {}
         if(ps!=null) try { conexao.close(); } catch( Exception e ) {}
     }
     return idGerado;
    

    }
    }[/code]

Posso usar essa classe em connection pool ou devo instancia-lo na hora do meu cadastro ?

Cuidado com o tal do select max() para pegar o último valor gerado. Isso supõe que você é o único usuário do banco. Quando há vários usuários no banco, select max() dá problemas muito sérios, podendo dar resultados incorretos ou chaves duplicadas. Rolou uma thread neste forum que contava os apuros de um colega nosso que pegou um sistema que fazia exatamente isso.

Para pegar o valor gerado pela coluna com auto-increment, no caso do SQL Server, eu peço a “ajuda dos universitários”. Sei que o JDBC 3.0 tem esse recurso ( é só ver na documentação do JDBC 3.0:

Statement stmt = conn.createStatement();
// indicate that the key generated is going to be returned
int rows = stmt.executeUpdate("INSERT INTO ORDERS " +
    "(ISBN, CUSTOMERID) " +
    "VALUES (195123018, ’BILLG’)",
    Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
boolean b = rs.next();
if (b == true) {
    // retrieve the new key value
    ...
}

mas o driver da Microsoft não é JDBC 3.0; você precisaria usar o JTDS, que se não me engano implementa o JDBC 3.0.

A principio seria para uma unica pessoa inserir dados na tabela, mas a medio prazo eu faria algo que mais de um passaria a cadastrar, entao vou olhar a doc do JDBC 3.0 e o JTDS, esse ultimo eu ja vi algo, mas nunca procurei nada a respeito !

valews