<!--自定義某個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