terça-feira, 19 de outubro de 2010

Isaac_Amorim - NETBEANS

>CHAMANDO UMA CLASSE (cadastro de produto)

|||||||||||CODIGO... USO NETBEANS 5.0||||||||||||||


/*
* Cadastro_de_Produtos.java
*
* Created on 19 de Outubro de 2010 as 22:13
/

package examples;

/**
*
* @author User
*/
public class Cadastro_de_Produtos extends javax.swing.JFrame {

/** Creates new form Cadastro_de_Produtos */
public Cadastro_de_Produtos() {
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel2.setBackground(new java.awt.Color(245, 243, 239));
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Descri\u00e7oes e Medidas"));
jLabel1.setText("Produto");

org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
.add(jLabel1)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(326, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel1)
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap(233, Short.MAX_VALUE))
);

org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
jTabbedPane1.addTab("tab1", jPanel1);

org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jTabbedPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 343, Short.MAX_VALUE)
);
pack();
}//


/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Cadastro_de_Produtos().setVisible(true);
Cadastro_de_Produtos.setDefaultLookAndFeelDecorated(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTextField jTextField1;
// End of variables declaration

}

Isaac_Amorim - DAO

DAO: o intermediário entre os mundos

XMLs, a grosso modo, são um conjunto de tags dispostas de modo hierárquico, contendo informações estruturadas. Arquivos texto são um conjunto de caracteres. Bancos de dados relacionais são um conjunto de tabelas, colunas, e linhas. Aplicações Java são um conjunto de objetos.

O DAO deve funcionar como um tradutor dos mundos. Suponha um banco relacional. O DAO deve saber buscar os dados do banco e converter em objetos para ser usado pela aplicação. Semelhantemente, deve saber como pegar os objetos, converter em instruções SQL e mandar para o banco de dados. É assim que um DAO trabalha.

Abstração

Devido à sua qualidade de tradutor, o DAO abstrai a origem e o modo de obtenção / gravação dos dados, de modo que o restante do sistema manipula os dados de forma transparente, sem se preocupar com o que acontece por trás dos panos. Isso ajuda muito em processos de migrações de fonte de dados e testes unitários.

Unificação do acesso a dados

É muito comum em códigos de programadores iniciantes vermos a base de dados sendo acessada em diversos pontos da aplicação, de maneira extremamente explícita e repetitiva. Isso é um crime contra um bom design OO. Além de não abstrair a fonte dos dados, transforma o código em um espaguete difícil de manter. O DAO também nos ajuda a resolver este problema, provendo pontos unificados de acesso a dados. Desse modo, a? lógica? de interação com a base de dados ficam em lugares específicos e especializados nisso, além de eliminar códigos redundantes, facilitando a manutenção e futuras migrações.

DAO na prática

Geralmente, temos um DAO para cada objeto do domínio do sistema (Produto, Cliente, Compra, etc.), ou então para cada módulo, ou conjunto de entidades fortemente relacionadas.

Cada DAO deve possuir uma interface, que especifica os métodos de manipulação de dados. Nossos códigos trabalharão apenas com as interfaces dos DAOs, desconhecendo a implementação utilizada. Isso é uma boa prática, não somente em termos de persistência, mas em vários outros pontos de uma aplicação.

Para exemplificar, vamos tratar dos usuários do nosso sistema. O primeiro passo é definir uma classe User.



public class User {
private String name, password;
// Construtores e sets / gets omitidos
}
public class User {
private String name, password;
// Construtores e sets / gets omitidos
}



Agora, especificaremos a interface UserDao:



public interface UserDao {
public void save (User user);
public void delete (User user);
public List list ();
public User find (String name);
}


public interface UserDao {
public void save (User user);
public void delete (User user);
public List list ();
public User find (String name);
}




Observe que UserDao não contem nenhuma informação específica da origem dos dados. Agora, podemos codificar os nosso Daos, implementando esta interface.

class JDBCUserDao implements UserDao {...}

class HibernateUserDao implements UserDao {...}



class TextFileUserDao implements UserDao {...}
class JDBCUserDao implements UserDao {...}

class HibernateUserDao implements UserDao {...}



class TextFileUserDao implements UserDao {...}



Aqui exemplificamos três implementações possíveis. Uma, usando ? JDBC puro ?; a segunda, usando o framework Hibernate e a última persistindo em arquivo texto.


DAO + Factory ou DI (Dependency Injection)

Apesar de termos a interface UserDao, não há nenhum proveito em criarmos nossos DAOs desta maneira:



UserDao dao = new HibernateUserDao();


UserDao dao = new HibernateUserDao();



Se fizermos de tal modo, de nada nos aproveitará, em termos de abstração, usarmos uma interface para o DAO. O ideal é que usemos o pattern Factory ou DI (Injeção de Dependências) para máxima transparência. Nesse artigo, usaremos o Factory.

O pattern Factory implementa uma fábrica de objetos, abstraindo e isolando o modo de criação dos objetos. Veja um exemplo simples:



public class Factory {
public static UserDao createUserDao () {
return new HibernateUserDao ();
}
}
public class Factory {
public static UserDao createUserDao () {
return new HibernateUserDao ();
}
}



Assim, o único lugar em toda a aplicação que conhece a implementação de DAO usada é aqui. Quando precisarmos do UserDao, ao invés de instanciar com um new, chamaremos a fábrica:

UserDao userDao = Factory.createUserDao ();



//... use a abuse do userDao
UserDao userDao = Factory.createUserDao ();



//... use a abuse do userDao



Não entraremos em detalhes sobre a implementação destes patterns, visto que poderão ser alvos de estudo em próximos artigos.

Patterns relacionados

Há outros patterns relacionados à persistência, como o ActiveRecord e o Repository.