Perturbando o Povo com Modelagem!

Bem, estou no caminho certo?

A propósito, alguém conhece o livro:
Modelagem e Projetos Baseados em Objetos - Tradução da 2ª Edição
Rumbaugh, James; Blaha, Michael / CAMPUS

package br.com.trimbase.rastreio.bd;

import java.sql.*;

public class DAO {

	// Pretendo fazer desse DAO algo generico (para qq banco), por isso estes atributos
	private ConnectionPool pool = null;
	private Connection con = null;
	private String host = null;
	private String usuario = null;
	private String senha = null;
	private String URL = null;
	private String driver = null;
	private String baseDados = null;
	private String prefixoBase = null;
	private String porta = null;
	
	public DAO() {
		super();
		host        = "localhost";
		usuario     = "postgres";
		senha       = "agente86";
		driver      = "org.postgresql.Driver";
		baseDados   = "os";
		prefixoBase = "jdbc:postgresql://";
		porta       = "5432";

		URL = prefixoBase + host + ":" + porta + "/" + baseDados + "/";
	}

	public synchronized Connection getConnection() {
		pool = ConnectionPool.getInstance(URL, usuario, senha, driver, 5);
		con = pool.getConnection();
		return con;
	}
	
	public synchronized void liberaConexao(Connection con) {
		if (pool != null) {
			pool.returnConnection(con);
		}
	}
	
	public void terminaConexoes() {
		if (pool != null) {
			pool.release();			
		}
		pool = null;
	}

	public ConnectionPool getPool() {
		return pool;
	}

	public void setPool(ConnectionPool pool) {
		this.pool = pool;
	}
}
package br.com.trimbase.rastreio.bd;

import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.ResultSet;

public abstract class DAOGenerico {
	private DAO dao = new DAO();
	private Connection conn = dao.getConnection();

	public long getCodigo(String sequencia) {
		long retorno = 0;
		PreparedStatement stmt;
		String sql;
		try {
			sql  = " SELECT nextval(\'" + sequencia + "\') ";
			stmt = getConn().prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while ((rs != null) && (rs.next())) {
				retorno = rs.getLong(1);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		dao.liberaConexao(conn);

		sql  = null;
		stmt = null;
		dao  = null;
		conn = null;
		
		return retorno;
	}
	
	public Connection getConn() {
		return conn;
	}
	
	public void setConn(Connection conn) {
		this.conn = conn;
	}

	public DAO getDao() {
		return dao;
	}

	public void setDao(DAO dao) {
		this.dao = dao;
	}
}
package br.com.trimbase.agente.dao;

import java.sql.PreparedStatement;
import br.com.trimbase.rastreio.bd.DAOGenerico;
import br.com.trimbase.agente.*;

public class FisicaDAO extends DAOGenerico {
	
	public boolean cadastra(Fisica fisica) {
		boolean retorno = false;
		PreparedStatement stmt;
		long codAgente = getCodigo("agente_agecod_seq");
		
		String sql = " INSERT INTO agente (agecod, agenom, ageobs) VALUES (?, ?, ?) "; 

		try{
			stmt = getConn().prepareStatement(sql);
			stmt.setLong(1, codAgente);
			stmt.setString(2, fisica.getNome());
			stmt.setString(3, fisica.getObs());
			retorno = stmt.execute();
			
			if (retorno) {
				sql = " INSERT INTO fisica (fisage, fiscpf) VALUE (?, ?) ";
				stmt = getConn().prepareStatement(sql);
				stmt.setLong(1, codAgente);
				stmt.setString(2, fisica.getCpf());
				retorno = stmt.execute();
			}
		}catch (Exception ex) {
			ex.printStackTrace();
		}
		
		getDao().liberaConexao(getConn());

		sql  = null;
		stmt = null;
		setDao(null);
		setConn(null);

		return retorno;
	}
}

Dar uma olhada nesse livro, pois fazer manutenção em código cheio de SQL não é aconsekhável, pois imagina que teu cliente deseja mudar para outro banco, tipo oracle, ai vc vai ter que ajsuatr todos os SQL que não funcionam no oracle. Hibernate é uma ferramente poderossima de mapeamento objeto relacional e ainda oferece possibilidades de consultas OO.

http://www.temporeal.com.br/produtos.php?id=171506

Já usei o Hibernate e hoje estou em um conflito danado entre ele e o JDBC. Até criei um post sobre isso, na semana passada, para tratar desse assunto.
Veja: http://www.guj.com.br/posts/list/73078.java

Agora, esse livro é melhor que o Hibernate em Ação? Tenho este último e a tradução torna a sua leitura quase impraticável.

Essa edição revisada e ampliada é melhor?

Estou considerando, seriamente, usar Hibernate nesse projeto.

Abraços!

Ainda não vi a tradução dele, mas o original em inglês está bom, este livro mostra como fazer o mapeamento usando annontations, que elimina o uso de XML para mapear as classes.

Beleza! Vou dar uma olhada nisso.

Mas ainda gostaria de saber informações sobre o livro que citei. Pretendo compra-lo amanhã.

Também gostaria de receber as críticas quanto a modelagem que adotei. Como das outras vezes, sinto que algo não está legal, mas não sei o que é!

Abraços!

P.S. Você tem algum irmão, primo, tio, sei lá, chamado Marlos? Jogador de Xadrez? Conheço um grande jogador chamado Marlos Damasceno que participa de um fórum de xadrez, onde também participo, o clube-de-xadrez.

[quote=celso.martins]A propósito, alguém conhece o livro:
Modelagem e Projetos Baseados em Objetos - Tradução da 2ª Edição
Rumbaugh, James; Blaha, Michael / CAMPUS
[/quote]

Eu conheço, já li esse livro e é muito bom. Recomendo.

Creio que já seja o suficiente para eu comprar, obrigado!

Acho que ficou, conceitualmente, um pouco mais bonito.
Criei o método liberaConexao em DAOGenerico e movi para lá <<dao = null e conn = null>>
A classe DAO permanece igual:

package br.com.trimbase.rastreio.bd;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public abstract class DAOGenerico {
	private DAO dao = new DAO();
	private Connection conn = dao.getConnection();

	public long getCodigo(String sequencia) {
		long retorno = 0;
		PreparedStatement stmt;
		String sql;
		try {
			sql  = " SELECT nextval(\'" + sequencia + "\') ";
			stmt = getConn().prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while ((rs != null) && (rs.next())) {
				retorno = rs.getLong(1);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		liberaConexao(conn);

		sql  = null;
		stmt = null;
		dao  = null;
		conn = null;
		
		return retorno;
	}
	
	public void liberaConexao(Connection conn) {
		dao.liberaConexao(conn);
		this.dao  = null;
		this.conn = null;
	}
	
	public Connection getConn() {
		return conn;
	}
	
	public void setConn(Connection conn) {
		this.conn = conn;
	}

	public DAO getDao() {
		return dao;
	}

	public void setDao(DAO dao) {
		this.dao = dao;
	}
}
package br.com.trimbase.agente.dao;

import java.sql.PreparedStatement;
import br.com.trimbase.rastreio.bd.DAOGenerico;
import br.com.trimbase.agente.*;

public class FisicaDAO extends DAOGenerico {
	
	public boolean cadastra(Fisica fisica) {
		boolean retorno = false;
		PreparedStatement stmt;
		long codAgente = getCodigo("agente_agecod_seq");
		
		String sql = " INSERT INTO agente (agecod, agenom, ageobs) VALUES (?, ?, ?) "; 

		try{
			stmt = getConn().prepareStatement(sql);
			stmt.setLong(1, codAgente);
			stmt.setString(2, fisica.getNome());
			stmt.setString(3, fisica.getObs());
			
			if (stmt.execute()) {
				sql = " INSERT INTO fisica (fisage, fiscpf) VALUE (?, ?) ";
				stmt = getConn().prepareStatement(sql);
				stmt.setLong(1, codAgente);
				stmt.setString(2, fisica.getCpf());
				retorno = stmt.execute();
			}
		}catch (Exception ex) {
			ex.printStackTrace();
		}
		
		liberaConexao(getConn());

		sql  = null;
		stmt = null;

		return retorno;
	}
	
	public boolean altera(Fisica fisica) {
		boolean retorno = false;
		PreparedStatement stmt;
		
		String sql = " UPDATE agente SET agenom = ?, ageobs = ? WHERE agecod = ? "; 

		try{
			stmt = getConn().prepareStatement(sql);
			stmt.setString(1, fisica.getNome());
			stmt.setString(2, fisica.getObs());
			stmt.setLong(3, fisica.getCod());
			
			sql = " UPDATE fisica SET fiscpf = ? WHERE fisage = ? ";
			stmt = getConn().prepareStatement(sql);
			stmt.setString(1, fisica.getCpf());
			stmt.setLong(2, fisica.getCod());
			retorno = stmt.execute();
		}catch (Exception ex) {
			ex.printStackTrace();
		}
		
		liberaConexao(getConn());

		sql  = null;
		stmt = null;

		return retorno;
	}
}

E continuo tentando fazer as pazes com as linhas de código. =)

Um Abraço!