Compreendendo as Diferenças entre resultMap e resultType no MyBatis

O resultType e o resultMap são utilizados no MyBatis para mapear os resultados de consultas SQL para objetos Java. Embora ambos compartilhem o objetivo de popular objetos, o resultMap oferece um nível de controle e flexibilidade muito superior.

A principle diferença reside na forma como o mapeamento é realizado. O resultType depende de uma correspondência automática, o que exige que os nomes das colunas no banco de dados sejam idênticos aos nomes dos atributos na classe Java. Por outro lado, o resultMap permite a configuração explícita de cada coluna para o respectivo atributo, resolvendo discrepâncias de nomenclatura e habilitando o mapeamento de relacionamentos complexos entre tabelas.

Abaixo, exploramos os cenários mais comuns de utilização do resultMap:

Mapeamento de Tabela Única

Ao utilizar o resultMap, é necessário defini-lo no arquivo mapper.xml, estabelecendo a relação entre as colunas da tabela e os atributos do objeto POJO.

<resultMap type="com.example.model.Purchase" id="purchaseResultMap">
    <id column="purchase_id" property="id"/>
    <result column="client_id" property="clientId"/>
    <result column="purchase_code" property="code"/>
    <result column="purchase_date" property="date"/>
    <result column="description" property="notes"/>
</resultMap>

Consultas com Relacionamento Um para Um

Para lidar com relacionamentos um para um, o resultMap utiliza a tag <association>. Essa abordagem permite aninhar um objeto de outra tabela dentro do objeto principle.

<resultMap type="com.example.model.Purchase" id="purchaseWithClientMap">
    <id column="purchase_id" property="id"/>
    <result column="client_id" property="clientId"/>
    <result column="purchase_code" property="code"/>
    <result column="purchase_date" property="date"/>
    
    <association property="client" javaType="com.example.model.Client">
        <id column="client_id" property="id"/>
        <result column="client_name" property="name"/>
        <result column="client_email" property="email"/>
        <result column="client_phone" property="phone"/>
    </association>
</resultMap>

Consultas com Relacionamanto Um para Muitos

Quando uma entidade principal possui uma coleção de entidades relacionadas (um para muitos), utilizamos a tag <collection>. Além disso, é possível utilizar o atributo extends para herdar configurações de mapeamento previamente definidas, evitando repetição de código.

<resultMap type="com.example.model.Purchase" id="purchaseWithItemsMap" extends="purchaseWithClientMap">
    <collection property="items" ofType="com.example.model.PurchaseItem">
        <id column="item_id" property="id"/>
        <result column="product_id" property="productId"/>
        <result column="quantity" property="quantity"/>
        <result column="unit_price" property="unitPrice"/>
    </collection>
</resultMap>

Tags: MyBatis resultmap resulttype ORM java-persistence

Publicado em 6-22 22:14