Database – Sequence e Identity – Oracle – IBM DB2 – Microsoft SQL Server – Java

Publicado: 23 de setembro de 2014 em Java

Uma Sequence é um objeto de banco de dados encontrado nos bancos de dados Oracle e IBM DB2, que permite a geração automática de valores, tais como números de identificação. Sequências são ideais para a tarefa de gerar valores de chaves únicas. Os aplicativos podem usar sequências para evitar possíveis problemas de simultaneidade e de desempenho resultantes de valores de coluna. A vantagem que tem sobre as  sequências de números criados fora do banco de dados é que o servidor de banco de dados mantém o registro dos números gerados e nenhum tipo de acidente no banco de dados causará números duplicados.

Sequence - Identity - Java

Sequence – Identity – Java

Identity é encontrado no banco de dados Micosoft SQL Server e é muito similar ao Sequence e possui o mesmo objetivo que é de criar números sequenciais, porem não é um objeto do banco de dados e sim uma propriedade de uma coluna pertencente a uma tabela. Quando você insere um valor em uma tabela que possui uma propriedade Identity você deve excluir o campo referente a esta coluna da clausula SQL, sendo assim o MSSQL Server é o único banco de dados que permite que a quantidade de colunas na linha Values da instrução Insert seja diferente da quantidade de colunas na tabela do banco de dados.

sequence-3-sql-server

MSSQL – Identity – Propriedades

Para saber mais detalhes sobre os recursos dos objetos Sequences ou da propriedade Identity recomendamos que você utilize os links oficiais de cada banco de dados:

Oracle: Sequence
IBM DB2: Sequence
MSSQL Server: Identity

Algo extremamente útil sobre Sequence ou Identity

Utilizar um objeto ou uma propriedade auto incremento é o método correto para criar IDs automáticos no banco de dados, nunca utilize uma Trigger para executar este procedimento, pois deste modo você esta reduzindo sensivelmente a performance do banco de dados, visto que você precisa de acessos e objetos extras para executar a mesma função.

Para valores de Sequence ou Identity que são utilizados fora do banco de dados, por exemplo, números de sequência usados ​​para identificadores externos (números de cheques bancários ou outros), se o banco de dados é recuperado para um ponto no tempo antes de uma falha, então isso poderia causar a geração de valores duplicados para algumas sequências. Para evitar possíveis valores duplicados, bancos de dados que usam valores de sequência fora do banco de dados não deve ser recuperado para um ponto anterior no tempo.

Conectando ao Oracle, DB2 e MSSQL

Para criar a conexão com os três bancos de dados você precisa configurar seu projeto com os Providers externos de cada um dos fabricantes, você encontra um tutorial de como criar as conexões em nossas categorias SQL e Java

Conexão - External Jars

Conexão – External Jars

Exemplo:

Neste exemplo utilizamos uma Sequence para os bancos de dados Oracle e IBM DB2 e uma propriedade Identity para o banco de dados MSSQL para criar identificadores automáticos para a coluna chave de uma tabela.

SQL

Oracle

-- Cria sequencia
CREATE SEQUENCE Sequencia_seq
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela
CREATE TABLE SEQUENCIA (
   Identificador   NUMBER(10),
   Nome            VARCHAR(30),
   Sobrenome       VARCHAR(70),
   Cargo           VARCHAR(30),
   Salario         Decimal(9,2));

 -- Testa sequencia
insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56);

-- verifica resultado
SELECT * FROM SEQUENCIA

IBM DB2

-- Cria Sequencia
CREATE SEQUENCE Sequencia_seq
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela
CREATE TABLE SEQUENCIA (
   Identificador   INTEGER,
   Nome            VARCHAR(30),
   Sobrenome       VARCHAR(70),
   Cargo           VARCHAR(30),
   Salario         Decimal(9,2));

 -- Testa Sequencia
insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56);

-- Verifica resultado
Select * from SEQUENCIA;

MSSQL

-- Cria tabela / Identity
CREATE TABLE SEQUENCIA(
	Identificador int IDENTITY(1,1) NOT NULL,
	Nome          nvarchar(30) NULL,
	Sobrenome     nvarchar(70) NULL,
	Cargo         nvarchar(30) NULL,
	Salario       decimal(9, 2) NULL);

-- Testa identação
insert into SEQUENCIA VALUES ('Teste','Teste Sobrenome','Programador',2234.56);

-- Verifica tabela
select * from SEQUENCIA;

Java

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Sequence implements ActionListener, ItemListener {
    // Cria componentes
    private JTable tabela;
    private JRadioButton banco1;
    private JRadioButton banco2;
    private JRadioButton banco3;
    private JButton botao;

    // Declara objetos de conexão
    private static Connection conn;
    private static Statement query;
    private static String bancodedados;

    public void conectar(String login, String senha) {

        // Verifica strings de conexão

        // ORACLE
        if (bancodedados == "oracle") {
            try {
                // Define Driver de conexão JDBC thin
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection(
                        "jdbc:oracle:thin:@localhost:1521:xe", login, senha);

                // Executa pedido SQL
                query = conn.createStatement();

            }

            catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }

            catch (SQLException ex) {
                ex.printStackTrace();
            }
        }

        // DB2
        if (bancodedados == "db2") {
            try {
                // Define Driver de conexão JDBC
                Class.forName("com.ibm.db2.jcc.DB2Driver");
                conn = DriverManager.getConnection(
                        "jdbc:derby:net://localhost:50000/deva", login, senha);

                // Executa pedido SQL
                query = conn.createStatement();
            }

            catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }

            catch (SQLException ex) {
                 ex.printStackTrace();
            }

        }

        // MICROSOFT SQL SERVER
        if (bancodedados == "mssql") {
            try {
                // Define Driver de conexão JDBC
                String URL = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=devaberto"
                        + ";user=" + login + ";password=" + senha;

                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                conn = DriverManager.getConnection(URL);

                // Executa pedido SQL
                query = conn.createStatement();

            }

            catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }

            catch (SQLException ex) {
                ex.printStackTrace();
            }

        }

    }

    public void executaSQL(String sql)   {
        // Cria nova instrução SQL
        Statement trigger;
        ;
        try {
            trigger = conn.createStatement();
            trigger.execute(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public ResultSet retornaTabela() throws SQLException {
        // Cria nova instrução SQL
        Statement query;
        query = conn.createStatement();
        String sql;

        // Verfica banco de dados e passa script SQL
        sql = "SELECT * FROM SEQUENCIA";

        // Executa Script
        ResultSet dados = query.executeQuery(sql);

        // Retorna set de dados
        return dados;
    }

    // Modelo
    public static DefaultTableModel criaTableModel(ResultSet rs)
            throws SQLException {

        // Cria um modelo de tabela
        ResultSetMetaData metaData = rs.getMetaData();

        // Retorna as colunas
        Vector<String> colunas = new Vector<String>();

        int columnCount = metaData.getColumnCount();

        for (int column = 1; column <= columnCount; column++) {
            colunas.add(metaData.getColumnName(column));
        }

        // Retorna dados
        Vector<Vector<Object>> dados = new Vector<Vector<Object>>();

        while (rs.next()) {
            Vector<Object> vector = new Vector<Object>();

            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(rs.getObject(columnIndex));
            }
            dados.add(vector);
        }

        return new DefaultTableModel(dados, colunas);

    }

    public void itemStateChanged(ItemEvent arg0) {

        // Verifica item banco de dados selecionado
        Object fonte = arg0.getItemSelectable();
        int estado = arg0.getStateChange();

        if (estado == arg0.SELECTED) {

            if (fonte == banco1) {
                bancodedados = "oracle";
            }

            if (fonte == banco2) {
                bancodedados = "db2";
            }

            if (fonte == banco3) {
                bancodedados = "mssql";
            }

        }

    }

    public void actionPerformed(ActionEvent arg0) {
        // Efetua login no banco de dados
    	Sequence acesso = new Sequence();

        if (bancodedados == "oracle") {
            acesso.conectar("user", "p@55w0rd");
        }

        if (bancodedados == "db2") {
            acesso.conectar("user", "p@55w0rd");
        }

        if (bancodedados == "mssql") {
            acesso.conectar("user", "p@55w0rd");
        }

        try {

        	// DB2 e Oracle utilizam sequence
        	// SQL Server utiliza o Identity
        	// Como é um objeto atrelado ao campo
        	// Necessita ser suprimido da clausula SQL

        	if (bancodedados != "mssql")
        	{
        		acesso.executaSQL("insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)");
        	}
        	else
        	{
        		acesso.executaSQL("insert into SEQUENCIA VALUES (\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)");
        	}

            // Executa Intrução SQL
            tabela.setModel(criaTableModel(acesso.retornaTabela()));
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    public Container criaPainel() throws SQLException {
        // Cria painel principal
        JPanel painel = new JPanel();

        // Seleciona layout
        painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS));
        painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        // Cria painel de escolha de conexão
        JPanel pescolha = new JPanel();

        pescolha.setLayout(new BoxLayout(pescolha, BoxLayout.LINE_AXIS));
        pescolha.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        ButtonGroup grupo = new ButtonGroup();

        // Cria componentes de radio
        banco1 = new JRadioButton("Oracle");
        banco2 = new JRadioButton("IBM DB2");
        banco3 = new JRadioButton("Microsoft SQL");

        // Agrupa botões de radio
        grupo.add(banco1);
        grupo.add(banco2);
        grupo.add(banco3);

        // Cria ouvinte dos botões
        banco1.addItemListener(this);
        banco2.addItemListener(this);
        banco3.addItemListener(this);

        // Seleciona primeira conexão
        banco1.setSelected(true);

        // Adiciona botões ao painel
        pescolha.add(banco1);
        pescolha.add(banco2);
        pescolha.add(banco3);

        // Efetua primeira conexão ao banco (ORACLE)
        // caso queira mudar a conexão
        // mude o indice dos componentes de radio
        Sequence acesso = new Sequence();

        acesso.conectar("user", "p@55w0rd");

        // Cria modelo de tabela
        tabela = new JTable(criaTableModel(acesso.retornaTabela()));

        // Adiciona um painel de rolagem
        JScrollPane rolar = new JScrollPane(tabela);

        // Cria painel do botão
        JPanel pbotao = new JPanel(new GridLayout(0, 3, 10, 10));       

        botao = new JButton("Cria Sequence/Identity");
        botao.addActionListener(this);

        // Adiciona botão ao painel

        pbotao.add(Box.createHorizontalStrut(10));
        pbotao.add(Box.createHorizontalStrut(10));
        pbotao.add(botao);

        // componentes ao painel principal
        painel.add(pescolha);
        painel.add(rolar);
        painel.add(Box.createVerticalStrut(10));
        painel.add(pbotao);

        return painel;
    }

    public static void criaGUI() {
        // Cria formulario
        JFrame formulario = new JFrame("Desenvolvimento Aberto - Sequence / Identity");
        formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // cria painel de conteudo
        Sequence acesso = new Sequence();

        try {
            formulario.setContentPane(acesso.criaPainel());
        }

        catch (SQLException e) {
            e.printStackTrace();
        }

        // Exibe o formulario
        formulario.setSize(700, 300);
        formulario.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                // Cria e mostra a GUI
                criaGUI();
            }
        });
    }
}

comentários
  1. Miles disse:

    Nice blog youu have

Deixe um comentário