Anotações e Suas Funcionalidades
Em projetos baseados em Spring, diversas anotações são empregadas para configurar e gerenciar componentes. A anotação @Configuration marca classes que definem beans para o contêiner Spring, permitindo métodos com @Bean que retornam objetos gerenciados. Para habilitar a documentação de APIs REST, utiliza-se @EnableSwagger2, que integra o framework Swagger. A anotação @Bean indica que um método produz um bean a ser registrado no contexto da aplicação, com o Spring invocando o método apenas uma vez.
Controladores REST são definidos com @RestController, que combina @Controller e @ResponseBody para retornar dados diretamente no corpo da resposta HTTP. O mapeamento de requisições é feito via @RequestMapping, que pode ser refinado com variantes como @GetMapping para leitura ou @PostMapping para criação. A injeção de dependências é facilitada por @Autowired, que injeta beans automaticamente em campos, setters ou construtores.
Para documentação de operações API, @ApiOperation fornece detalhes como descrições e tipos de resposta. Em camadas de acesso a dados, @Mapper marca interfaces para MyBatis, gerando implementações automaticamente, enquanto @Repository identifica componentes DAO para persistência. A anotação @Param vincula parâmetros de requisição a argumentos de métodos em controladores.
Camadas de serviço são indicadas com @Service para lógica de negócios, e @Override garante que um método sobrescreve corretamente um da superclasse. A anotação @Transactional gerencia transações declarativamente, garantindo atomicidade: alterações são revertidas em caso de exceções não tratadas durante a execução.
Configuração de Arquivos de Projeto
Arquivos de configuração definem parâmetros essenciais para a aplicação. Exemplo em formato properties:
spring.application.name=meu-servico
# Driver JDBC para conexão com banco de dados MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# URL de conexão com parâmetros de encoding e fuso horário
spring.datasource.url=jdbc:mysql://localhost:3306/meubanco?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
# Credenciais de acesso ao banco
spring.datasource.username=usuario
spring.datasource.password=senha
# Estratégia de correspondência de caminhos no Spring MVC
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
# Localização dos arquivos de mapeamento MyBatis
mybatis.mapper-locations=classpath:mapeamentos/*.xml
# Pacote de aliases para entidades MyBatis
mybatis.type-aliases-package=com.exemplo.projeto.entidades
# Porta do servidor
server.port=8080
Alternativamente, em formato YAML:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/meubanco?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: usuario
password: senha
mvc:
pathmatch:
matching-strategy: ant_path_matcher
mybatis:
mapper-locations: classpath:mapeamentos/*.xml
type-aliases-package: com.exemplo.projeto.entidades
server:
port: 8080
Conceitos e Exemplos em SQL
Em consultas SQL, funções e técnicas específicas são frequentemente utilizadas. A função COALESCE retorna o primeiro valor não nulo de uma lista de argumentos, útil para tratar dados ausentes. Em subconsultas, SELECT 1 atua como um placeholder, onde o valor "1" é irrelevante e serve apenas para verificar a existência de linhas. O operador LEFT JOIN retorna todos os rgeistros da tabela esquerda, mesmo quando não há correspondências na tabela direita.
Parâmetros em consultas, como #{nome}, são placeholders que são substituídos por valores reais antes da execução, prevenindo ataques de injeção SQL. Considere a seguinte instrução SQL atualizada com nomes de tabelas e colunas modificados:
UPDATE inventario
SET quantidade_estoque = quantidade_estoque + COALESCE(
(SELECT SUM(qtd_entrada) FROM entradas WHERE entradas.nome_item = inventario.nome_item),
0
)
WHERE EXISTS (
SELECT 1 FROM entradas WHERE entradas.nome_item = inventario.nome_item
)
AND inventario.nome_item = #{item.nome};
Esta consulta atualiza o campo quantidade_estoque na tabela inventario. Ela soma o total de qtd_entrada da tabela entradas para itens correspondentes, usando COALESCE para tratar valores nulos. A cláusula WHERE EXISTS garante que a atualização ocorra apenas se houver registros relacionados, e #{item.nome} é um parâmetro dinâmico que filtra o item específico. A lógica asesgura que a quantidade seja ajustada com base nas entradas registradas, mantendo a integridade dos dados.