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>