Mybatis resultMap学习

场景1:返回结果为javaBean,且Bean对象的属性不存在层级嵌套关系

mybatis映射文件中,select语句查询列名与Bean的属性名对应,返回结果类型使用resultType指定即可;

场景2:返回结果为javaBean,且Bean对象的属性存在层级嵌套关系

定义resultMap,select语句返回结果类型使用resultMap指定.

注:如果部分查询列名与Bean的未嵌套的部分属性列名相同,不用在resultMap中使用result标签刻意指出这部分查询列名与Bean属性的对应关系.只需要指出名称不同的部分以及嵌套的部分对应的映射关系即可.

嵌套时,如果Bean中的属性名存在相同的情况,就给查询列定义别名,然后再使用result标签进行映射即可.

特别要注意,resultMap中最好都定义下id标签,如果多个属性可以确定唯一性的话,那么就定义多个id标签.不定义id标签,mybatis也能正常区别唯一性,但是十分耗性能.id标签最好是定义主键和属性和映射关系.

id使用举例如下:
    <resultMap type="User" id="selectUserMap" autoMapping="true">
         <id property="id" column="id"/>

         <id property="name" column="name"/>

(如果需要两个属性才能确定一个User,例如id+name,就定义两个id标签)
        <result property="userName" column="userName"/>
        <result property="sex" column="sex"/> -->
        <association property="teacher" javaType="Teacher" autoMapping="true">

            <id column="teacherId" property="id"/>

(teacherId确定teacher唯一性。由于user与teacher都有id属性,且用户表和教师表主键字段名都为id,所以查询时,给老师的主键字段取了个别名teacherId,然后用别名进行映射)
            <result column="teacherName" property="teacherName"/>
        </association>
    </resultMap>
    

例如下面的例子:

数据库表BLOG与表AUTHOR字段名定义与Blog实体类及Author实体类定义的属性名一样.

这里就不需要刻意在resultMap中指出查询列名与Bean属性的对应关系.

<resultMap id=”blogResult” type=”Blog”>
<association property="author" column="blog_author_id" javaType="Author"
select=”selectAuthor”/>
</resultMap>
 

<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”>
SELECT * FROM BLOG WHERE ID = #{id}
</select>
 
<select id=”selectAuthor” parameterType=”int” resultType="Author">
SELECT * FROM AUTHOR WHERE ID = #{id}
</select>
如果是使用嵌套结果的形式,resultMap要写成如下形式:

<resultMap id=”blogResult” type=”Blog”>
<association property="author" column="blog_author_id" javaType="Author">

(注意,被嵌套的部分属性,即使查询列名与javaType或者是ofType中指定的Bean属性名一致,也需要使用result标签显式指定查询结果列与Bean属性的对应关系,否则被嵌套的这部分属性值无法映射上)

<result column="authorName" property="authorName" jdbcType="VARCHAR"/>

<association/>
</resultMap>

猜你喜欢

转载自blog.csdn.net/qq_33315102/article/details/81220560