<MyBatis>入门五 查询的返回值处理

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>

    

原文地址:https://www.cnblogs.com/mapleins/p/10115233.html