mybatis: resultMap 结果集映射和多表查询

mybatis 在进行 select 查询操作的时候,返回类型可以用 resultType,也可以用 resultMap;

resultType 是直接表示返回类型的(一般返回为基本数据类型时使用,当查询的是一条SQL数据时,且这条SQL数据的每个字段都和一个Javabean 中的属性名 与之对应,mybatis 会通过 autoMapping ,将每个字段的值赋给 Javabean),而当字段名和属性名不一致时,这时可以使用 resultMap 

resultMap 是对外部的一个 ResultMap 标签的引用,并且  resultType 跟 resultMap 不能同时存在。 

一个简单 resultMap 查询

<!-- 单个对象查询第二中写法,手动映射参数 -->
    <resultMap type="teacher" id="restMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
    </resultMap>
    <select id="selBy" resultMap="restMap" parameterType="int">
        select * from teacher where id=#{id}
    </select>

当 SQL 中字段名 和 javabeen Teacher 的属性名一致时,自动映射写法如下

<!-- 自动映射参数 -->
    <select id="selById" resultType="teacher" parameterType="int">
        select * from teacher where id=#{id}
    </select>

resultMap 常用标签属性说明

  • id:对应<select>中 resultMap 的名称
  • type:type就是指定映射到哪一个实体类中
  • column:在数据库中的列名称
  • property:在实体类定义的属性名称
  • associattion :实体类对象包含另一个对象时,例如:一个学生对应一个老师 student =》teacher
  • collection :实体类对象包含的是一个集合时,例如:一个老师对应一群学生 teacher =》List<student>

association(一对一) 和 collection(一对多)            

association:一个学生对应一个老师 student =》teacher

<resultMap type="student" id="stuMap">
        <!-- column:数据库中的列名称,property 实体类定义的属性名称,id 标签表示表中的主键列,result 标签是除了主键列之外的列 -->
        <id column="id"  property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="tid" property="tid"/>
        <!--property是给实体类赋值的参数,取值是实体类成员变量的名称,column是到数据库中查询的依据,取值是数据库中的列名  -->
        <!-- 如果管理一个对象使用 association 调用com.mapper.TeacherMapper.selById 的查询方法,将 column的值传递给selById-->
        <association property="teacher" column="tid" select="com.mapper.TeacherMapper.selById"></association>
    </resultMap>
    <select id="selBy" resultMap="stuMap">
        select * from student
    </select>

collection:一个老师对应一群学生 teacher =》List<student>

<resultMap type="teacher" id="myMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="list" select="com.mapper.StudentMapper.selByTid" column="id"></collection>
    </resultMap>
    <select id="selAll" resultMap="myMap">
        select * from teacher
    </select>

参考:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps

select:用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。

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

<select id="selectBlog" resultMap="blogResult">
  SELECT * FROM BLOG WHERE ID = #{id}
</select>

<select id="selectAuthor" resultType="Author">
  SELECT * FROM AUTHOR WHERE ID = #{id}
</select>

property:映射到列结果的字段或属性。 -----------------指的是 javaBean 中的属性 类型(一个javaBeen 中的属性可以是基本数据类型也可以是 Object)

javaType:一个 Java 类的完全限定名,或一个类型别名。---------------------指的是一个 JavaBean class类型( A a = new a(); 理解为 A 类型)

相关推荐