DAO, tá certo isso?

6 respostas
S

Bom, pessoal li todo aquele documento, sobre DAO da core java lá do site da sun
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Acabei criando ele só nem sei se apliquei os conceitos certos será que alguém poderia verificar minhas classes, e me dar algumas dicas?
Ainda estou bem cru nisso. =P

package org.shimoyama.database.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public abstract class AbstractMusicDAO {
	
	private Connection connection;
	
	public AbstractMusicDAO() {
		try{
			this.connection = this.openConnection();
		} catch (SQLException error) {
			error.printStackTrace();
		}
	}
	
	/**
	 * used to open a conection
	 * @return
	 */
	private Connection openConnection() throws SQLException {
		
		Connection  connection = null;
		try{ 
			Class.forName("org.sqlite.JDBC");
			connection = DriverManager.getConnection("jdbc:sqlite:music.dll");
		}catch(ClassNotFoundException error){
			error.printStackTrace();
		}
		return connection;
	}
	
	/**
	 * 
	 * @return
	 */
	public Connection getConnection(){
		return this.connection;
	}
	
	/**
	 * 
	 * @throws SQLException
	 */
	public void closeConnection() throws SQLException {
		this.connection.close();
	}
	
	/**
	 * Commit the actual transaction
	 * @throws SQLException
	 */
	public void commitTransaction() throws SQLException {
		this.connection.commit();
	}
	
	/**
	 * Rollback the actual transaction
	 * @throws SQLException
	 */
	public void rollbackTransaction() throws SQLException {
		this.connection.rollback();
	}
	
	/**
	 * turn on\off the auto-commit for any connection
	 * stablished previously  
	 * @param auto
	 * @throws SQLException
	 */
	public void setAutoCommit(boolean auto) throws SQLException {
		this.connection.setAutoCommit(auto);
	}
	
	
}
package org.shimoyama.database.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.shimoyama.database.to.MusicTO;

public class MusicDAO extends AbstractMusicDAO{

	public MusicDAO() {
		
	}
	
	/**
	 * 
	 * @return
	 */
	public List<MusicTO> selectAllMusics(){
		
		List<MusicTO> list = new ArrayList<MusicTO>();
		
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT TITLE, ARTIST, ALBUM ");
		sql.append("FROM TBLMUSIC");
		
		PreparedStatement statement = null;
		try {
			statement = getConnection().prepareStatement(sql.toString().toLowerCase());
			ResultSet result = statement.executeQuery();
			while(result.next()){
				MusicTO music = new MusicTO();
				music.setAlbum(result.getString("album"));
				music.setArtist(result.getString("artist"));
				music.setTitle(result.getString("title"));
				list.add(music);
			}
		} catch(SQLException error) {
			error.printStackTrace();
		} finally {
			try{
				getConnection().close();
				statement.close();
			}catch(SQLException error){
				error.printStackTrace();
			}
		}
		
		return list;
		
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean insertOneMusic(MusicTO music){
		
		boolean inserted = Boolean.FALSE;
		int rows = 0;
		
		StringBuffer sql = new StringBuffer();
		sql.append("INSERT INTO tblmusic(");
		sql.append("TITLE, ARTIST, ALBUM)");
		sql.append("VALUES(?,?,?)");
		
		PreparedStatement statement = null;
		try{
			getConnection().setAutoCommit(false);
			statement = getConnection().prepareStatement(sql.toString());
			statement.setString(1, music.getTitle());
			statement.setString(1, music.getArtist());
			statement.setString(2, music.getAlbum());
			rows = statement.executeUpdate();
			
			if(rows > 0){
				getConnection().commit();
				inserted = Boolean.TRUE;
			} else {
				getConnection().rollback();
				inserted = Boolean.FALSE;
			}
			
		} catch(SQLException error) {
			if(error.toString().equals("java.sql.SQLException: no such table: tblmusic")){
				try{
					sql = new StringBuffer();
					sql.append("create table tblmusic (title, artist, album);");
					statement = getConnection().prepareStatement(sql.toString());
					statement.executeUpdate();
					getConnection().commit();
					insertOneMusic(music);
				}catch(Exception ex){
					ex.printStackTrace();
				}
			}
			System.out.println("Error to String "+error.toString());
			error.printStackTrace();
		} finally {
			try{
				getConnection().close();
				statement.close();
			}catch(SQLException error){
				error.printStackTrace();
			}
		}
		return inserted;
	}
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean insertSortedMusics(List<MusicTO> music){
		
		boolean inserted = Boolean.FALSE;
		
		StringBuffer sql = new StringBuffer();
		sql.append("INSERT INTO TBLMUSICS(");
		sql.append("TITLE, ARTIST, ALBUM)");
		sql.append("VALUES(?,?,?)");
		
		Iterator<MusicTO> iteMusics = music.iterator();
		PreparedStatement statement = null;
		
		try{
			getConnection().setAutoCommit(false);
			statement = getConnection().prepareStatement(sql.toString());
			while(iteMusics.hasNext()){
				statement.setString(1, iteMusics.next().getTitle());
				statement.setString(1, iteMusics.next().getArtist());
				statement.setString(2, iteMusics.next().getAlbum());
				statement.addBatch();
			}
			statement.executeBatch();
			getConnection().commit();
		}catch(SQLException error){
			error.printStackTrace();
		} finally{
			try{
				statement.close();
				getConnection().close();
			}catch(SQLException error){
				error.printStackTrace();
			}
		}
		
			
		return inserted;
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean deletedMusic(MusicTO music){
		
		boolean deleted = Boolean.FALSE;
		
		return deleted;
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean updatedMusic(MusicTO music){
		
		boolean updated = Boolean.FALSE;
		
		return updated;
	}
	
	public static void main(String[] agrrs){
		
		List<MusicTO> list = new ArrayList<MusicTO>();
		list = new MusicDAO().selectAllMusics();
		
		for(MusicTO music :list){
			System.out.println("Artista "+music.getArtist());
			System.out.println("Album "+music.getAlbum());
			System.out.println("Title "+music.getTitle());
		}
		
	}
	
}
package org.shimoyama.database.to;

public class MusicTO {
	
	public MusicTO(){
		
	}
	
	private String title;
	private String artist;
	private String album;
	
	public String getTitle() {
		return this.title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getArtist() {
		return this.artist;
	}
	public void setArtist(String artist) {
		this.artist = artist;
	}
	public String getAlbum() {
		return this.album;
	}
	public void setAlbum(String album) {
		this.album = album;
	}
	
	
}
package org.shimoyama.database.delegate;

import org.shimoyama.database.to.MusicTO;

import java.util.List;
import java.util.ArrayList;

public class MusicDelegate {
	
	public MusicDelegate(){
	}
	
	/**
	 * 
	 * @return
	 */
	public List<MusicTO> selectAllMusics(){
		
		List<MusicTO> list = new ArrayList<MusicTO>();
	
		return list;
		
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean insertMusic(MusicTO music){
		
		boolean inserted = Boolean.TRUE;
		
		return inserted;
		
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean deleteMusic(MusicTO music){
		
		boolean deleted = Boolean.TRUE;
		
		return deleted;
	}
	
	/**
	 * 
	 * @param music
	 * @return
	 */
	public boolean updateMusic(MusicTO music){
		
		boolean inserted = Boolean.TRUE;
		
		return inserted;
	
	}
	
}

6 Respostas

wariows

O DAO tá certinho sim…

Só uma sugestão, dá uma lida em http://www.fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs e procura no fórum, tem vários tópicos no guj sobre o quão nocivo é trabalhar com um modelo anêmico…

VO,BO,TO… isso tudo é fruto da falida ejb…

Enfim, dá uma lida…
[]´s

ddduran

Bom kra tem muitos topicos sobre DAOs aqui no GUJ, tantos que estou ate com preguiça de colar alguns aqui.

Mas aqui vai algumas dicas (que ja foram discutidas)

1 - trate suas exceções ou “jogue”, seu dao está cheio de metodos (inclusive seu construtor) otimistas.
2 - ao inves de vc abrir sua conexão no seu dao, faça isso num ConnectionFactory por exemplo e faça seu dao receber uma conexão no construtor.
Seu dao fica mais especialista e alem do mais sua implementação atual não permite que haja uma mesma transação usando dois DAOs diferentes.
3 - não seria melhor você só ter uma interface DAO, por que a classe abstrata, nenhum dos metodos dela são aplicaveis a todos a MusicsDAOs, só coisa de conexão, commit, etc… quando você tiver um cliente vai fazer um AbstractClienteDAO igualzinho a esse? CCCV Programming?
4 - Seus DAOs não devem jogar SQLExceptions, teoricamente um DAO deveria abstrair a forma como a persistencia dos dados é feita, se você joga um SQLException, todos sabemos que a persistencia é feita em um SGBD, amanha se você quiser que suas consultas venham de um WS, como vai ser? Pra que esse DAO ai então?

5 - http://www.guj.com.br/jforum.java?module=search&action=search&search_keywords=dao&match_type=all&search_forum=&sort_by=relevance

Espero que ajude

sergiotaborda

Essa teve graça… :lol: :lol: :lol:

S

wariows:
O DAO tá certinho sim…

Só uma sugestão, dá uma lida em http://www.fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs e procura no fórum, tem vários tópicos no guj sobre o quão nocivo é trabalhar com um modelo anêmico…

VO,BO,TO… isso tudo é fruto da falida ejb…

Enfim, dá uma lida…
[]´s

Peraí, peraí, então este tipo de modelo tá morto?

me corrijam se eu estiver errado , e se li corretamente, mas as TO também deve ter a métodos para que assim sejam considerados como objetos, não apenas como beans?

ddduran

Todo pattern é uma solução em um determinado contexto…
Ainda existem muitas aplicações que usam EJB 2, nesse contexto, por exemplo, eles são aplicaveis.
Bom mas o topico é sobre DAOs e não TOs :slight_smile:

rod

Shin_danieru:
wariows:
O DAO tá certinho sim…

Só uma sugestão, dá uma lida em http://www.fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs e procura no fórum, tem vários tópicos no guj sobre o quão nocivo é trabalhar com um modelo anêmico…

VO,BO,TO… isso tudo é fruto da falida ejb…

Enfim, dá uma lida…
[]´s

Peraí, peraí, então este tipo de modelo tá morto?

me corrijam se eu estiver errado , e se li corretamente, mas as TO também deve ter a métodos para que assim sejam considerados como objetos, não apenas como beans?

Sua classe MusicTO nao presisa do sufixo TO, utilize apenas o nome Music e caso precise adicione os comportamentos pertinentes a essa classe.

Sobre o padrao TO (Transfer Object), ele é um padrao da Sun (blueprints) que se chamava VO (Value Object), mas por entrar em conflito de nome com outro pattern foi renomeado para TO. Esse pattern é recomendado somente quando voce precisa trafegar dados entre camadas (tiers, nao layers!) geralmente utilizando em sistemas distribuidos que utilizam EJB2.

De resto o pessoal já deu boas dicas! :wink:

[]'s

Criado 24 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 6
Participantes 5