Como acessar o MySQL e o Oracle com a mesma classe Dao

14 respostas
javaprogramação
fventurajr

Aprendi em um curso que devemos criar um pacote de persistência onde há uma classe Dao, em que são definidos objetos que serão usados na conexão, abertura e fechamento de banco de dados. Para cada entidade a ser persistida devo criar uma classe derivada da Dao, como ProdutoDao, ClienteDao, …

Até aí, tudo bem, mas na Dao já é apontada a instância de um banco de dados específico, mas e se eu necessitar que a minha aplicação acesse, por exemplo uma base MySql e Oracle? Devo criar uma Dao com um argumento que me permita alternar entre as bases? Há um padrão de projeto para isso? Talvez o factory?

14 Respostas

lvbarbosa

Pode definir uma interface ou classe abstrata com as operações de acesso ao banco, e ter uma implementação concreta para cada banco

javaflex

Se realmente necessitar você investe esforço nisso, pois é muito raro acontecer. Quando acontece a tendência é usar coisas como JPA/Hibernate.

j-menezes

Isso quase sempre acontece quando a gente deixa a disposicao do cliente escolher qual banco de dados quer usar, principalmente em ERP.

É resolvido na camada de implementacao que carrega a DAO.

pmlm

Mas deve aceder a Mysql e Oracle simultaneamente? Ou deve aceder a Mysql ou Oracle consoante diferentes instalações?

j-menezes

Isso facilmente resolve usando a implementacao.
Uma implementacao para cada Banco.
É instanciado e usado o correto.

fventurajr

Fizeram uma sugestáo para eu transformar o aceso ao Oracle(legado) criando um webservice, enquanto uso o MySQL como banco para a aplicação. Acha uma boa ideia?

fventurajr

Sim. Estou desenvolvendo uma aplicação informal para a secretaria e disponho e quero usar o mysql, mas exite uma tabela no Oracle que me atende e me pouparia trabalho.

fventurajr

Vocë diz para eu criar uma interface Dao e duas implementações, uma para cada banco?

public interface Dao() {
open();

close();
}

public class DaoOracle implements Dao() {
...
}
public class DaoMySql implements Dao() {
...
}
javaflex

Só se tiver a necessidade, pra nao virar overhead. Se já usam Oracle, pq adicionar mais um SGDB?

fventurajr

O Oracle é da empresa. Eu usaria a instância de desenvolvimento apenas para consulta. MySql é free. Se você me disser que eu posso usar o Oracle XE vou responder que não existe ele para o Mac.

E seu eu fizer

Public class Dao() {

Connection con;

PreparedStatement stmt;

ResultSet rs;

private String driver;

private String url;

private Boolean isOracle;

public Dao() {

this.IsOracle = False;

}

public Dao(Boolean isOracle) {

if ( isOracle ) {

driver = com.oracle.jdbc.Driver;

url = jdbc:oracle://localhost:1521/banco1”;

} else {

driver = com.mysql.jdbc.Driver;

url = jdbc:mysql://localhost:3306/banco2”;

}

public void open() {

Class.forName(driver);

con = DriverManager.getConnection(url, user, “”)/

con.open();

}


javaflex

Neste caso está aumentando a complexidade da aplicação por limitacao do seu ambiente, não pela necessidade do cliente.

j-menezes

Isso, por ai mesmo.

fventurajr

Mas deve haver um método consagrado pelas boas práticas. Talvez uma fábrica de conexões, pois mesmo que não tenha muita lógica trabalhar com mais de um sgbd, o mesmo não sepode dizer de uma aplicação que acesse, dentro do mesmo SGBD, bancos diferentes.

Por exemplo, posso estar fazendo uma aplicação financeira que use um banco FINANCAS no MySQL e exista um aplicação do RH da empresa onde existam os cadastros e aí quero acessar o banco CADASTRO em MySQL. Do mesmo jeito a minha Dao precisa, ora apontar para um banco, ora para outro.

javaflex

Quando necessário para o cliente nenhum problema, mas você tinha informado que era por causa do sistema operacional que você usa não suportar.

Mas se quer fazer isso, não precisa de nenhuma firula de padrões ou overhead de webservice. Cria uma classe pra conectar e retornar a conexão com o Oracle, com isso bastar usar a conexão na classe que fará acesso a essa tabela que voce precisa do Oracle.

Criado 14 de abril de 2020
Ultima resposta 15 de abr. de 2020
Respostas 14
Participantes 5