Pular para o conteúdo
Skillpedia
Código em geral280 mil · #89

mybatis-patterns

Ajuda seu agente a trabalhar com o banco de dados MyBatis. Melhora o design de consultas, o uso de transações e a performance.

O que ela faz

Esta ferramenta ajuda a organizar e otimizar o código que interage com bancos de dados usando a tecnologia MyBatis. Ela garante que suas consultas sejam seguras, eficientes e fáceis de entender.

Quando usar

  • ✓Ao escrever ou revisar como o programa acessa dados.
  • ✓Ao decidir entre diferentes formas de escrever comandos para o banco de dados.
  • ✓Ao tentar fazer o programa buscar dados mais rapidamente.

Exemplo do que pedir para a IA

“Como posso garantir que minhas consultas ao banco de dados com MyBatis sejam seguras contra ataques?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/mybatis-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/mybatis-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ela funciona analisando seu código que usa MyBatis para encontrar padrões comuns e sugerir melhorias. Isso inclui verificar como os dados são enviados e recebidos, e como as transações são gerenciadas.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill mybatis-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/mybatis-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões do MyBatis

Use o MyBatis quando o controle SQL e os mapeamentos explícitos forem importantes. Mantenha o SQL legível, faça contratos de mapper pequenos e coloque transações de negócios na camada de serviço. Combine essa habilidade com springboot-patterns para estrutura de aplicação, database-migrations para alterações de esquema, postgres-patterns ou mysql-patterns para SQL específico do motor, e security-review para entrada não confiável e preocupações de controle de acesso.

Quando Ativar

  • Adicionando ou revisando interfaces de mapper do MyBatis ou arquivos XML
  • Escolhendo entre mappers XML, mappers de anotação e SQL gerado
  • Projetando mapeamentos resultMap, joins, coleções aninhadas ou projeções
  • Revisando SQL dinâmico, vinculação de parâmetros, paginação ou escritas em lote
  • Depurando consultas N+1, instruções lentas, uso de conexão ou bugs de transação
  • Integrando MyBatis-Spring ao Spring Boot ou a uma aplicação legada com prioridade em XML

Como Funciona

Use um mapper fino para operações de persistência e mantenha as regras de negócios em um serviço. Um fluxo típico é:

Controller / batch job -> Service (@Transactional) -> Mapper -> Database
  • Registre os mappers uma vez, seja com @Mapper em cada interface ou com @MapperScan para um pacote. Não misture abordagens de registro casualmente.
  • Mantenha o namespace XML igual ao nome totalmente qualificado da interface do mapper.
  • Dê a cada instrução um id estável e descritivo; trate os métodos do mapper como uma API de persistência que pode ser testada independentemente.
  • Retorne um DTO de domínio ou projeção para caminhos de leitura em vez de expor um mapa mutável grande quando a forma é conhecida.
  • Mantenha as alterações de esquema em migrações. Não faça o startup do mapper criar ou alterar tabelas de produção silenciosamente.

Exemplos

@MapperScan("com.example.user.persistence")
@Configuration
class MyBatisConfig {
}

public interface UserMapper {
  UserSummary findSummaryById(long userId);
}
<mapper namespace="com.example.user.persistence.UserMapper">
  <select id="findSummaryById"
          parameterType="long"
          resultType="com.example.user.persistence.UserSummary">
    SELECT id, display_name AS displayName, status
    FROM users
    WHERE id = #{userId}
  </select>
</mapper>

Vinculação de Parâmetros e Segurança SQL

Use #{...} para valores. O MyBatis o vincula como um parâmetro de prepared-statement. Trate ${...} como texto SQL bruto: ele é apropriado apenas para um valor selecionado de uma lista de permissões fechada e de propriedade da aplicação, como um mapa de coluna de ordenação.

private static final Map<String, String> SORT_COLUMNS = createSortColumns();

private static Map<String, String> createSortColumns() {
    Map<String, String> columns = new HashMap<>();
    columns.put("name", "display_name");
    columns.put("created", "created_at");
    return Collections.unmodifiableMap(columns);
}

String sortColumn = SORT_COLUMNS.getOrDefault(request.sort(), "created_at");
String sortDirection = request.descending() ? "DESC" : "ASC";
// The mapper receives only an allowlisted identifier; user input is never
// passed directly to ${sortColumn} or ${sortDirection}.
<select id="findPage" resultType="com.example.user.persistence.UserSummary">
  SELECT id AS id,
         display_name AS displayName,
         status AS status,
         created_at AS createdAt
  FROM users
  WHERE tenant_id = #{tenantId}
  ORDER BY ${sortColumn} ${sortDirection}
  LIMIT #{limit}
</select>

Derive tenantId do principal autenticado ou de um contexto de tenant do lado do servidor, nunca de um campo de requisição. Autentique o principal e verifique se ele está autorizado para o tenant antes de invocar o mapper; mantenha o predicado tenant_id em SQL como defesa em profundidade.

Se possível, evite ${} inteiramente selecionando entre instruções fixas ou usando um construtor de consulta específico do banco de dados. Nunca interpole a entrada do usuário em um nome de tabela, nome de coluna, ORDER BY, fragmento WHERE ou expressão SQL.

Para múltiplos parâmetros, use um objeto de requisição ou nomes explícitos de @Param:

List<UserSummary> findActive(
    @Param("tenantId") long tenantId,
    @Param("statuses") Set<UserStatus> statuses
);

Não use o elemento externo obsoleto parameterMap. Prefira mapeamentos de parâmetros inline e jdbcType explícitos para valores anuláveis quando o driver JDBC precisar.

XML, Tipos de Resultado e Mapas de Resultado

  • Use resultType para um mapeamento simples de um para um cujos rótulos de coluna já correspondem às propriedades de destino.
  • Use resultMap quando aliases, manipuladores de tipo, objetos aninhados ou coleções precisarem de mapeamento explícito.

…

Perguntas frequentes

O que é MyBatis?

MyBatis é uma ferramenta que ajuda programas Java a se comunicarem com bancos de dados, permitindo escrever comandos SQL de forma mais organizada.

O que são 'mappers'?

Mappers são como tradutores entre o código do seu programa e os comandos SQL. Eles definem quais dados buscar e como apresentá-los.

Por que a segurança das consultas é importante?

Consultas inseguras podem permitir que pessoas mal-intencionadas acessem ou modifiquem seus dados. Esta ferramenta ajuda a prevenir isso.

Detalhes

Descrição original do autor

MyBatis and MyBatis-Spring patterns for mapper design, XML and annotation SQL, result mapping, dynamic SQL safety, transactions, batching, pagination, and query performance. Use when building or reviewing Java persistence code with MyBatis, Spring Boot, MyBatis-Spring, or MyBatis-based legacy applications.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#89
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas