O que incluir em uma classe de banco de dados
On Fevereiro 15, 2021 by admin Atualmente, estou desenvolvendo um aplicativo java, que se comunicará com um servidor SQL. Portanto, criei a classe Database
que é responsável por open()
e close()
.
Quero poder adicionar dados ao banco de dados. Neste exemplo, a tabela é chamada de trabalho. Portanto, criei uma classe Job
. Além desses trabalhos, haverá (muitas) coisas diferentes, que serão armazenadas no banco de dados. Minha pergunta é: onde coloco meu método addJob(Job j)
? Até agora, posso pensar em três soluções possíveis:
-
Adicione o método
addJob(Job j)
aoDatabase
classe que fornece abstração para o resto do programa. O resto do programa não precisa se preocupar como isso é implementado. A desvantagem disso é queDatabase
ficará muito grande eventualmente. -
Crie uma classe separada
JobHandler
com o construtorpublic JobHandler(Database d)
que aceita um Banco de Dados. NesteJobHandler
, pretendo fornecer oaddJob(Job j)
. Meu problema é aqui, em que nível devo interagir com oDatabase
, pois atualmente não há métodos públicos, excetoopen()
eclose()
. Devo criar um método que aceite instruções sql puras? Isso não me parece muito bom. -
Torne a classe
Database
abstrata e estenda-a para que eu implemente os métodos ausentes aqui . O lado ruim é que não posso passar o banco de dados e usar a mesma conexão para várias consultas de diferentes tipos.
O que alguém faria para resolver esse problema? Como devo estruturar minhas classes para que elas não fiquem muito grandes e também não seja necessário expor muito da classe do banco de dados às classes que implementam os métodos para lidar com os dados?
Editar Observe que esse trabalho é uma classe aleatória, que deve servir apenas como um exemplo para os dados armazenados no banco de dados.
Comentários
- " O que se faria para resolver este problema? " Existem aproximadamente 9001 bibliotecas maduras que fazem exatamente tudo isso. Use uma delas.
- Você pode me dar um exemplo de tal biblioteca. Eu gostaria de dar uma olhada nela.
- O que você quer dizer com Job sendo apenas um exemplo de dados?
- Reformulei a frase.
- Em seguida, encontre um exemplo melhor, caso contrário, as pessoas pensarão que problema é sobre trabalhos de banco de dados (tarefas agendadas), independentemente da leitura da edição explicativa. Também a questão é muito br oad e / ou não está claro.
Resposta
A pergunta é muito confusa. O que torna tudo mais confuso é o fato de que você decidiu usar Job and Jobhandler como exemplos, o que nos faz pensar que a questão é sobre jobs de banco de dados (tarefas agendadas). Mas depois de ler a edição, acho que você está tentando escrever um DAO e estava falando sobre empregos como “uma posição de emprego”.
Não escreva uma classe de banco de dados. Basta criar uma conexão JDBC e passá-la para o DAO.
Você pode tentar escrever um DAO genérico ou escrever DAOs individuais para cada entidade. DAOs terão SQL frases dentro dele.
Outro padrão é Padrão Active Record .
DAOs acessam bancos de dados, encapsulando SQL e permitem que você para preencher os objetos de negócios. DAOs também podem ter métodos que retornam listas de dados.
O Active Record é geralmente usado para implementar objetos de negócios que gerenciam a gravação e leitura de seus dados do banco de dados. Isso é considerado muito já que as classes não devem controlar sua própria persistência. Os Active Records representam uma única linha de uma tabela.
Esta questão sobre a refatoração de um Active Record no formulário DAO irá ajudá-lo porque tem um exemplo completo de um objeto que acessa os bancos de dados e insere ou atualiza e suas respostas explicam como implementar DAO.
Comentários
- Você pode mencionar ORM frameworks também.
- @COMEFROM OP é um iniciante. Ele deve aprender a nadar antes de dirigir um jet ski. ORMs são incrivelmente complexos.
- Obrigado pela sua resposta. Estou me referindo a " apenas criar uma conexão de banco de dados ". Isso significaria criar uma conexão na classe principal com todo o tratamento de erros etc.? Não ' isso entraria em conflito com o princípio de responsabilidade única?
- A classe principal não ' tipicamente obedece ao SRP porque geralmente prepara as pré-condições, lê arquivos de configuração, etc., abre a janela principal no caso de aplicativos GUI, ou pelo menos chama os métodos que fazem isso, sua finalidade é ser um ponto de entrada para o aplicativo. Você pode criar uma função que retorna uma conexão e chamá-la de principal ou pode solicitar uma conexão a um gerenciador de pool de conexão se estiver usando um contêiner da web que suporte pools de conexão, etc.
Deixe uma resposta