Date post: | 06-Jun-2015 |
Category: |
Documents |
Upload: | mauricio-linhares |
View: | 1,069 times |
Download: | 0 times |
Java AvançadoMaurício Linhares
Especialização em Desenvolvimento para a Web - iDez
Assuntos da aula
Revisão;
Composição e agregação de objetos;
Testes unitários em Java com JUnit;
Classe File;
Classes InputStream e OutputStream;
Classes Reader e Writer;
FileChannels e NIO;
Parsing de XML com DOM e StAX;
Acesso a bancos de dados em Java com JDBC;
Associações entre objetos
Objetos podem referenciar outros objetos como suas propriedades;
Quando objetos são associados, dois tipos de associação se configuram:Composição;Agregação;
Agregação
Quando um objeto referencia um ou mais objetos mas os objetos referenciados existem independentemente de quem os referencia;
Na agregação, os objetos referenciados normalmente são acessíveis para todos e fazem parte da API pública do objeto;
Eles tem outras responsabilidades no sistema além de serem referenciados pelo agregador;
Modelagem do barzinho da esquina
Modelando uma UniversidadeExercício
Composição
Associação na qual um objeto é tido como “dono” dos objetos os quais ele referencia;
Os objetos referenciados agora não podem mais existir sem o objeto raiz, não faz sentido os ter dentro do sistema de forma separada;
Em muitos casos, os objetos referenciados não ficam visíveis para quem utiliza o objeto raiz;
Modelando um carro
Modelando um computadorExercício
Introdução aos testes unitários
O que são testes unitários?
Pra que servem os testes unitários?
Eles são realmente testes?
Prática – TDD com Contas Bancárias
Prática – Criando uma classe Dinheiro
Prática – Calculando a data de entrega de um pedido
Arquivos em Java – java.io.File
Classe base que representa um caminho:ArquivosDiretóriosCaminho virtual (que ainda não existe no sistema de
arquivos)
Pode ser usada para:Criar;Remover;Mover;
Métodos comuns
createNewFile | mdkirCria um arquivo ou diretório
mkdirsCria o diretório e todos os diretórios pais que ainda
não existam
lenghtDiz o tamanho do arquivo em bytes
rename( File ) Renomeia (move) um arquivo para o caminho
passado como parâmero
Métodos comuns
delete()Remove o arquivo ou o diretório (apenas se o
diretório estiver vazio);
list()Lista todos os arquivos e pastas que estejam nesse
diretório (retorna nomes de arquivos, não caminhos);
list(FilenameFilter)Lista todos os arquivos do diretório que atenderem
ao requisito;
InputStream e OutputStream
Fluxo padrão para leitura e escrita de dados em formato binário em Java;
É usado para ler e escrever em arquivos, memória, conexões de rede ou entrada/saída padrão do sistema;
Contém várias classes complementares;
Outras de classes Stream em Java
Buffered(Input/Output)Stream;
File(Input/Output)Stream;
ByteArray(Input/Output)Stream;
Streams em Java – Decorator pattern
InputStream
FileInputStream
BufferedInputStream
Criando um OutputStream que faz backup automático
Object(Input|Output)Stream e Serializable
Classes utilizadas para escrever objetos Java diretamente em um arquivo;
Objetos salvos em formato binário, lido diretamente pela classe ObjectOutputStream;
Maneira simples de gravar dados da aplicação, mas pouco portável e pode causar problemas de compatibilidade;
Lendo e escrevendo Serializables em arquivos
Reader e Writer – lidando com caracteres
Classes especializadas em escrever fluxos de caracteres;
Podem ser utilizadas diretamente ou em conjunto (“decorando”) Input e Output streams;
Mais simples de serem utilizadas;
Classes comuns
InputStreamReader|InputStreamWriter;
File(Reader|Writer);
String(Reader|Writer);
CharArray(Reader|Writer);
Criando um par de Reader/Writer que criptografam o conteúdo
Criando um writer que faz backup do arquivo escritoExercício
FileChannel e NIO
Nova API para leitura e escrita de arquivos;
Faz escrita assíncrona e não bloqueante;
Normalmente é mais rápida que a forma comum;
Código bem mais complicado para lidar com arquivos;
Lendo e escrevendo em arquivos com FileChannel
Parsing de Arquivos XML
XML é um fomato padrão para troca de informações entre aplicações, seja via rede ou diretamente ingerindo arquivos;
Há várias formas de se fazer parsing de arquivos, sendo as mais comuns:DOM;SAX;StAX;
Fazendo parsing to staff.xml
Fazendo parsing da lista de músicasExercício
Lista de Albuns
Lista de Artistas
Gerando XML (e texto em geral) com FreeMarker
Engine de templates comum do Java, muito utilizado pra geração de XML e templates de email;
Tem sintaxe parecida com a dos JSP, é simples de ser utilizada e tem poucas dependências externas;
É capaz de executar condicionais simples dentro dos seus templates, quando necessário;
Exemplo de template do FreeMarker
<?xml version="1.0"?>
<empregados>
<#list empregados as empregado>
<empregado>
<nome>${empregado.id?html}</nome>
<#if empregado.posicao??>
<posicao>${empregado.posicao!}</posicao>
</#if>
</empregado>
</#list>
</empregados>
Acesso a bancos de dados em Java
Em Java, o acesso a bancos de dados é feito através da JDBC, que é a API de acesso a banco de dados padrão;
Os fornecedores desenvolvem Drivers JDBC que podem ser utilizados pelos
Acessando um banco de dados
Class.forName("org.h2.Driver");
Connection conexao = DriverManager.getConnection("jdbc:h2:~/clientes", "sa", "");
Passos
Primeiro você deve carregar a classe do Driver JDBC;
Após a carga, você pode abrir uma conexão com o banco através dos métodos getConnection() da classe DriverManager;
Executando comandos
Os comandos ou consultas feitas em Java usam os objetos Statement e PreparedStatement;
Um Statement é uma consulta comum feita através de uma String;
Um PreparedStatement é uma consulta que é pré-compilada e tende a ser mais rápida e mais segura que o Statement;
Exemplo de código usando JDBC
Connection conexao = DriverManager.getConnection("jdbc:h2:~/clientes", "sa", "");
Statement statement = conexao.createStatement();
statement.executeUpdate("CREATE TABLE clientes(id int, nome varchar, senha varchar, email varchar)");
conexao.close();
Usando um PreparedStatement para executar um update
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/lastfm", "root", "");
PreparedStatement statement = connection.prepareStatement( "update tracks set processed = true where id = ? and updated_at = ?" );
statement.setInt(1, id);
statement.setDate(2, new Date());
statement.executeUpdate();
connection.close();
Usando um PreparedStatement para fazer uma consulta
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/lastfm", "root", "");
PreparedStatement statement = connection.prepareStatement( "SELECT * FROM tracks" );
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()) {
Track track = new Track();
track.title = resultSet.getString("title");
track.id = resultSet.getInt("id");
tracks.add(track);
}
connection.close();