Lembra do projeto do terceiro módulo do frontend, onde foi necessário implementar um painel admin rpg para a API do servidor? Se alguém se lembra, um mapa foi usado como armazenamento no servidor. Naturalmente, na vida real, esses armazenamentos não são usados, mas bancos de dados são usados. O objetivo deste projeto será escrever uma implementação de camada de repositório alternativa usando Hibernate.
Para isso você precisa:
- Fork de um repositório
- Baixe sua versão do projeto para o seu computador.
- Adicione dependências ao pom.xml:
- mysql:mysql-connector-java:8.0.30
- org.hibernate: hibernate-core-jakarta: 5.6.11.Final
- Faça uma compilação maven (instalação limpa mvn). Para variar, usamos o Java versão 1.8.
- Adicionar configuração de inicialização via Idea. A implementação deste item pode ser encontrada na palestra https://codegym.cc/quests/lectures/cgu.module3.lecture02 (item 4). A única diferença é um nome diferente para o artefato. Se você fez tudo certo e lançou o aplicativo, verá algo assim:
- Execute o script de criação do esquema rpg no Workbench:
CREATE SCHEMA `rpg` ;
- Opcional . Se quiser ver qual comportamento é esperado, você pode alterar
com.game.service.PlayerService
o valor de anotação de “db” para “memory” na classe no parâmetro do construtor . Nesse caso, o Spring usará o . Após o teste, não esqueça de alterar o valor da anotação de volta para "db" .@Qualifier
IPlayerRepository
PlayerRepositoryMemory
@Qualifier
- Organize todas as anotações necessárias na classe de entidade
com.game.entity.Player
. A tabela deve ser nomeada "jogador", esquema "rpg". Para enams, use@Enumerated(EnumType.ORDINAL)
além da anotação@Column
. Deixe-me lembrá-lo de que o comprimento do campo de nome deve ser de até 12 caracteres, o campo de título - de até 30 caracteres. Absolutamente todos os campos não devem ser nulos. PlayerRepositoryDB
Adicione um campo final privado na classeSessionFactory sessionFactory
, inicialize esse campo no construtor da classe. Use as propriedades como em tarefas normais (trabalharemos com o banco de dados MySQL versão 8). De interessante - adicionar
Isso permitirá que você não crie uma tabela manualmente (ou através da execução de um script sql).properties.put(Environment.HBM2DDL_AUTO, "update");
- Implemente todos os métodos de classe. Para variar, vamos fazer assim:
- Implemente o método
getAll
atravésNativeQuery
- Implemente o método
getAllCount
atravésNamedQuery
- No método
beforeStop
, chame osessionFactory
método yclose
. Por ter uma anotação no método@PreDestroy
, o Spring chamará esse método antes de parar o aplicativo, e isso permitirá que você libere todos os recursos do sistema de forma válida. - A implementação de outros métodos depende de você. Mas não se esqueça das transações e commits para métodos que de alguma forma alteram o conteúdo do banco de dados.
- Inicie o aplicativo. Se você fez tudo certo, obterá um aplicativo funcional. Mas não há dados lá, então execute o script init.sql (de recursos) através do Workbench para que eles apareçam. Depois disso, pressione F5 no navegador e verifique se você implementou todos os métodos corretamente.
- Seria interessante ver exatamente quais consultas o Hibernate executa, então vamos adicionar o log de consulta. Para fazer isso, adicione a dependência p6spy:p6spy:3.9.1 a pom.xml . Na pasta de recursos, crie um arquivo spy.properties , no qual especifique:
E no construtor da classe PlayerRepositoryDB, altere duas opções:driverlist=com.mysql.cj.jdbc.Driver dateformat=yyyy-MM-dd hh:mm:ss a appender=com.p6spy.engine.spy.appender.StdoutLogger logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
Agora, na saída do servidor para cada solicitação, você verá 2 linhas. A primeira é qual declaração é preparada, a segunda é a consulta com os parâmetros inseridos.properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver"); properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
Isso é tudo, o projeto está pronto, parabéns!
Na verdade, trabalhar com o Hibernate do Spring usa uma abordagem diferente, que abordaremos no quinto módulo.
Análise de projetos.
GO TO FULL VERSION