Arquivo da categoria ‘Java’

Stored Procedures são procedimentos de código SQL armazenados no banco de dados, as stored procedures são mais rápidas do que o código tradicional, o que significa que elas estão se tornando cada vez mais populares. Com código da aplicação se mudando dos programas externos para o motor de banco de dados, Os DBAs precisam entender os requisitos de memória relacionados para procedimentos armazenados e saber como gerenciar estes procedimentos para o ideal desempenho do banco de dados. Isto muda de banco para banco, cada um deles possui suas recomendações de melhores praticas para atingir um melhor desempenho.

Neste site existe uma versão deste mesmo programa utilizando código SQL direto dentro da aplicação e podemos comparar a diferença com o código SQL sendo executado dentro do motor do banco de dados e o resultado é visivelmente notado, sem duvida o código executado utilizando procedures é mais rápido.

Ainda existe um outro modo de utilizar o banco de dados que é utilizando um set de dados persistente, onde uma camada  de classes ou componentes geram o código SQL para o banco de dados através de instruções definidas pelas classes, mas este método por possuir uma camada que cria o código para o banco pode se tornar menos atrativo em termos de desempenho, apesar de ser muito mais fácil e rápido para se desenvolver, sendo assim vale avaliar a quantidade de dados que sua aplicação pretende manipular.

Para adquirir o script SQL para criar a tabela deste exemplo ou visualizar o método utilizando SQL direto da aplicação: Clique Aqui.

Stored Procedure

Stored Procedure

Vantagens de utilizar Stored Procedures

Esta explicação é dirigida ao banco de dados Oracle, porem também se aplica aos bancos de dados DB2 e MSSQL, levando-se em conta a arquitetura do motor (engine) de cada um dos bancos de dados, para uma definição mais precisa consulte as especificações de cada um dos bancos de dados.

Melhor desempenho

Procedimentos armazenado Oracle carregam uma vez no pool comum e permanecem lá a menos que eles se tornem paginados. Execuções subsequentes do procedimento armazenado Oracle são muito mais rápidos do que as execuções de código externo.

Acoplamento de dados com comportamentos.

Os DBAs podem usar convenções de nomenclatura para tabelas relacionais pares com os comportamentos associados a uma tabela usando os procedimentos armazenados do Oracle como “métodos”.

Isolamento de código.

Uma vez que todos os códigos SQL forem movidos para fora dos programas externos e para dentro dos procedimentos armazenados do Oracle, os programas de aplicação tornam-se nada mais do que chamadas para procedimentos armazenados. Como tal, torna-se muito simples de trocar de um banco de dados para outro.

Exemplo:

Neste exemplo utilizamos Stored Procedures que retornam parâmetros para criar um método dentro do banco de dados ao invés de criar o método dentro da aplicação utilizando a linguagem de programação nativa. Deste modo podemos utilizar o mesmo programa sem alterar uma única linha e utiliza-lo em vários bancos de dados diferentes e ainda obter a melhor performance na execução de instruções SQL.

Obs: Para criar uma Stored Procedure utilizando o IBM Data Studio, você deve utilizar o editor de procedures e não o editor comum de SQL, pois encontrará um erro do caractere ponto e virgula no momento de escrever sua sintaxe.

Oracle

create or replace PROCEDURE buscaFuncionario
- Cria parametros
(pid_funcionario IN FUNCIONARIOS.ID_FUNCIONARIO%TYPE,
 p_nome OUT FUNCIONARIOS.NOME%TYPE,
 p_sobrenome OUT FUNCIONARIOS.SOBRENOME%TYPE,
 p_cargo OUT FUNCIONARIOS.CARGO%TYPE,
 p_salario OUT FUNCIONARIOS.SALARIO%TYPE
 )
AS
BEGIN
-- Insere dados da query dentro dos parametros de saida
  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM FUNCIONARIOS
  WHERE ID_FUNCIONARIO = pid_funcionario;

END;

DB2

-- Cria procedure
CREATE PROCEDURE buscaFuncionario
( IN pid_funcionario INTEGER,
  OUT p_nome VARCHAR(30),
  OUT p_sobrenome VARCHAR(70),
  OUT p_cargo VARCHAR(30),
  OUT p_salario DECIMAL(9,2)
 )

P1: BEGIN

  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM FUNCIONARIOS
  WHERE ID_FUNCIONARIO = pid_funcionario;

END P1

MSSQL

CREATE PROCEDURE buscaFuncionario
   @pfuncionario INT,
   @pnome		 NVarchar(30) OUTPUT,
   @psobrenome	 NVarchar(70) OUTPUT,
   @pcargo	     NVarchar(30) OUTPUT,
   @psalario	 Decimal(9,2) OUTPUT
AS
BEGIN
   SELECT @pnome = Nome,
		  @psobrenome = Sobrenome,
		  @pcargo = Cargo,
		  @psalario = Salario
   FROM Funcionarios
   WHERE ID_Funcionario = @pfuncionario
END

Java

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class Campos implements ActionListener {
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lid;
	private JLabel lpnome;
	private JLabel lsnome;
	private JLabel lcargo;
	private JLabel lsalario;
	private JLabel lpesquisa;

	private JTextField tid;
	private JTextField tpnome;
	private JTextField tsnome;
	private JTextField tcargo;
	private JTextField tsalario;
	private JTextField tpesquisa;

	private JButton botao;

	private Border borda;

	private JFrame menssagem;

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

	// Declara variaveis
	private static String bconexao;

	// Cria conexão
	public void conectar(String banco) {

		// Verifica strings de conexão

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

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

			}

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

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

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

				// Executa pedido SQL
				query = conn.createStatement();
				// JOptionPane.showMessageDialog(menssagem,
				// "Conexão Efetuada com sucesso!");
			}

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

			catch (SQLException ex) {
				// JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
				ex.printStackTrace();
			}

		}

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

				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 Container criaPainel() {
		// cria painel
		JPanel painel = new JPanel();
		painel.setLayout(new FlowLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		painel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		// Cria titulo
		ltitulo = new JLabel("Database - Stored Procedures - Sem conexão");

		painel.add(ltitulo);
		painel.add(Box.createVerticalStrut(60));

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes
		lid = new JLabel("Código:");
		lpnome = new JLabel("Primeiro Nome:");
		lsnome = new JLabel("Sobrenome:");
		lcargo = new JLabel("Cargo:");
		lsalario = new JLabel("Salário:");

		tid = new JTextField();
		tpnome = new JTextField();
		tsnome = new JTextField();
		tcargo = new JTextField();
		tsalario = new JTextField();

		tid.setPreferredSize(new Dimension(150, 20));
		// Adiciona componentes no painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lid);
		painelDados.add(tid);
		painelDados.add(lpnome);
		painelDados.add(tpnome);
		painelDados.add(lsnome);
		painelDados.add(tsnome);
		painelDados.add(lcargo);
		painelDados.add(tcargo);
		painelDados.add(lsalario);
		painelDados.add(tsalario);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria painel de pesquisa
		JPanel painelPesquisa = new JPanel(new GridLayout(0, 3, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelPesquisa.setBorder(borda);

		// Cria pesquisas
		lpesquisa = new JLabel("Pesquisa código:");
		tpesquisa = new JTextField();
		botao = new JButton("Pesquisar");
		botao.addActionListener(this);

		// Define foco do cursor no campo de pesquisa
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				tpesquisa.requestFocus();
			}
		});

		// Adiciona compoentes ao painel de pesquisa
		painelPesquisa.add(lpesquisa);
		painelPesquisa.add(tpesquisa);
		painelPesquisa.add(botao);

		// Cria painel de pesquisa

		// Adiciona paineis
		painel.add(painelPesquisa);
		painel.add(painelDados);

		return painel;
	}

	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) {

		// Verifica pesquisa
		if (arg0.getSource() == botao) {

			// retorna result de dados
			CallableStatement proc = null;

			try {
				// Exibe a conexão utilizadda
				ltitulo.setText("Database - Stored Procedures - " + bconexao);

				// Prepara stored procedure
				proc = conn.prepareCall("{call buscaFuncionario(?,?,?,?,?)}");

				// Define parametro de entrada
				proc.setInt(1, Integer.parseInt(tpesquisa.getText()));

				// Registra parametros de saida
				proc.registerOutParameter(2, java.sql.Types.VARCHAR);
				proc.registerOutParameter(3, java.sql.Types.VARCHAR);
				proc.registerOutParameter(4, java.sql.Types.VARCHAR);
				proc.registerOutParameter(5, java.sql.Types.DECIMAL);

				// Executa stored procedure
				proc.execute();			

				// Preenche campos da tela

				tid.setText(tpesquisa.getText());
				tpnome.setText(proc.getString(2));
				tsnome.setText(proc.getString(3));
				tcargo.setText(proc.getString(4));
				tsalario.setText(proc.getString(5));				

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

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

		// cria painel de conteudo
		Campos acesso = new Campos();
		// conecta ao banco de dados defindo
		// mude a variavel bconexao para escolher o banco de dados
		// importe os drivers para o projeto
		// oracle = ORACLE
		// db2 = IBM DB2
		// mssql = MSSQL Server

		bconexao = "db2";
		acesso.conectar(bconexao);
		formulario.setContentPane(acesso.criaPainel());

		// Exibe o formulario
		formulario.setSize(400, 380);
		formulario.setVisible(true);

	}

	public static void main(String[] args) {

		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// Mostra GUI
				criaGUI();

			}
		});

	}

}

Na linguagem de programação Java podemos utilizar a classe Statament para criar um objeto usado para executar uma instrução SQL estática e retornar os resultados produzidos.

Java - Oracle - DB2 - MSSQL

Java – Oracle – DB2 – MSSQL

Exemplo:

No programa abaixo utilizamos uma única query para executar as quatro operações básicas sobre diferentes bancos de dados.

Java

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class Campos implements ActionListener {
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lid;
	private JLabel lpnome;
	private JLabel lsnome;
	private JLabel lcargo;
	private JLabel lsalario;
	private JLabel lpesquisa;

	private JTextField tid;
	private JTextField tpnome;
	private JTextField tsnome;
	private JTextField tcargo;
	private JTextField tsalario;
	private JTextField tpesquisa;

	private JButton botao;
	private JButton alterar;
	private JButton inserir;
	private JButton deletar;
	private JButton novo;

	private Border borda;

	private JFrame menssagem;

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

	// Declara variaveis
	private static String bconexao;

	// Cria conexão
	public void conectar(String banco) {

		// Verifica strings de conexão

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

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

			}

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

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

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

				// Executa pedido SQL
				query = conn.createStatement();
				// JOptionPane.showMessageDialog(menssagem,
				// "Conexão Efetuada com sucesso!");
			}

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

			catch (SQLException ex) {
				// JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
				ex.printStackTrace();
			}

		}

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

				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();
			}

		}

	}

	// Retorna funcionario
	public ResultSet retornaFuncionarioId(String codigo) throws SQLException {
		// Cria uma nova conexão
		Statement query;
		query = conn.createStatement();
		String sql;

		// Verfica banco de dados e passa script SQL

		sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + codigo;

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

		// Retorna set de dados
		return dados;
	}

	public Container criaPainel() {
		// cria painel
		JPanel painel = new JPanel();
		painel.setLayout(new FlowLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		painel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		// Cria titulo
		ltitulo = new JLabel("Database - Fields -Sem conexão");

		painel.add(ltitulo);
		painel.add(Box.createVerticalStrut(60));

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes
		lid = new JLabel("Código:");
		lpnome = new JLabel("Primeiro Nome:");
		lsnome = new JLabel("Sobrenome:");
		lcargo = new JLabel("Cargo:");
		lsalario = new JLabel("Salário:");

		tid = new JTextField();
		tpnome = new JTextField();
		tsnome = new JTextField();
		tcargo = new JTextField();
		tsalario = new JTextField();

		tid.setPreferredSize(new Dimension(150, 20));
		
                  // Adiciona componentes no painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lid);
		painelDados.add(tid);
		painelDados.add(lpnome);
		painelDados.add(tpnome);
		painelDados.add(lsnome);
		painelDados.add(tsnome);
		painelDados.add(lcargo);
		painelDados.add(tcargo);
		painelDados.add(lsalario);
		painelDados.add(tsalario);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria painel de pesquisa
		JPanel painelPesquisa = new JPanel(new GridLayout(0, 3, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelPesquisa.setBorder(borda);

		// Cria pesquisas
		lpesquisa = new JLabel("Pesquisa código:");
		tpesquisa = new JTextField();
		botao = new JButton("Pesquisar");
		botao.addActionListener(this);

		// Define foco do cursor no campo de pesquisa
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				tpesquisa.requestFocus();
			}
		});

		// Adiciona compoentes ao painel de pesquisa
		painelPesquisa.add(lpesquisa);
		painelPesquisa.add(tpesquisa);
		painelPesquisa.add(botao);

		// Cria painel de pesquisa
		JPanel painelAcao = new JPanel(new GridLayout(0, 4, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelAcao.setBorder(borda);

		// Cria botões de manipulação de banco
		novo = new JButton("Novo");
		inserir = new JButton("Inserir");
		alterar = new JButton("Alterar");
		deletar = new JButton("Apagar");

		// Cria ouvintes de eventos
		novo.addActionListener(this);
		inserir.addActionListener(this);
		alterar.addActionListener(this);
		deletar.addActionListener(this);

		// Insere componentes em um painel 
		painelAcao.add(novo);
		painelAcao.add(inserir);
		painelAcao.add(alterar);
		painelAcao.add(deletar);

		// Adiciona paineis
		painel.add(painelPesquisa);
		painel.add(painelDados);
		painel.add(painelAcao);

		return painel;
	}

	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) {

		// Verifica pesquisa
		if (arg0.getSource() == botao) {

			// Cria instancia de objeto
			Campos campos = new Campos();
			
			// retorna result de dados
			try {
				ResultSet dados = campos.retornaFuncionarioId(tpesquisa
						.getText());
				ltitulo.setText("Database - Fields - " + bconexao);

				// Preenche campos da tela
				while (dados.next()) {
					tid.setText(dados.getString("ID_FUNCIONARIO"));
					tpnome.setText(dados.getString("NOME"));
					tsnome.setText(dados.getString("SOBRENOME"));
					tcargo.setText(dados.getString("CARGO"));
					tsalario.setText(dados.getString("SALARIO"));
				}

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

		// Botão Novo
		if (arg0.getSource() == novo) {
			tid.setText(null);
			tpnome.setText(null);
			tsnome.setText(null);
			tcargo.setText(null);
			tsalario.setText(null);

			javax.swing.SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					tid.requestFocus();
				}
			});

		}

		// Insere dados
		if (arg0.getSource() == inserir) {
			String sql = "Insert into FUNCIONARIOS "
					+ " (ID_FUNCIONARIO, NOME, SOBRENOME, CARGO, SALARIO) "
					+ "values (" + tid.getText() + ", " + "\'"
					+ tpnome.getText() + "\', " + "\'" + tsnome.getText()
					+ "\', " + "\'" + tcargo.getText() + "\', "
					+ tsalario.getText() + ")";

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados inserido com sucesso!");
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}

		}

		// Altera dados
		if (arg0.getSource() == alterar) {
			String sql = "Update FUNCIONARIOS SET " + "ID_FUNCIONARIO = "
					+ tid.getText() + ", " + "NOME = \'" + tpnome.getText()
					+ "\', " + "SOBRENOME = \'" + tsnome.getText() + "\', "
					+ "CARGO = \'" + tcargo.getText() + "\', " + "SALARIO = "
					+ tsalario.getText() + " " + "Where " + "ID_FUNCIONARIO = "
					+ tpesquisa.getText();

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados alterados com sucesso!");
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}
		}

		// Deleta dados
		if (arg0.getSource() == deletar) {
			String sql = "Delete from FUNCIONARIOS WHERE ID_FUNCIONARIO = "
					+ tid.getText();

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados Apagados com sucesso!");
				novo.doClick();
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}
		}

	}

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

		// cria painel de conteudo
		Campos acesso = new Campos();
		// conecta ao banco de dados defindo
		// mude a variavel bconexao para escolher o banco de dados
		// importe os drivers para o projeto
		// oracle = ORACLE
		// db2 = IBM DB2
		// mssql = MSSQL Server

		bconexao = "oracle";
		acesso.conectar(bconexao);
		formulario.setContentPane(acesso.criaPainel());

		// Exibe o formulario
		formulario.setSize(400, 450);
		formulario.setVisible(true);

	}

	public static void main(String[] args) {

		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// Mostra GUI
				criaGUI();

			}
		});

	}

}

É permitido manipular um resultado de uma pesquisa no banco de dados através do seu código Java usando um objeto ResultSet, você pode selecionar qualquer campo contido em uma ou mais linhas de dados à partir do conteúdo de seu set de dados e escolher as colunas desejadas pelo nome ou índice, você pode exibi-las em uma grade ou em campos de edição.

Database  - Table Fields

Database – Table Fields

Para utilizar uma linha de dados por coluna em Java nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:

1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo:

Script SQL

Script SQL

Exemplo:

Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios  
(     
    
    ID_Funcionario  NUMBER(5), 
    Nome            VARCHAR2(30), 
    Sobrenome       VARCHAR2(70), 
    Cargo           VARCHAR2(30), 
    Salario         NUMBER(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios  
(     
    
    ID_Funcionario  INTEGER, 
    Nome            VARCHAR(30), 
    Sobrenome       VARCHAR(70), 
    Cargo           VARCHAR(30), 
    Salario         NUMERIC(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios  
(     
    
    ID_Funcionario  Int, 
    Nome            VARCHAR(30), 
    Sobrenome       VARCHAR(70), 
    Cargo           VARCHAR(30), 
    Salario         Decimal(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class Campos implements ActionListener 
{
	// Declara componentes
	private JLabel ltitulo; 
	private JLabel lid;
	private JLabel lpnome;
	private JLabel lsnome;
	private JLabel lcargo;
	private JLabel lsalario;
	private JLabel lpesquisa;
	
	private JTextField tid;
	private JTextField tpnome;
	private JTextField tsnome;
	private JTextField tcargo;
	private JTextField tsalario;
	private JTextField tpesquisa;
	
	private JButton botao;
	
	private Border borda;
	
	// Declara objetos de conexão
	private static Connection conn;
	private static Statement query;
	
	// Declara variaveis
	private String bconexao;
	
	// Cria conexão
	public void conectar(String banco) {

		// Verifica strings de conexão

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

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

			}

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

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

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

				// Executa pedido SQL
				query = conn.createStatement();
				// JOptionPane.showMessageDialog(menssagem,
				// "Conexão Efetuada com sucesso!");
			}

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

			catch (SQLException ex) {
				// JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
				ex.printStackTrace();
			}

		}

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

				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();
			}

		}

	}
	
	// Retorna funcionario
	public ResultSet retornaFuncionarioId(String codigo) throws SQLException 
	{
		// Cria uma nova conexão
		Statement query;
		query = conn.createStatement();
		String sql;

		// Verfica banco de dados e passa script SQL
		
	   sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + codigo;
		
		// Executa Script
		ResultSet dados = query.executeQuery(sql);

		// Retorna set de dados
		return dados;
	}


	public Container criaPainel()
	{
		// cria painel
		JPanel painel = new JPanel();
		painel.setLayout(new BorderLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		
		// Cria titulo
		ltitulo = new JLabel("Database - Fields -Sem conexão");
		
		painel.add(ltitulo, BorderLayout.PAGE_START);
		
		// Cria painel de usuario
        JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));
        
        // Cria componentes
        lid = new JLabel("Código:");
        lpnome = new JLabel("Primeiro Nome:");
        lsnome = new JLabel("Sobrenome:");
        lcargo = new JLabel("Cargo:");
		lsalario = new JLabel("Salário:");
		
		tid = new JTextField();
		tpnome = new JTextField();
		tsnome = new JTextField();
		tcargo = new JTextField();
		tsalario = new JTextField();
		
		// Adiciona componentes no painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lid);
		painelDados.add(tid);
		painelDados.add(lpnome);
		painelDados.add(tpnome);
		painelDados.add(lsnome);
		painelDados.add(tsnome);
		painelDados.add(lcargo);
		painelDados.add(tcargo);
		painelDados.add(lsalario);
		painelDados.add(tsalario);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		
		painel.add(painelDados, BorderLayout.CENTER);
		
		// Cria painel de pesquisa
		JPanel painelPesquisa = new JPanel(new GridLayout(0, 3, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelPesquisa.setBorder(borda);
		
		// Cria pesquisas
		lpesquisa = new JLabel("Pesquisa código:");
		tpesquisa = new JTextField();
		botao = new JButton("Pesquisar");
		botao.addActionListener(this);
				
		// Define foco do cursor no campo de pesquisa
		javax.swing.SwingUtilities.invokeLater(new Runnable() {   
		    public void run() {   
		        tpesquisa.requestFocus();   
		    }   
		});  

		// Adiciona compoentes ao painel de pesquisa
		painelPesquisa.add(lpesquisa);
		painelPesquisa.add(tpesquisa);
		painelPesquisa.add(botao);
		
		painel.add(painelPesquisa, BorderLayout.PAGE_END);
		
		return painel;
	}
	
	
	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) 
	{
		// Cria instancia de objeto
		Campos campos = new Campos();
		
		// conecta ao banco de dados defindo
		//  mude a variavel bconexao para escolher o banco de dados
		// importe os drivers para o projeto
		// oracle = ORACLE
		// db2 = IBM DB2
		// mssql = MSSQL Server
		
		bconexao = "oracle";
		campos.conectar(bconexao);
		
		// retorna result de dados
		try
		{
			ResultSet dados = campos.retornaFuncionarioId(tpesquisa.getText());
			ltitulo.setText("Database - Fields - " + bconexao);
			
			// Preenche campos da tela
			while (dados.next())
			{
				tid.setText(dados.getString("ID_FUNCIONARIO"));
				tpnome.setText(dados.getString("NOME"));
				tsnome.setText(dados.getString("SOBRENOME"));				
				tcargo.setText(dados.getString("CARGO"));	
				tsalario.setText(dados.getString("SALARIO"));
			}
			
		}
		catch (SQLException e)
		{
			e.printStackTrace();		
		}		
		
	}
	
	public static void criaGUI() 
	{
			// Cria formulario
			JFrame formulario = new JFrame("Desenvolvimento Aberto");
			formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

			// cria painel de conteudo
			Campos acesso = new Campos();
			
			formulario.setContentPane(acesso.criaPainel());
			
			// Exibe o formulario
			formulario.pack();
			formulario.setVisible(true);
		
	}

	public static void main(String[] args) {
		
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
		
				// Mostra GUI
				criaGUI();				
				
			}
		});		

	}

}

 

Você pode manipular dados de qualquer banco de dados que possua um driver suportado pelo JDBC, um sistema de grande porte geralmente utiliza mais de um banco de dados, esta opção torna seu produto mais competitivo no mercado pois pode suportar varias especificações técnicas de hardware e software, assim obtendo vantagem no preço final de sua implementação.

O Java Swing foi criados para suportar o modelo de programação MVC, utilizando modelos e visões combinando o controle com os eventos listner de seus componentes, que a grosso modo funciona assim:

A visão se registra como um ouvinte do modelo. Quaisquer alterações nos dados subjacentes do modelo resultará imediatamente em uma notificação de alteração de transmissão, que a visão recebe.

O programa neste post não possui a estrutura MVC, nem qualquer outro tipo de estrutura é composto propositalmente de apenas uma classe que conecta em 3 bancos de dados diferentes e utiliza um modelo default para retornar a mesma visão para qualquer uma das conexões.

Default Table Model

É uma implementação do TableModel que usa vetores para armazenar os objetos de valor de célula. Apesar deste modelo ser fácil de usar é necessário que você crie seus próprios modelos, este tipo de modelo possui varias restrições e necessita que você crie alguns métodos override para manipula-lo corretamente. Quando o DefaultTableModel for usado com um TableRowSorter resultará em um uso extensivo de toString, e para os tipos de dados não string o custo será alto demais. A Oracle avisa que os objetos serializados desta classe não será compatível com os futuros lançamentos do Swing.

Conectando ao Oracle, IBM DB2 e Microsoft SQL Server a partir da mesma Aplicação:

Para efetuar as conexão com os diferentes bancos de dados você precisa primeiro configurar seu projeto com os drivers JDBC necessários, use a figura abaixo para referencia:

Drivers JDBC

Drivers JDBC

Conectando ao Oracle:

Oracle

Oracle

Conectando ao IBM DB2:

IBM DB2

IBM DB2

Conectando ao Microsoft SQL Server:

MSSQL SERVER

MSSQL SERVER

Exemplo:

Neste exemplo criamos três conexões diferentes e retornamos dados da mesma tabela de 3 bancos de dados diferentes, utilizando o mesmo modelo e a mesma visão. Este exemplo deve ser modificado para poder ser usado em uma aplicação real. Você deve fazer varias modificação neste programa e criar as parametrizações necessárias, você também deve separar esta classe em varias outras classes e deve criar sua própria classe para o modelo de tabela ao invés de usar o DefaultTableModel. Este exemplo apesar de não poder ser usado em uma aplicação real ainda sim é um ótimo rascunho inicial.

Java

import java.awt.Container;
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 Acesso 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();
				// JOptionPane.showMessageDialog(menssagem,
				// "Conexão Efetuada com sucesso!");
			}

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

			catch (SQLException ex) {
				// JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
				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 ResultSet retornaTabela() throws SQLException {
		// Cria uma nova conexão
		Statement query;
		query = conn.createStatement();
		String sql;

		// Verfica banco de dados e passa script SQL
		if (bancodedados == "db2") {
			sql = "Select * from DA.\"Blog\"";
		} else {
			sql = "Select * from blog";
		}

		// 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
		Acesso acesso = new Acesso();

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

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

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

		try {
			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)
		Acesso acesso = new Acesso();
		acesso.conectar("daberto", "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();

		// Seleciona layout
		pbotao.setLayout(new BoxLayout(pbotao, BoxLayout.PAGE_AXIS));

		// cria botão
		botao = new JButton("Ler dados");
		botao.addActionListener(this);

		// Adiciona botão ao painel
		pbotao.add(botao);

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

		return painel;
	}

	public static void criaGUI() {
		// Cria formulario
		JFrame formulario = new JFrame("Acessando Dados");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

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

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

		// Exibe o formulario
		formulario.pack();
		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();

			}
		});
	}
}

A grande maioria das empresas necessitam de sistemas que possam processar, guardar e manipular informações e o modo mais comum de se fazer este trabalho é usando um banco de dados relacional. Um sistema de gerenciamento de banco de dados relacional (RDBMS) é um sistema de gerenciamento de banco de dados (SGBD), que é baseado no modelo relacional introduzido por EF Codd, do Laboratório de Pesquisa de San Jose da IBM. Muitos bancos de dados populares atualmente em uso são baseados no modelo de banco de dados relacional.

Os RDBMSs tornaram-se uma escolha predominante para o armazenamento de informações em bancos de dados, usados para registros financeiros, fabricação e informações logísticas, dados de pessoal, e muito mais desde 1980. Bancos de dados relacionais, muitas vezes substituindo bancos de dados hierárquicos e bancos de dados de rede, porque eles são mais fáceis de entender e usar. No entanto, os bancos de dados relacionais vem sendo substituídos por banco de dados orientados a objeto que foram introduzidos na tentativa de resolver a diferença de impedância objeto-relacional em banco de dados relacional e bancos de dados XML.

Banco de Dados Relacional

Banco de Dados Relacional

Entre os maiores banco de dados relacionais do mercado, segundo a empresa Gartner, os líderes de vendas são:

  1. Oracle (48.8%),
  2. IBM (20.2%),
  3. Microsoft (17.0%),
  4. SAP incluindo (Sybase (4.6%), e Teradata (3.7%))

Banco de dados o grande vilão

Quem já ouviu esta afirmação? “O sistema está muito lento!”. Existem vários fatores que podem causar este problema mas eu já ouvi o que considero a pior resposta do mundo de para esta afirmação e foi de um especialista da empresa líder nacional do mercado para ERP, da qual você já imaginou o nome. O sistema estava em um cliente multinacional que fabrica peças para montadoras de carros e rodava sobre o banco de dados Microsoft SQL Server, e o consultor da tal empresa  disse: “Troca o banco de dados pelo Oracle“. Instantaneamente o gerente de TI  replicou: “Neste caso é melhor eu trocar seu sistema pelo SAP!”.

Eu concordo plenamente com a resposta do gerente de TI da multinacional, o SAP roda muito bem em SQL Server e atende a maioria das empresas no qual utiliza esta configuração e benchmark dos dois bancos de dados são comuns, basta procurar no Google, segue aqui um exemplo : BenchMark DB2 1o vs SQL Server 2012 vs Oracle 11g R2 . Será que todas as empresas utilizam as novas features dos bancos de dados em seu sistema assim como faz a SAP?

Geralmente a solução do problema é trazida por um empresa de consultoria, porque este tipo de empresa lida com vários bancos de dados, de vários sistemas diferentes e seus especialistas conhecem a fundo varias bases de dados dos mais diferentes tipos, incluindo sistemas como o SAP, JDEdwardsMS Dynamics. É comum algumas consultorias que também fabricam software desenvolver soluções que completam ou interagem com estes ERPs e estes desenvolvedores ou consultores já estão calejados e sabem que nem tudo que existe por ai é uma maravilha, e nem todos podem ter o luxo de utilizar uma base de dados criada e assinada pela SAP, Oracle, Microsoft ou IBM. E as vezes ou na maioria delas a melhor solução é sim trocar o sistema.

O que acontece por ai?

Algumas empresas não sabem utilizar corretamente o banco, ressalto que utilizar um o banco de dados não é apenas possuir um desenvolvedor SQL que saiba escrever scripts. Já presenciei sistemas de empresas que existem há mais de 10 anos no mercado e ainda não aprenderam a utilizar um banco de dados relacional corretamente, muito menos já seguiram algum dia as melhores praticas. Em um caso em particular o banco de dados era Oracle e o sistema rodava em clientes de médio porte, e a frase constantemente ouvida dos clientes era: “O sistema é muito lento e toda vez que atualiza o sistema gera muitos erros”. Bom, neste caso o especialista da empresa não poderia dizer para trocar o banco de dados e ao analisar a base dados instantaneamente se notava vários problemas como: muitas chaves primarias, a não utilização de índice único, triggers em excesso, scripts SQL no mínimo duvidosos e lembro de um script do relatório de inventario que demorava mais ou menos 10 minutos para retornar 750 produtos.

É! isto existe por ai! E pergunto para você, isto é normal?

Alguns casos são demorados de resolver como o caso da empresa acima que vinha costurando scripts e programação sem metodologia a mais de 10 anos em um banco sem normalização e outros podem ser resolvidos facilmente como o caso de um empresa cooperativa de grande porte que possuía outras 98 empresas em seu grupo e precisava importar as notas fiscais de todas as empresas para um sistema de validação fiscal  que utiliza Microsoft SQL Server e os dados seriam extraídos de um sistema da IBM, este processo demorava mais de 4 horas . Utilizando novos scripts SQL, implementando técnicas de BULK foi possível reduzir o tempo do processo para importação de 5 anos de dados  de 98 empresas para 15 minutos.

Falta de Normalização

Falta de Normalização

O Verdadeiro Vilão

Podemos apontar de primeira alguns dos principais problemas como, falta de conhecimento da documentação do banco de dados em questão, pouca ou nenhuma normalização, não tratar o modelo de dados como um organismo vivo, que respira e cresce constantemente, o armazenamento inadequado dos dados de referência, não usar chaves estrangeiras ou restrições de verificação ou o uso excessivo dos mesmos, o não uso de domínios e padrões de nomenclatura  e não escolher chaves primárias adequadamente.

Em segundo lugar está o estilo de programação tanto para os scripts do banco dados como na linguagem que acessa os dados, é comum encontrar o uso excessivo de cursores, acessos repetitivos e não saber quando usar o conceito de múltiplos bancos de dados.

Vou ilustrar os parágrafos acima com um outro caso que também é muito comum, e refere-se a uso excessivo de chaves estrangeiras,  não saber a hora de optar por um sistema de banco de dados múltiplos e não incluir no projeto do sistema a previsão de crescimento do mesmo.

O problema ocorre porque inicialmente o projeto de um tipo de ferramenta que extrai dados fiscais para validação foi escrito somente para o banco de dados Oracle, ao longo dos anos com o investimento da Microsoft no MSSQL Server o banco de dados conseguiu um bom espaço no mercado e varias empresas de médio e grande porte o adquiriram, então a ferramenta da empresa em questão precisava trabalhar e rodar nos dois banco de dados. Mas o trabalho era árduo porque era preciso extrair os últimos cinco anos de dados fiscais da empresa e suas filiais e valida-los em horas.

Com o passar dos anos as obrigatoriedades vieram a ser maiores e a empresa proprietária da ferramenta precisava atender estas obrigatoriedades e o próprio mercado ditou a necessidade da ferramenta estar apta a rodar em um banco de dados que vinha ganhando cada vez mais espaço, é obvio que se um cliente possuísse uma licença para o banco de dados que rodava em seu sistema principal (MSSQL) não iria comprar uma licença mais cara (Oracle) somente para poder utilizar uma ferramenta e sim procurar outra ferramenta que atendia sua especificação técnica.

Primeiro a empresa tentou sozinha desenvolver para o novo banco de dados e encontrou varias dificuldades ao ter que descobrir também sozinha que os conceitos entre os bancos de dados não eram iguais e decidiu procurar ajuda especializada, ficou surpresa com o resultado, ao trabalhar com mais de um banco de dados a empresa conseguiu benefícios de desempenho também para o banco de dados no qual a empresa dominava e era especialista.

Porque para competir com o Oracle a Microsoft também usou como estratégia restringir os erros cometidos pelos desenvolvedores na arquitetura do banco de dados, meio que forçando o banco de dados SQL Server a ser escrito e normalizado o mais corretamente possível, assim ganhando mais performance, um exemplo são as chaves estrangeiras, estas requerem memoria e custam para serem interpretadas pelo Engine do banco de dados e a partir da versão 2005 do MSSQL a Microsoft começou a restringir chaves estrangeiras por tabela. No caso de um banco de dados único em um sistema multi-empresas é comum possuir mais de 253 tabelas que possuem uma chave estrangeira conectada a tabela de empresas, então a Microsoft começou a emitir um erro quando se tentava deletar ou alterar um registro de uma tabela que possuía tal quantidade de chaves estrangeiras, a simples clausula executada sobre esta tabela:

Delete from EMPRESA where ID_EMPRESA = 1

retorna o seguinte erro: QUERY TOO COMPLEX.

Capacidade máxima do MSSQL Server (Atente-se para a coluna chamada Foreign key table references per table):

link: http://msdn.microsoft.com/en-us/library/ms143432.aspx

Você pode ler e inserir dados na tabela normalmente, mas não pode mais apagar ou alterar os dados devido ao alto custo da query, apesar do Oracle ou outros bancos de dados permitirem tal modelagem a query executada sobre estas circunstancias também terá um custo maior para ser resolvida pelo Engine do banco de dados. Para uma modelagem mais compacta e sem excessos de objetos no banco de dados, um sistema pode possuir múltiplos bancos de dados, um exemplo de um sistema de grande porte com múltiplos bancos de dados é o JDEdwards da Oracle.

Grande Volume de Dados

Grande Volume de Dados

Processamento de grandes volumes de dados

É recomendado seguir melhores praticas para cada banco de dados e ler os White Papers escritos para suas ferramentas e quanto a regras de programação para sistemas que acessam dados você pode seguir o critério acima ou pode buscar conhecimento em empresas que já possuem este know-how como o caso da SAP.

Como é de conhecimento de todos os sistemas da SAP foram projetados para trabalhar com grande volume de dados e a SAP especifica 5 regras para se programar com os banco de dados: Oracle, Db2, Microsoft SQL Server e Informix. Apesar destas regras serem escritas para programas ABAP e Java e a arquitetura de dados do SAP R/3, elas também se aplicam a forma como outras linguagens de programação devem acessar o banco de dados:

  1. Mantenha o conjunto de resultados Pequeno.
  2. Minimizar a quantidade de dados transferidos.
  3. Minimizar o número de transferências de dados.
  4. Minimizar a Pesquisa Overhead.
  5. Reduzir a carga do banco de dados.

 

 

Microsoft SQL Server é um banco de dados relacional que pode ser usado para armazenar, usar e modificar dados. O Java Database Connectivity (JDBC) padrão é usado por aplicativos Java para acesso e manipulação de dados em bancos de dados relacionais.

JDBC é um protocolo de acesso de banco de dados que permite que você se conecte a um banco de dados e execute instruções SQL e consultas no banco de dados. As bibliotecas de classe do núcleo de Java fornecem as APIs JDBC, java.sql e javax.sql. No entanto, JDBC é projetado para permitir que os vendedores forneçam drivers que oferecem a especialização necessária para um banco de dados específico.

MSSQL - Java

MSSQL – Java

Microsoft JDBC Driver for SQL Server

Microsoft JDBC Driver 4.0 para SQL Server, um driver JDBC Tipo 4 que fornece conectividade de banco de dados por meio das APIs (interfaces de programa aplicativo) padrão JDBC disponíveis na Plataforma Java.

Download: http://msdn.microsoft.com/pt-br/sqlserver/aa937724.aspx

Instalação

Para instalar descompacte o Driver em uma pasta e use o arquivo default.html da pasta help para informações adicionais.

Configurações Microsoft SQL Server

Para conectar-se com o Java você precisa habilitar o protocolo TCP/IP para rede, que por padrão vem desabilitado, para efetuar este procedimento siga os seguintes passos:

1 – Abra o SQL Server Configuration Manager, expanda os nodes da arvore até Configurações de rede do SQL Server e clique em, protocolos para SQLEXPRESS. Na opção TCP/IP escolha habilitado:

Habilitar TCP/IP de Rede

Habilitar TCP/IP de Rede

2 – Clique com o botão direito ainda em cima da opção TCP/IP e escolha propriedades, role as propriedades até o final e em IPALL, na opção porta, preencha com 1433:

Define Porta 1433

Define Porta 1433

4 – Vá para o primeiro node da arvore chamado Serviços do SQL Server e reinicie o serviço.

 

Configurando Driver JDBC SQL Server

Para usar o driver JDBC para SQL Server você pode adiciona-lo em seu projeto, clicando com o botão direito do mouse em cima do nome do projeto e escolhendo a opção propriedades, adicione o arquivo de driver na biblioteca do seu projeto usando a opção Add External JAR, a figura abaixo ilustra como efetuar este procedimento na IDE Eclipse:

JDBC - MSSQL

JDBC – MSSQL

Diretório: C:\[Seu diretório de download]\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\ptb\

Driver: sqljdbc4.jar

Exemplo:

Neste exemplo usamos o driver JDBC SQL Server para efetuar uma conexão no banco de dados, para criar o banco de dados você pode usar nosso walkthrough de como instalar as o banco de dados Microsoft SQL Server Express with Tools.

Java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.sql.*;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ConexaoMssql implements ActionListener
{
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lbanco;
	private JLabel lusuario;
	private JLabel lsenha;
	private JTextField tbanco;
	private JTextField tusuario;
	private JPasswordField tsenha;
	private JButton botao;
	private JFrame menssagem;

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

	public Container criaPainel()
	{
		// Cria painel principal
		JPanel painel = new  JPanel();
		painel.setLayout(new BorderLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

		// Cria componente titulo
		ltitulo = new JLabel("Microsoft SQL Server Express");

		painel.add(ltitulo, BorderLayout.PAGE_START);

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes de usuario
		lbanco   = new JLabel("Banco de dados:");
		lusuario = new JLabel("Digite seu Usuario: ");
		lsenha   = new JLabel("Digite sua Senha: ");
		tbanco   = new JTextField();
		tusuario = new JTextField();
		tsenha   = new JPasswordField();

		// Define tamanho dos campos
		tusuario.setPreferredSize( new Dimension(120, 20));
		tsenha.setPreferredSize( new Dimension(120, 20));

		// Adiciona componentes no grid do painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lbanco);
		painelDados.add(tbanco);
		painelDados.add(lusuario);
		painelDados.add(tusuario);
		painelDados.add(lsenha);
		painelDados.add(tsenha);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria botão
		botao = new JButton("Conectar");
		botao.addActionListener(this);

		// Adiciona componentes no painel principal
		painel.add(painelDados);
		painel.add(botao, BorderLayout.PAGE_END);

		return painel;
	}

	public static void criaGUI()
	{
		// Cria formulario
		JFrame formulario = new JFrame("MSSQL Express 2012");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria classe da conexão
		ConexaoMssql conectar = new ConexaoMssql();

		// Define painel
		formulario.setContentPane(conectar.criaPainel());
		formulario.pack();

		// Mostra aplicação
		formulario.setVisible(true);
	}

	public void conectar(String banco, String login, String senha) {
        try
        {
        	// Define Driver de conexão JDBC thin
        	String URL =  "jdbc:sqlserver://Estacao01\\SQLEXPRESS:1433;databaseName=" + banco +
        			      ";user=" + login + ";password="+senha;

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

            		//Executa pedido SQL
            query = conn.createStatement();
            JOptionPane.showMessageDialog(menssagem, "Conexão Efetuada com sucesso!");
        } 

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

        catch (SQLException ex)
        {
        	JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
        	ex.printStackTrace();
        }
    }

	public void actionPerformed(ActionEvent arg0)
	{
	   // Verfica tamanho da senha
		char[] tamanho = tsenha.getPassword();

		if (tamanho.length == 0)

		{
		  	JOptionPane.showMessageDialog(menssagem, "Digite uma senha!");
		}
		else
		{
			// recupera senha do Java Password Field
			String psenha = new String(tsenha.getPassword());

			//Cria conexão
			ConexaoMssql conecta= new ConexaoMssql();
		    conecta.conectar(tbanco.getText(), tusuario.getText() , psenha);

		}

	}

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

			public void run() {

				// Cria e exibe GUI
				criaGUI();

			}
		});      

	}
}

Conexão IBM DB2 Express-C – JDBC – Java

Publicado: 7 de maio de 2014 em Java

DB2 Express-C é um banco de dados relacional que pode ser usado para armazenar, usar e modificar dados. O Java Database Connectivity (JDBC) padrão é usado por aplicativos Java para acesso e manipulação de dados em bancos de dados relacionais.

JDBC é um protocolo de acesso de banco de dados que permite que você se conecte a um banco de dados e execute instruções SQL e consultas no banco de dados. As bibliotecas de classe do núcleo de Java fornecem as APIs JDBC, java.sql e javax.sql. No entanto, JDBC é projetado para permitir que os vendedores forneçam drivers que oferecem a especialização necessária para um banco de dados específico.

DB2 - Java

DB2 – Java

String de Conexão

Em computação, uma string de conexão, é uma cadeia de caracteres que especifica informações sobre uma fonte de dados e os meios de conexão com ela. É passado o código para um controlador (driver) ou provedor subjacente com o objetivo de se iniciar a conexão. Apesar de comumente ser usado para conexão de banco de dados, a fonte de dados também pode ser uma planilha eletrônica ou um arquivo de texto.

DB2: //localhost:50000/sample (//servidor:porta/banco de dados)

Configurando Driver JDBC DB2

Para usar o driver JDBC para DB2 você pode adiciona-lo em seu projeto, clicando com o botão direito do mouse em cima do nome do projeto e escolhendo a opção propriedades, adicione o arquivo de driver na biblioteca do seu projeto usando a opção Add External JAR, a figura abaixo ilustra como efetuar este procedimento na IDE Eclipse:

DB2 - JDBC

DB2 – JDBC

Diretório: C:\Program Files\IBM\SQLLIB\java

Driver:

  • db2jcc.jar
  • db2jcc_license_cu.jar

The Derby network

O cliente da rede do Derby fornece conectividade de rede para o Derby Network Server. O IBM DB2 utiliza um driver universal que pertence a Apache Derby.

Exemplo:

Neste exemplo usamos o driver JDBC DB2 para efetuar uma conexão no banco de dados, para criar o banco de dados você pode usar nosso walkthrough de como instalar as o banco de dados IBM DB2 Express-C e a ferramenta IBM Data Studio.

Java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.sql.*;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ConexaoDb2 implements ActionListener
{
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lusuario;
	private JLabel lsenha;
	private JTextField tusuario;
	private JPasswordField tsenha;
	private JButton botao;
	private JFrame menssagem;

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

	public Container criaPainel()
	{
		// Cria painel principal
		JPanel painel = new  JPanel();
		painel.setLayout(new BorderLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

		// Cria componente titulo
		ltitulo = new JLabel("DB2 Express-C: net://localhost:50000/deva");

		painel.add(ltitulo, BorderLayout.PAGE_START);

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes de usuario
		lusuario = new JLabel("Digite seu Usuario: ");
		lsenha   = new JLabel("Digite sua Senha: ");
		tusuario = new JTextField();
		tsenha   = new JPasswordField();

		// Define tamanho dos campos
		tusuario.setPreferredSize( new Dimension(120, 20));
		tsenha.setPreferredSize( new Dimension(120, 20));

		// Adiciona componentes no grid do painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lusuario);
		painelDados.add(tusuario);
		painelDados.add(lsenha);
		painelDados.add(tsenha);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria botão
		botao = new JButton("Conectar");
		botao.addActionListener(this);

		// Adiciona componentes no painel principal
		painel.add(painelDados);
		painel.add(botao, BorderLayout.PAGE_END);

		return painel;
	}

	public static void criaGUI()
	{
		// Cria formulario
		JFrame formulario = new JFrame("DB2 Express-C");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria classe da conexão
		ConexaoDb2 conectar = new ConexaoDb2();

		// Define painel
		formulario.setContentPane(conectar.criaPainel());
		formulario.pack();

		// Mostra aplicação
		formulario.setVisible(true);
	}

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

            //Executa pedido SQL
            query = conn.createStatement();
            JOptionPane.showMessageDialog(menssagem, "Conexão Efetuada com sucesso!");
        } 

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

        catch (SQLException ex)
        {
        	JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
        	ex.printStackTrace();
        }
    }

	public void actionPerformed(ActionEvent arg0)
	{
	   // Verfica tamanho da senha
		char[] tamanho = tsenha.getPassword();

		if (tamanho.length == 0)

		{
		  	JOptionPane.showMessageDialog(menssagem, "Digite uma senha!");
		}
		else
		{
			// recupera senha do Java Password Field
			String psenha = new String(tsenha.getPassword());

			//Cria conexão
			 ConexaoDb2 conecta= new ConexaoDb2();
		    conecta.conectar(tusuario.getText() , psenha);

		}

	}

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

			public void run() {

				// Cria e exibe GUI
				criaGUI();

			}
		});      

	}
}

 

Conexão Oracle Database XE – JDBC – Java

Publicado: 7 de maio de 2014 em Java

Oracle Database XE é um banco de dados relacional que pode ser usado para armazenar, usar e modificar dados. O Java Database Connectivity (JDBC) padrão é usado por aplicativos Java para acesso e manipulação de dados em bancos de dados relacionais.

JDBC é um protocolo de acesso de banco de dados que permite que você se conecte a um banco de dados e execute instruções SQL e consultas no banco de dados. As bibliotecas de classe do núcleo de Java fornecem as APIs JDBC, java.sql e javax.sql. No entanto, JDBC é projetado para permitir que os vendedores forneçam drivers que oferecem a especialização necessária para um banco de dados específico.

JDBC Oracle

JDBC Oracle

Oracle JDBC Thin Driver

A Oracle recomenda usar o driver JDBC Thin para a maioria das necessidades. JDBC-OCI só necessário para recursos específicos de OCI. O driver Thin irá funcionar em qualquer sistema que tenha uma máquina virtual Java (JVM).

String de Conexão

Em computação, uma string de conexão, é uma cadeia de caracteres que especifica informações sobre uma fonte de dados e os meios de conexão com ela. É passado o código para um controlador (driver) ou provedor subjacente com o objetivo de se iniciar a conexão. Apesar de comumente ser usado para conexão de banco de dados, a fonte de dados também pode ser uma planilha eletrônica ou um arquivo de texto.

Oracle TNS Names

É um arquivo Net de configuração que define endereços de bancos de dados para estabelecer conexões com eles. Cada conexão criada por exemplo no Oracle SQL Developer ou qualquer outra ferramenta de desenvolvimento ou administração do banco de dados, é gravado uma string de conexão contendo os parâmetros para alcançar um servidor Oracle configurado. Por padrão o arquivo se encontra em:

Tnsnames.ora: C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN

Conteúdo:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Configurando Driver JDBC Oracle

Para usar o driver JDBC para Oracle você pode adiciona-lo em seu projeto, clicando com o botão direito do mouse em cima do nome do projeto e escolhendo a opção propriedades, adicione o arquivo de driver na biblioteca do seu projeto, a figura abaixo ilustra como efetuar este procedimento na IDE Eclipse:

Adicionando Oracle JDBC Driver

Adicionando Oracle JDBC Driver

Diretório: C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib

Driver: ojdbc6.jar

Exemplo:

Neste exemplo usamos o driver JDBC Oracle Thin para efetuar uma conexão no banco de dados, para criar o banco de dados você pode usar nosso walkthrough de como instalar as o banco de dados Oracle XE e a ferramenta Oracle SQL Developer.

Java

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.sql.*;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class ConexaoOracle implements ActionListener
{
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lusuario;
	private JLabel lsenha;
	private JTextField tusuario;
	private JPasswordField tsenha;
	private JButton botao;
	private JFrame menssagem;

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

	public Container criaPainel()
	{
		// Cria painel principal
		JPanel painel = new  JPanel();
		painel.setLayout(new BorderLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

		// Cria componente titulo
		ltitulo = new JLabel("Conexão Oracle XE 11g: @localhost:1521:xe");

		painel.add(ltitulo, BorderLayout.PAGE_START);

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes de usuario
		lusuario = new JLabel("Digite seu Usuario: ");
		lsenha   = new JLabel("Digite sua Senha: ");
		tusuario = new JTextField();
		tsenha   = new JPasswordField();

		// Define tamanho dos campos
		tusuario.setPreferredSize( new Dimension(120, 20));
		tsenha.setPreferredSize( new Dimension(120, 20));

		// Adiciona componentes no grid do painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lusuario);
		painelDados.add(tusuario);
		painelDados.add(lsenha);
		painelDados.add(tsenha);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria botão
		botao = new JButton("Conectar");
		botao.addActionListener(this);

		// Adiciona componentes no painel principal
		painel.add(painelDados);
		painel.add(botao, BorderLayout.PAGE_END);

		return painel;
	}

	public static void criaGUI()
	{
		// Cria formulario
		JFrame formulario = new JFrame("Oracle XE 11g");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria classe da conexão
		ConexaoOracle conectar = new ConexaoOracle();

		// Define painel
		formulario.setContentPane(conectar.criaPainel());
		formulario.pack();

		// Mostra aplicação
		formulario.setVisible(true);
	}

	public void conectar(String login, String senha) {
        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();
            JOptionPane.showMessageDialog(menssagem, "Conexão Efetuada com sucesso!");
        } 

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

        catch (SQLException ex)
        {
        	JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
        	ex.printStackTrace();
        }
    }

	public void actionPerformed(ActionEvent arg0)
	{
	   // Verfica tamanho da senha
		char[] tamanho = tsenha.getPassword();

		if (tamanho.length == 0)

		{
		  	JOptionPane.showMessageDialog(menssagem, "Digite uma senha!");
		}
		else
		{
			// recupera senha do Java Password Field
			String psenha = new String(tsenha.getPassword());

			//Cria conexão
			ConexaoOracle conecta = new ConexaoOracle();
		    conecta.conectar(tusuario.getText() , psenha);

		}

	}

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

			public void run() {

				// Cria e exibe GUI
				criaGUI();

			}
		});      

	}
}

Em interface gráfica do usuário (GUI), uma interface de documentos múltiplos, ou MDI, acrônimo para Multiple Document Interface é um método de organização de aplicações gráficas em janelas que residem em uma única janela, a janela principal da aplicação. A única exceção são possíveis janelas modais da aplicação.

Com múltiplas interfaces de documentos, uma única barra de menu e / ou barra de ferramentas é compartilhado entre todas as janelas filho, reduzindo a desordem e uma utilização mais eficiente do espaço na tela. As janelas filho de um aplicativo pode ser ocultada / mostrada / minimizada / maximizada como um todo. Os autores de aplicações multi-plataforma podem fornecer a seus usuários um comportamento consistente da aplicação entre plataformas.

Interface de Múltiplos Documentos

Interface de Múltiplos Documentos

JDesktopPane

É um recipiente utilizado para criar uma interface de documentos múltiplos ou uma área de trabalho virtual. Você cria objetos JInternalFrame e adicioná-los ao JDesktopPane. A classe JDesktopPane estende o  JLayeredPane para gerenciar os quadros internos potencialmente sobrepostos. Ele também mantém uma referência a uma instância de DesktopManager que é definido pela classe UI para o Look and Feel da aplicação.

JInternalFrame

Um objeto leve que fornece muitas das características de uma estrutura nativa, incluindo arrastar, fechar, mostrar um ícone, redimensionar, exibir títulos, e também possui suporte para uma barra de menus.

Exemplo:

Neste exemplo criamos um formulário MDI básico e um menu.

Java

Classe – Janela Pai


import javax.swing.JDesktopPane;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

import java.awt.event.*;
import java.awt.*;


public class FormularioMdi extends JFrame implements ActionListener
{
	// Declara componetes
    JDesktopPane painel;

    public FormularioMdi() 
    {
    	// herda classe
    	super("Java - Formularios - MDI - JFrame / JDesktopPane / JInternalFrame");
        
    	// Define tamanho da janela principal
        int bordas = 50;
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(bordas, bordas, tela.width  - bordas *2 , tela.height - bordas *2);
        
        // Cria painel principal
        painel = new JDesktopPane(); 
        painel.setBackground(Color.LIGHT_GRAY);
                
        setContentPane(painel);
        setJMenuBar(createMenuBar());        
    }

    protected JMenuBar createMenuBar()
    {
    	// Cria barra de menu
        JMenuBar barra = new JMenuBar();
        
        // Cria menu
        JMenu menu = new JMenu("Formularios");        
        barra.add(menu);

        // Cria itens dos menus
        JMenuItem item = new JMenuItem("Novo");
        item.setActionCommand("novo");
        item.addActionListener(this);
        menu.add(item);

        //Cria segundo item
        item = new JMenuItem("Sair");
        item.setActionCommand("sair");
        item.addActionListener(this);
        menu.add(item);

        return barra;
    }

    
    public void actionPerformed(ActionEvent e) 
    {
    	// Cria eventos do menu
        if (e.getActionCommand() == "novo")
        { 
            criaFormulario();
        } 
        else 
        {
            sair();
        }
    }

    protected void sair() 
    {
    	// Fecha sistema
        System.exit(0);
    }
    
    protected void criaFormulario()
    {
    	// Cria formulario filho
    	FormularioFilho frame = new FormularioFilho();
        frame.setVisible(true); 
        
        // Adiciona janela filho na janela pai
        painel.add(frame);
        try 
        {
        	// Seta foco
            frame.setSelected(true);
        }
        catch (java.beans.PropertyVetoException e)        
        {
        	
        }
    }
       
    
    private static void criaGUI() 
    {     
    	// Decora barra da janela
    	JFrame.setDefaultLookAndFeelDecorated(true);

    	// Cria formulario filho     
        FormularioMdi formulario = new FormularioMdi();
        formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        // Exibe formulario
        formulario.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() 
            {
            	// Chama GUI
                criaGUI();
            }
        });
    }
}

Classe – Janela Filho

import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class FormularioFilho extends JInternalFrame
{   
	// Declara componentes
	JLabel rotulo;
	JTextField campo;
	JButton botao;
	
	// Declara variaveis
	static int formulario = 0;
    static int posicao = 30;
    
    public FormularioFilho()
    {    	
    	// Herda da classe filho
    	super("Formulario Filho - Instancia :" + (++formulario), true, true, true, true);

    	// Cria painel
        setContentPane(criaPainel());
    	pack();
        
    	// Define posição do formulario
        setLocation(posicao * formulario, posicao * formulario);        
        
    }
    
    public Container criaPainel()
    {
    	// Cria painel
    	JPanel painel = new JPanel(); 
    	
    	// Define layout
    	painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS));
		painel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
		
		// Cria componentes
		rotulo = new JLabel("Digite Seu nome:");
		campo = new JTextField();
		botao = new JButton("Ok");
		
		// define tamanho do campo
		campo.setPreferredSize(new Dimension(300,20));
		
		// Adiciona componentes ao painel	
		painel.add(rotulo);		
		painel.add(Box.createVerticalStrut(10));
		painel.add(campo);
		painel.add(Box.createVerticalStrut(20));
		painel.add(botao);
    	
    	return painel;
    }
    
    private static void criaGUI() 
    {
    	// Cria GUI (Janela Filho)
        JFrame.setDefaultLookAndFeelDecorated(true);
     
        FormularioMdi formulario = new FormularioMdi();
        formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        // Exibe formulario
        formulario.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() 
            {
            	// Chama GUI
                criaGUI();
            }
        });
    }
}

Visual – JToolTip – Java

Publicado: 29 de abril de 2014 em Java

Tooltip é um elemento comum de interface gráfica GUI, também conhecida como dica de contexto é aquela moldura pop up que abre quando você passa o mouse sobre um elemento da interface (normalmente uma palavra em um texto) e que contém uma explicação adicional sobre aquele elemento que recebeu o ponteiro do mouse sobre ele. É utilizado em conjunto com um cursor, normalmente um ponteiro do mouse. O usuário paira o cursor sobre um item, sem clicar nele, e uma pequena “caixa” irá aparece com informações complementares relativas a este item.

JToolTip

JToolTip

JToolTip

Usado para exibir uma dica” para um componente. Normalmente componentes fornecem api para automatizar o processo de utilização de dicas de ferramentas. Por exemplo, qualquer componente Swing pode usar o método JComponent setToolTipText para especificar o texto para uma dica de ferramenta padrão. Um componente que quer criar uma exibição personalizada dica de ferramenta pode substituir o método createToolTip de JComponent e usar uma subclasse dessa classe.

Exemplo:

Neste exemplo usamos o método setToolTipText para exibir uma dica para o usuário ao pairar o cursor do mouse sobre o botão.

Java

import java.awt.Container;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Dicas {

	// Declara componentes
	JLabel rotulo;
	JButton botao;

	// Declara variaveis
	String dica = "Desenvolvimento Aberto - " +
	              "Clique neste botão para executar uma ação.";			     

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

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

		// Cria componentes
		rotulo = new JLabel("Pare o cursor em cima do botão por alguns segundos");
		botao  = new JButton("Aperte Aqui!");

		// Cria tooltip
		botao.setToolTipText(dica);

		// Adiciona componentes ao painel
		painel.add(rotulo);
		painel.add(Box.createVerticalStrut(10));
		painel.add(botao);

		return painel;
	}

	public static void criaGUI()
	{
		// Cria formulario
		JFrame formulario = new JFrame("DA - ToolTip");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Cria instancia da classe
		Dicas dicas = new Dicas();

		// Define painel de conteudo
		formulario.setContentPane(dicas.criaPainel());

		// Define propriedades do formulario
		formulario.pack();
		formulario.setVisible(true);

	}

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

			@Override
			public void run()
			{
				// Mostra GUI
				criaGUI();
			}

		});

	}

}