入門五 查詢的返回值處理


select :

  返回對象:

     <select  id = " "  resultType= "對象的全類名"  />

  List:

    <select  id = " "  resultType = "list泛型中的值" />

  Map:

    1.返回一條記錄 Map<String,Object>

                 key -> 字段

              value -> 值

                                     <select id = " "  resultType="map" />

    2.返回多條記錄 Map<Integer,Employee>

             key -> @MapKey("column")標注在接口方法上,表名哪個字段作為Key

               value -> 對象

             <select id = " " resultTyppe="對象的全類名" />

  ResultMap:

    一對一:

    1.級聯屬性 

     <resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
          <id column="id" property="id"/>
          <result column="last_name" property="name"/>
          <result column="email" property="email"/>
          <result column="gender" property="gender"/>
          <result column="did" property="dept.id"/>
          <result column="deptName" property="dept.deptName"/>
      </resultMap>

     <select id="getEmpAndDeptById" resultMap="myEmpAndDept">

     2.association

      <resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
          <id column="id" property="id"/>
          <result column="last_name" property="name"/>
          <result column="email" property="email"/>
          <result column="gender" property="gender"/>
            <association property="dept" javaType="org.maple.pojo.Department">
              <id column="did" property="id"/>
              <result column="deptName" property="deptName"/>
            </association>
       </resultMap>

     3.association 分布查詢  

     <association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>


    一對多

      collection查詢

        <!-- 要通過id查詢部門信息和所有員工 -->
        <resultMap id="myDept" type="org.maple.pojo.Department">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
            <!--定義集合時,使用collection屬性-->
            <collection property="emps" ofType="org.maple.pojo.Employee">
                <id column="eId" property="id"/>
                <result column="last_name" property="name"/>
                <result column="gender" property="gender"/>
                <result column="email" property="email"/>
            </collection>
        </resultMap>


      collection分部查詢
        <resultMap id="myDeptStep" type="org.maple.pojo.Department">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
            <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
        </resultMap>

 

update,delete,insert:返回Integer,Long,Boolean,void

1.返回List

   返回集合類型,resultType中寫集合中元素的類型

    /**
     * 返回List集合
     */
    List<Employee> getEmpsByNameLike(String name);
    <!--如果返回的是集合,resultType需要寫集合中元素的類型-->
    <select id="getEmpsByNameLike" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE last_name like concat('%',#{name},'%');
    </select>
Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'}
Employee{id=8, name='rose', gender=1, email='rose@qq.com'}
Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'}
Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}

2.返回Map

1.返回的一條記錄的map

  key:字段名

  value:表中的名字

    /**
     * 返回一條記錄map,key就是列名,值就是表中的值
     */
    Map<String,Object> getEmpByIdReturnMap(Integer id);
    <!--如果返回的是map,resultType需要寫map,mybatis為常用類起了別名-->
    <select id="getEmpByIdReturnMap" resultType="map">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
    </select>
{gender=0, name=tom, id=1, email=tom@atguigu.com}

2.返回多條記錄的map

  Map<column,Employee>

  key:哪個字段作為key,使用@MapKey("column")

  value:封裝對象

    /**
     * 多條記錄封裝Map,Map<Integer,Employee>
     * @MapKey 告訴mybaits使用哪個屬性封裝成map的key
     */
    @MapKey("id")
    Map<Integer,Employee> getEmpByNameLikeReturnMap(String name);
    <!--如果返回的是map,封裝成emp,resultType需要寫Employee-->
    <select id="getEmpByNameLikeReturnMap" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE last_name like concat('%',#{name},'%');
    </select>
{1=Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'}, 
8=Employee{id=8, name='rose', gender=1, email='rose@qq.com'}, 
9=Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'}, 12=Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}}

3.ResultMap

1.簡單的使用

    /**
     * 根據id查詢員工
     */
    Employee getEmpById(Integer id);
<mapper namespace="org.maple.mapper.EmployeeMapperPlus">

    <!--resultMap 自定義封裝規則-->
    <!--
        id:唯一id,方便引用
        type:自定義規則的java類型
    -->
    <resultMap id="MyEmp" type="org.maple.pojo.Employee">
        <!--
            id 主鍵的封裝規則,底層會有優化
            column 數據庫中字段
            property javaBean中的字段
        -->
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <!--其他不指定的列,如果名字一樣,會自動封裝。但是寫resultMap建議都寫上-->
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
    </resultMap>

    <!--簡單的使用resultMap-->
    <select id="getEmpById" resultMap="MyEmp">
        SELECT id,last_name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
    </select>

</mapper>

2.多表使用(一對一)

public class Employee {

    private Integer id;

    private String name;

    private Character gender;

    private String email;

    private Department dept;
}
public class Department {

    private Integer id;
    private String deptName;
}

  2.1 第一種規則

  級聯屬性的方式

    /**
     * 根據id查出員工和部門信息
     */
    Employee getEmpAndDeptById(Integer id);
  <!--1.級聯屬性的方式-->
   <resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <result column="did" property="dept.id"/>
        <result column="deptName" property="dept.deptName"/>
    </resultMap>

    <select id="getEmpAndDeptById" resultMap="myEmpAndDept">
        SELECT e.id,e.last_name,e.email,e.gender,d.id did,d.dept_name deptName
        FROM tbl_employee e
                 INNER JOIN tbl_dept d
                            ON e.d_id = d.id
        WHERE e.id = #{id}
    </select>

  2.2 第二種規則(association定義對象

    association: property 是 Employee對象中的屬性,javaType是指該屬性屬於哪個javaBean 

    <!--2.使用association-->
    <resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
        <id column="id" property="id"/>
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <association property="dept" javaType="org.maple.pojo.Department">
            <id column="did" property="id"/>
            <result column="deptName" property="deptName"/>
        </association>
    </resultMap>

  2.3 第三種規則(分部查詢,association

    假設之前部門的mapper中已經定義了通過部門id查找部門信息,那么我們就可以通過分部查詢來查詢出員工信息和部門信息

    /**
     * 根據id查出員工和部門信息,分部查詢
     */
    Employee getEmpAndDeptByIdStep(Integer id);
    <!--使用association進行分布查詢-->
    <resultMap id="myEmpAndDeptStep" type="org.maple.pojo.Employee">
        <id column="id" property="id" />
        <result column="last_name" property="name"/>
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <!--property:Employee中的屬性
            select:調用DepartmentMapper中的查詢方法 命名空間+方法
            column:傳給select 方法哪個參數
        -->
        <association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>
    </resultMap>

    <select id="getEmpAndDeptByIdStep" resultMap="myEmpAndDeptStep">
        select id,last_name,gender,email,d_id from tbl_employee where id = #{id}
    </select>

  分部查詢的好處,可以實現懶加載:當只需要調用員工的信息時,第二條sql語句就不會發出,知道需要調用部門的信息,才會發sql語句

  通過在全局配置文件中添加:

     <settings>
             <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="aggressiveLazyLoading" value="false"/> 
     </settings>

 

3.多表的使用(一對多)

public class Department {

    private Integer id;
    private String deptName;
    private List<Employee> emps;
}

1. 嵌套結果集的方式

    /**
     * 根據id查詢部門信息和所有員工
     */
    Department getDeptAndEmpsById(Integer id);
    <!-- 要通過id查詢部門信息和所有員工 -->
    <resultMap id="myDept" type="org.maple.pojo.Department">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <!--定義集合時,使用collection屬性-->
        <collection property="emps" ofType="org.maple.pojo.Employee">
            <id column="eId" property="id"/>
            <result column="last_name" property="name"/>
            <result column="gender" property="gender"/>
            <result column="email" property="email"/>
        </collection>
    </resultMap>

    <select id="getDeptAndEmpsById" resultMap="myDept">
        SELECT d.id,d.dept_name,e.id eId,e.last_name,e.gender,e.email
        FROM tbl_dept d
                 LEFT JOIN tbl_employee e
                           ON d.id = e.d_id
        WHERE d.id = #{id}
    </select>

2.分部查詢的方式

    /**
     * 根據id 分部查詢出部門信息和所有員工
     */
    Department getDeptAndEmpsByIdStep(Integer id);
    <!--分部查詢-->
    <resultMap id="myDeptStep" type="org.maple.pojo.Department">
        <id column="id" property="id"/>
        <result column="dept_name" property="deptName"/>
        <collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
    </resultMap>
    
    <select id="getDeptAndEmpsByIdStep" resultMap="myDeptStep">
        SELECT id,dept_name
        FROM tbl_dept
        WHERE id = #{id}
    </select>

 

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM