Mybatis(4)——ResultMap

    <!--自定義某個javaBean的封裝規則
         type:自定義規則的Java類型
         id:惟一id,方便引用
      -->
    <resultMap type="entity.stu" id="MySimpleStu">
          <!--指定主鍵列的封裝規則
              id定義主鍵會底層有優化;
               column:指定查出來的數據表的哪一列
              property:指定對應的javaBean屬性
          -->
        <id column="id" property="id"/>
        <!-- 定義普通列封裝規則 ,這裏是由於名字不同修改一下封裝規則-->
        <result column="gender" property="stuGender"/>
        <!-- 其餘不指定的列會自動封裝:可是咱們只要寫resultMap就把所有的映射規則都寫上。 -->
        <result column="name" property="name"/>
        <result column="addr" property="addr"/>
    </resultMap>

    <!-- resultMap:自定義結果集映射規則;  -->
    <select id="getStudent"  resultMap="MySimpleStu">
        select * from student where id=#{id}
    </select>



    <!--
         需求:級聯查詢,查詢學生的同時查詢他的college
     -->
    <select id="getStudentandConnege01" resultMap="MyDifficultStu">
        SELECT s.id id,s.name name,gender,addr,s.c_id cid,c.name cname
        FROM student s ,college c
        WHERE s.c_id=c.collegdid AND s.id=#{id}
    </select>
    <select id="getStudentandConnege02" resultMap="MyDifficultStu2">
        SELECT s.id id,s.name name,gender,addr,s.c_id cid,c.name cname
        FROM student s ,college c
        WHERE s.c_id=c.collegdid AND s.id=#{id}
    </select>

    <!--
        第一種方式:
        聯合查詢:級聯屬性封裝結果集
        只須要在resultMap中指定級聯就能夠了
      -->
    <resultMap type="entity.stu" id="MyDifficultStu">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="addr" property="addr"/>
        <result column="gender" property="stuGender"/>
        <result column="cid" property="college.id"/>
        <result column="cname" property="college.name"/>
    </resultMap>
    <!--
        第二種方式:一樣是級聯查詢,可是使用了<association>的標籤
        使用association定義關聯的單個對象的封裝規則;
     -->
    <resultMap type="entity.stu" id="MyDifficultStu2">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="addr" property="addr"/>
        <result column="gender" property="stuGender"/>
        <!--  association能夠指定聯合的javaBean對象
              property="dept":指定哪一個屬性是聯合的對象
              javaType:指定這個屬性對象的類型[不能省略]
        -->
        <association property="college" javaType="entity.college">
            <id column="cid" property="id"/>
            <result column="cname" property="name"/>
        </association>
    </resultMap>



    <!-- 使用association進行分步查詢:
        第三種方法
首先根據學生id找到學生記錄,而後找到大學id 根據大學id找到大學信息 把查詢到的大學信息填充到學生對象中。
--> <resultMap type="entity.stu" id="StuByStep"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="addr" property="addr"/> <result column="gender" property="stuGender"/> <!-- association定義關聯對象的封裝規則 select:代表當前屬性是調用select指定的方法查出的結果 column:爲被調用的select方法傳入參數 流程:使用select指定的方法(傳入column指定的這列參數的值)查出對象,並封裝給property指定的屬性 --> <association property="college" select="Mapperinterface.collegeMapper.getcollege" column="c_id"> </association> </resultMap>
    
根據大學的id獲得大學的信息,以及大學中的全部的學生,這裏也是使用合併查詢以及分步查詢兩種方式
<select id="getCollegeandAllStu" resultType="entity.college" resultMap="getCollegeandAllStuResultMap"> select s.id id,s.name name,s.gender gender,addr,c.name cname,collegdid from student s left join college c on c_id=collegdid where collegdid=#{id} </select> <resultMap id="getCollegeandAllStuResultMap" type="entity.college"> <id column="collegdid" property="id"/> <result column="cname" property="name"/> <collection property="students" ofType="entity.stu"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="gender" property="stuGender"/> <result column="addr" property="addr"/> </collection> </resultMap> <!-- 針對於查詢一個List的結果很是簡單,注意類型就是List中的元素的類型 --> <select id="getAllstu" resultType="entity.stu"> SELECT * FROM student where c_id=#{id} </select> <select id="getCollegeandAllStuByStep" resultMap="getCollegeandAllStuByStepResultMap"> SELECT * FROM college where collegdid=#{id} </select> <resultMap id="getCollegeandAllStuByStepResultMap" type="entity.college"> <id column="collegdid" property="id"></id> <result column="name" property="name"></result> <collection property="students" select="getAllstu" column="collegdid"/> </resultMap>

 上面給出了分段查詢的例子java

<resultMap id="getCollegeandAllStuByStepResultMap" type="entity.college">
        <id column="collegdid" property="id"></id>
        <result column="name" property="name"></result>
        <collection property="students" select="getAllstu" column="collegdid"/>
    </resultMap>
其中<collection>裏面的column就是傳入的參數,若是想要傳入多值,使用 {param1=..,param2=...}的方式
例如
 <collection property="students" select="getAllstu" column="{id=collegdid,anotherid=外面傳入的一個值}"/>

另外mybatis

<collection>裏面的fetchType默認是lazy,延遲加載,改成eager就是當即加載,不用修改全局配置
<!-- 擴展:多列的值傳遞過去:
            將多列的值封裝map傳遞;
            column="{key1=column1,key2=column2}"
        fetchType="lazy":表示使用延遲加載;
                - lazy:延遲
                - eager:當即
     -->

<!-- =======================鑑別器============================ -->
<!-- <discriminator javaType=""></discriminator>
鑑別器:mybatis可使用discriminator判斷某列的值,而後根據某列的值改變封裝行爲
封裝Employee:
若是查出的是女生:就把部門信息查詢出來,不然不查詢;
若是是男生,把last_name這一列的值賦值給email;
-->
<resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpDis">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!--
column:指定斷定的列名
javaType:列值對應的java類型 -->
<discriminator javaType="string" column="gender">
<!--女生 resultType:指定封裝的結果類型;不能缺乏。/resultMap-->
<case value="0" resultType="com.atguigu.mybatis.bean.Employee">
<association property="dept"
select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id">
</association>
</case>
<!--男生 ;若是是男生,把last_name這一列的值賦值給email; -->
<case value="1" resultType="com.atguigu.mybatis.bean.Employee">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="last_name" property="email"/>
<result column="gender" property="gender"/>
</case>
</discriminator>
</resultMap>app

相關文章
相關標籤/搜索