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:
Conectando ao Oracle:
Conectando ao IBM DB2:
Conectando ao Microsoft SQL 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(); } }); } }