zoukankan      html  css  js  c++  java
  • <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>

        

  • 相关阅读:
    C程序之修改Windows的控制台大小
    C程序之修改Windows的控制台颜色(转载)
    VS2010/MFC编程(对话框:模态对话框及其弹出过程)
    C/C++常用头文件及函数汇总
    vs2010点调试,显示系统找不到指定的文件
    C++之类和对象的使用(三)
    C++之类和对象的使用(二)
    idea激活方式
    Java之dom4j的简单解析和生成xml的应用
    Java之POI的excel导入导出
  • 原文地址:https://www.cnblogs.com/mapleins/p/10115233.html
Copyright © 2011-2022 走看看