1. 程式人生 > 程式設計 >Mybatis select記錄封裝的實現

Mybatis select記錄封裝的實現

select記錄封裝

返回一個List集合, resultType要寫集合中元素的型別

<!-- public List<Employee> getEmpsByLastNameLike(String lastName); -->
<!--resultType:如果返回的是一個集合,要寫集合中元素的型別 -->
<select id="getEmpsByLastNameLike" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tbl_employee where last_name like #{lastName}
</select>

返回一條記錄的map,key為列名, 值就是對應的值

<!--public Map<String,Object> getEmpByIdReturnMap(Integer id); -->
<select id="getEmpByIdReturnMap" resultType="map">
  select * from tbl_employee where id=#{id}
</select>

多條記錄封裝成一個map,key為id,值是記錄封裝後的javaBean

//@MapKey:告訴mybatis封裝這個map的時候使用哪個屬性作為map的key
@MapKey("lastName")
public Map<String,Employee> getEmpByLastNameLikeReturnMap(String lastName);
<!--public Map<Integer,Employee> getEmpByLastNameLikeReturnMap(String lastName); -->
<select id="getEmpByLastNameLikeReturnMap" resultType="com.atguigu.mybatis.bean.Employee">
  select * from tbl_employee where last_name like #{lastName}
</select>

自動對映配置

全域性setting設定

1.autoMappingBehavior預設為PARTIAL,開啟自動對映功能;唯一的要求是列名和javaBean屬性名一致

2.mapUnderscoreToCamelCase=true,開啟自動駝峰命名規範對映功能

自定義resultMap, 實現高階對映功能

resultMap自定義對映規則

  <!--自定義某個javaBean的封裝規則
  type:自定義規則的Java型別
  id:唯一id方便引用
   -->
  <resultMap type="com.atguigu.mybatis.bean.Employee" id="MySimpleEmp">
    <!--指定主鍵列的封裝規則
    id定義主鍵會底層有優化;
    column:指定哪一列
    property:指定對應的javaBean屬性
     -->
    <id column="id" property="id"/>
    <!-- 定義普通列封裝規則 -->
    <result column="last_name" property="lastName"/>
    <!-- 其他不指定的列會自動封裝:我們只要寫resultMap就把全部的對映規則都寫上。 -->
    <result column="email" property="email"/>
    <result column="gender" property="gender"/>
  </resultMap>

建立表

create table tb_dept (

id int(11) primary key auto_increment,dept_name varchar(255)

)

新增列

alter table tb_emp add column d_id int(11);

新增約束

alter table tb_emp add constraint fk_emp_dept foreign key(d_id) references tb_dept(id);

聯合查詢:級聯屬性封裝結果集

場景一:

查詢Employee的同時查詢員工對應的部門;一個員工有與之對應的部門資訊;

<!-- 
  場景一:
    查詢Employee的同時查詢員工對應的部門
    Employee===Department
    一個員工有與之對應的部門資訊;
    id last_name gender  d_id   did dept_name (private Department dept;)
   -->
   
   
  <!--
    聯合查詢:級聯屬性封裝結果集
   -->
  <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp">
    <id column="id" property="id"/>
    <result column="last_name" property="lastName"/>
    <result column="gender" property="gender"/>
    <result column="did" property="dept.id"/>
    <result column="dept_name" property="dept.departmentName"/>
  </resultMap>

使用association定義關聯的單個物件的封裝規則;

<!-- 
    使用association定義關聯的單個物件的封裝規則;
   -->
  <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyDifEmp2">
    <id column="id" property="id"/>
    <result column="last_name" property="lastName"/>
    <result column="gender" property="gender"/>
    
    <!-- association可以指定聯合的javaBean物件
    property="dept":指定哪個屬性是聯合的物件
    javaType:指定這個屬性物件的型別[不能省略]
    -->
    <association property="dept" javaType="com.atguigu.mybatis.bean.Department">
      <id column="did" property="id"/>
      <result column="dept_name" property="departmentName"/>
    </association>
  </resultMap>

association分步查詢

<!-- 使用association進行分步查詢:
    1、先按照員工id查詢員工資訊
    2、根據查詢員工資訊中的d_id值去部門表查出部門資訊
    3、部門設定到員工中;
   -->
   
   <!-- id last_name email  gender  d_id  -->
   <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpByStep">
     <id column="id" property="id"/>
     <result column="last_name" property="lastName"/>
     <result column="email" property="email"/>
     <result column="gender" property="gender"/>
     <!-- association定義關聯物件的封裝規則
       select:表明當前屬性是呼叫select指定的方法查出的結果
       column:指定將哪一列的值傳給這個方法
       
       流程:使用select指定的方法(傳入column指定的這列引數的值)查出物件,並封裝給property指定的屬性
     -->
     <association property="dept" 
       select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById"
       column="d_id">
     </association>
   </resultMap>

<!-- DepartmentMapper.xml -->
<mapper namespace="com.atguigu.mybatis.dao.DepartmentMapper">
  <!--public Department getDeptById(Integer id); -->
  <select id="getDeptById" resultType="com.atguigu.mybatis.bean.Department">
    select id,dept_name departmentName from tbl_dept where id=#{id}
  </select>

association分步查詢&延遲載入

 <!-- 可以使用延遲載入(懶載入);(按需載入)
     Employee==>Dept:
       我們每次查詢Employee物件的時候,都將一起查詢出來。
       部門資訊在我們使用的時候再去查詢;
       分段查詢的基礎之上加上兩個配置:
   -->
  <!-- ==================association============================ -->
  
  <!-- mybatis-config.xml-->
  <!--顯示的指定每個我們需要更改的配置的值,即使他是預設的。防止版本更新帶來的問題 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- value:false 表示按需載入; 否則會總是載入 -->
    <setting name="aggressiveLazyLoading" value="false"/>

關聯集合

巢狀結果集的方式,使用collection標籤定義關聯的集合型別的屬性封裝規則

場景二:

查詢部門的時候將部門對應的所有員工資訊也查詢出來:註釋在DepartmentMapper.xml中

<!-- 
  public class Department {
      private Integer id;
      private String departmentName;
      private List<Employee> emps;
   did dept_name || eid last_name email  gender 
   -->
   
  <!--巢狀結果集的方式,使用collection標籤定義關聯的集合型別的屬性封裝規則 -->
  <resultMap type="com.atguigu.mybatis.bean.Department" id="MyDept">
    <id column="did" property="id"/>
    <result column="dept_name" property="departmentName"/>
    <!-- 
      collection定義關聯集合型別的屬性的封裝規則 
      ofType:指定集合裡面元素的型別
    -->
    <collection property="emps" ofType="com.atguigu.mybatis.bean.Employee">
      <!-- 定義這個集合中元素的封裝規則 -->
      <id column="eid" property="id"/>
      <result column="last_name" property="lastName"/>
      <result column="email" property="email"/>
      <result column="gender" property="gender"/>
    </collection>
  </resultMap>
  <!-- public Department getDeptByIdPlus(Integer id); -->
  <select id="getDeptByIdPlus" resultMap="MyDept">
    SELECT d.id did,d.dept_name dept_name,e.id eid,e.last_name last_name,e.email email,e.gender gender
    FROM tbl_dept d
    LEFT JOIN tbl_employee e
    ON d.id=e.d_id
    WHERE d.id=#{id}
  </select>

collection:分段查詢

<!-- collection:分段查詢 -->
  <resultMap type="com.atguigu.mybatis.bean.Department" id="MyDeptStep">
    <id column="id" property="id"/>
    <result column="dept_name" property="departmentName"/>
    <collection property="emps" 
      select="com.atguigu.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
      column="{deptId=id}" fetchType="lazy"></collection>
  </resultMap>

  
  <!-- 擴充套件:多列的值傳遞過去:
      將多列的值封裝map傳遞;
      column="{key1=column1,key2=column2}"
    fetchType="lazy":表示使用延遲載入;
        - lazy:延遲
        - eager:立即

鑑別器

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>

到此這篇關於Mybatis select記錄封裝的實現的文章就介紹到這了,更多相關Mybatis select封裝內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!