通过resultMap自定义查询结果映射

mybatis中使用resultType做自动映射时,要注意字段名和pojo的属性名必须一致,若不一致,则需要给字段起别名,保证别名与属性名一致。

使用resultMap做自定义结果映射,字段名可以不一致,并且可以指定要显示的列,比较灵活,应用也广泛。

<select id="getUserList" resultMap="userList" parameterType="User">
  select u.*, r.roleName from smbms_user u, smbms_role r 
  where u.userName like connect ('%', #{userName}, '%')
  and u.userRole=#{userRole} and u.userRole=r.id
</select>

<resultMap id="userList" type="User">
  <result property="id" column="id"/>
  <result property="userCode" column="userCode"/>
  <result property="userName" column="userName"/>
  <result property="phone" column="phone"/>
  <result property="birthday" column="birthday"/>
  <result property="gender" column="gender"/>
  <result property="userRole" column="userRole"/>
  <result property="userRoleName" column="roleName"/>
</resultMap>

 在上述代码中,进行联表查询,可得到用户对应角色的中文名称

resultMap元素用来描述如何将结果集映射到java对象,此处使用resultMap对象展示所需的必要字段进行自由映射,特别是当数据库的字段名和pojo中的属性名一致的情况下。

result子节点用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋给实体对象的哪个属性。

在mybatis进行查询映射的时候,查询出来的每个字段值都放在一个对应的Map里面,其中键是字段名,值则是其对应的值。当select元素提供的返回类型属性是resultType的时候,mybatis会将Map里面的键值对取出赋值给resultType所指定的对象对应的属性(即调用对应的对象的属性的setter方法进行填充)。正因为如此,当使用resultType的时候,直接在后台就能接收到其对应的对象属性值

由此看出,其实mybatis的每个查询映射的返回类型都是restultMap,只是当我们提供的返回类型属性是resultType的时候,mybatis会自动把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型属性是resultMap的时候,因为Map不能很好的表示领域模型,就需要通过进一步的定义把它转化为对应的实体对象。

在mybatis的select元素中,resultType和resultMap的本质上是一样的,都是Map数据结构。二者不能同时存在

resultMap自动映射级别

上述代码中,查询出了smbms_user表的所有属性,虽然resultMap中映射关联了部分属性,但是没有在resultMap中做映射关联的属性(字段名一致的属性)在后台也能正常输出。这跟resultMap的自动映射级别有关,默认的映射级别为PARTIAL。若想让没有在resultMap中做映射关联的属性不输出,则需要设置mybatis对于resultMap的自动映射级别(autoMappingBehavior)为NONE,即禁止自动匹配。如下

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE configuration PUBLIC
                "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="autoMappingBehavior" value="NONE"/>
    </settings>
</configuration>

猜你喜欢

转载自www.cnblogs.com/yanguobin/p/11698675.html