4

自定义映射resultMap - 用什么昵称比较好。

 1 year ago
source link: https://www.cnblogs.com/zzzjian/p/16748317.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

resultMap处理字段和属性的映射关系

如果字段名与实体类中的属性名不一致,该如何处理映射关系?

  • 第一种方法:为查询的字段设置别名,和属性名保持一致

    下面是实体类中的属性名:

      private Integer empId;
      private String empName;
      private Integer age;
      private String gender;
    

    这是建表时设置的字段名:

    emp_id    emp_name    age    gender
    

    我们只需要在Mapper.xml中在写sql语句时,对字段名进行设置别名,使得与属性名一致:

     select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
    
  • 第二种方法:当字段符合Mysql要求使用下划线,而属性名符合Java要求使用驼峰,此时可以在Mybatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,就可以在查询表中数据时,自动将下划线类型的字段名转换为驼峰。

     <settings>
            <!--将下划线映射为驼峰-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
     </settings>
    
  • 第三种方法:使用resultMap处理

        <!--
            resultMap:设置自定义的映射关系
            id:唯一标识
            type:处理映射关系的实体类的类型
            常用标签:
            id:处理主键和实体类中属性的映射关系
            result:处理普通字段和实体类中属性的映射关系
            column:设置映射关系中的字段名,必须是sql查询出的某个字段
            property:设置映射关系中的属性的属性名,必须是处理实体类型类型中的属性名
         -->
    
        <resultMap id="empResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </resultMap>
    
    
        <!-- Emp getEmpByEmpId(@Param("empId") Integer emId);-->
    
        <select id="getEmpByEmpId" resultMap="empResultMap">
            select * from t_emp where emp_id = #{empId}
        </select>
    

多对一的映射关系

1.级联方式处理映射关系

当Emp实体类中具有Dept对象,但是字段中不存在这个属性,我们需要将Dept对象中的属性与查询的字段名建立映射关系。

    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <result column="dept_id" property="dept.deptId"></result>
        <result column="dept_name" property="dept.deptName"></result>
    </resultMap>
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select t_emp.*,t_dept.*
        from t_emp left join t_dept on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

2.使用association处理映射关系

  • association:处理多对一的映射关系(处理实体类类型的属性)
  • property:设置需要处理映射关系的属性的属性名
  • javaType:设置要处理的属性的类型
    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <association property="dept" javaType="Dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>

3.分步查询

  • 首先查询员工的信息

        /**
         * 通过分步查询员工的信息
         * @param empId
         * @return
         */
        Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
    
    
    
        <resultMap id="empAndDeptByStepResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
            <!--
    			select:设置分步查询,查询某个属性的值的sql标识(namespace.sqlId)
    			column:将sql以及查询结果中的某个字段设置为分步查询的条件
    		-->
            <association property="dept"
                         select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                         column="dept_id"></association>
        </resultMap>
        <!--   Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);-->
        <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
            select * from t_emp where emp_id = #{empId}
        </select>
    
  • 根据员工所对应的部门id查询部门信息

        /**
         * 分步查询第二步:根据员工所对应的id查询部门信息
         * @param deptId
         * @return
         */
        Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
        
    
       <!-- Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);-->
        <select id="getEmpAndDeptByStepTwo" resultType="Dept">
            select * from t_dept where depy_id = #{deptId}
        </select>
    
  • 分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:

    lazyLoadingEnabled:延迟加载的全局开关,当开启时,所有关联对象都会延迟加载。

    aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载

    此时就可以实现按需加载,获取的数据是什么,就会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载。


一对多的映射关系

1.collection

    /**
     * 根据部门id查部门中员工的信息
     * @param deptId
     * @return
     */
    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

   <resultMap id="deptAndEmpResultMap" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <!--
            ofType:设置collection标签所处理的集合属性中存储数据的类型
        -->
        <collection property="emps" ofType="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </collection>
    </resultMap>

 <!--Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
        select *
        from t_dept
        LEFT JOIN t_emp
        ON t_dept.dept_id = t_emp.dept_id
        WHERE t_dept.dept_id = #{deptId};
    </select>

2.分步查询

  • 查询部门信息

        /**
         * 分步查询部门以及部门中的员工信息第一步
         * @param id
         * @return
         */
        Dept getDeptAndEmpByStepOne(@Param("id") Integer id);
        
    
      <resultMap id="deptAnEmpResultMapByStep" type="Dept">
            <id column="dept_id" property="depyId"></id>
            <result column="dept_name" property="deptName"></result>
            <collection property="emps"
                        select="com.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                        column="dept_id"></collection>
        </resultMap>
    
        <!--    Dept getDeptAndEmpByStepOne(@Param("id") Integer id);-->
        <select id="getDeptAndEmpByStepOne" resultMap="">
            select * from t_dept where dept_id = #{deptId}
        </select>
    
  • 根据部门id查询部门中的员工信息

        /**
         * 分步查询部门以及部门中的员工信息第二步
         * @param dept_id
         * @return
         */
        List<Emp> getDeptAndEmpByStepTwo(@Param("dept_id") Integer dept_id);
        
    
        <resultMap id="empAndDeptByStepResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
            <association property="dept"
                         select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                         column="dept_id"></association>
        </resultMap>
    
        <!--List<Emp> getDeptAndEmpByStepTwo(@Param("dept_id") Integer dept_id);-->
        <select id="getDeptAndEmpByStepTwo" resultType="Emp">
            select * from t_emp where dept_id = #{deptId}
        </select>
    

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK