IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis中自动映射与自定义映射

第一章 Mybatis中自动映射与自定义映射

自动映射【resultType】

自定义映射【resultMap】

1.1 自动映射与自定义映射
  • 自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射
    • 自动映射解决不了两类问题
      • 多表连接查询时,需要返回多张表的结果集
      • 单表查询时,不支持驼峰式自动映射【不想为字段定义别名】
  • 自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射
  • 注意:resultType与resultMap只能同时使用一个
1.2 自定义映射-级联映射
xml 复制代码
<!--    自定义映射 【员工与部门关系】-->
<resultMap id="empAndDeptResultMap" type="employee">
    <!--  定义主键字段与属性关联关系 -->
    <id column="id" property="id"></id>
    <!--  定义非主键字段与属性关联关系-->
    <result column="last_name" property="lastName"></result>
    <result column="email" property="email"></result>
    <result column="salary" property="salary"></result>
    <!--        为员工中所属部门,自定义关联关系-->
    <result column="dept_id" property="dept.deptId"></result>
    <result column="dept_name" property="dept.deptName"></result>
</resultMap>
<select id="selectEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
   SELECT
        e.`id`,
        e.`email`,
        e.`last_name`,
        e.`salary`,
        d.`dept_id`,
        d.`dept_name`
    FROM
        tbl_employee e,
        tbl_dept d
    WHERE
        e.`dept_id` = d.`dept_id`
    AND
        e.`id` = #{empId}
</select>
1.3 自定义映射-association映射
  • 特点:解决一对一映射关系【多对一】

  • 示例代码

    xml 复制代码
    <!--    自定义映射 【员工与部门关系】-->
    <resultMap id="empAndDeptResultMapAssociation" type="employee">
        <!--  定义主键字段与属性关联关系 -->
        <id column="id" property="id"></id>
        <!--  定义非主键字段与属性关联关系-->
        <result column="last_name" property="lastName"></result>
        <result column="email" property="email"></result>
        <result column="salary" property="salary"></result>
        <!--        为员工中所属部门,自定义关联关系-->
        <association property="dept"
                    javaType="com.atguigu.mybatis.pojo.Dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>
1.4 自定义映射-collection映射
  • 示例代码

    java 复制代码
    /**
     * 通过部门id获取部门信息,及部门所属员工信息
     */
    public Dept selectDeptAndEmpByDeptId(int deptId);
    xml 复制代码
    <resultMap id="deptAndempResultMap" type="dept">
        <id property="deptId" column="dept_id"></id>
        <result property="deptName" column="dept_name"></result>
        <collection property="empList"
                    ofType="com.atguigu.mybatis.pojo.Employee">
            <id column="id" property="id"></id>
            <result column="last_name" property="lastName"></result>
            <result column="email" property="email"></result>
            <result column="salary" property="salary"></result>
        </collection>
    </resultMap>
    <select id="selectDeptAndEmpByDeptId" resultMap="deptAndempResultMap">
        SELECT
            e.`id`,
            e.`email`,
            e.`last_name`,
            e.`salary`,
            d.`dept_id`,
            d.`dept_name`
        FROM
            tbl_employee e,
            tbl_dept d
        WHERE
            e.`dept_id` = d.`dept_id`
        AND
            d.dept_id = #{deptId}
    </select>
1.5 ResultMap相关标签及属性
  • resultMap标签:自定义映射标签

    • id属性:定义唯一标识
    • type属性:设置映射类型
  • resultMap子标签

    • id标签:定义主键字段与属性关联关系
    • result标签:定义非主键字段与属性关联关系
      • column属性:定义表中字段名称
      • property属性:定义类中属性名称
    • association标签 :定义一对一的关联关系
      • property:定义关联关系属性
      • javaType:定义关联关系属性的类型
      • select:设置分步查询SQL全路径
      • colunm:设置分步查询SQL中需要参数
      • fetchType:设置局部延迟加载【懒加载】是否开启
    • collection标签 :定义一对多的关联关系
      • property:定义一对一关联关系属性
      • ofType:定义一对一关联关系属性类型
      • fetchType:设置局部延迟加载【懒加载】是否开启
1.6 Mybatis中分步查询
  • 为什么使用分步查询【分步查询优势】?

    • 将多表连接查询,改为【分步单表查询】,从而提高程序运行效率
  • 示例代码

    • 一对一

      java 复制代码
      /**
       * 通过员工id获取员工信息及员工所属的部门信息【分步查询】
              1. 先通过员工id获取员工信息【id、last_name、email、salary、dept_id】
              2. 再通过部门id获取部门信息【dept_id、dept_name】
       */
      public Employee selectEmpAndDeptByEmpIdAssociationStep(int empId);
      xml 复制代码
      <select id="selectEmpAndDeptByEmpIdAssociationStep" resultMap="empAndDeptResultMapAssocationStep">
          select
              id,
              last_name,
              email,
              salary,
              dept_id
          from
              tbl_employee
          where
              id=#{empId}
      </select>
      java 复制代码
      /**
       * 通过部门id获取部门信息
       */
      public Dept selectDeptByDeptId(int deptId);
      xml 复制代码
      <select id="selectDeptByDeptId" resultType="dept">
          select
              dept_id,
              dept_name
          from
              tbl_dept
          where
              dept_id=#{deptId}
      </select>
day04
  • 一对多

    java 复制代码
    /**
     * 通过部门id获取部门信息,及部门所属员工信息【分步查询】
            1. 通过部门id获取部门信息
            2. 通过部门id获取员工信息
     */
    public Dept selectDeptAndEmpByDeptIdStep(int deptId);
    xml 复制代码
    <!--    通过部门id获取部门信息,及部门所属员工信息【分步查询】-->
    <!--    1. 通过部门id获取部门信息-->
    <!--    2. 通过部门id获取员工信息-->
        <select id="selectDeptAndEmpByDeptIdStep" resultMap="deptAndEmpResultMapStep">
            select
                dept_id,
                dept_name
            from
                tbl_dept
            where
                dept_id=#{deptId}
        </select>
    java 复制代码
    /**
     * 通过部门Id获取员工信息
     * @param deptId
     * @return
     */
    public List<Employee> selectEmpByDeptId(int deptId);
    xml 复制代码
    <select id="selectEmpByDeptId" resultType="employee">
        select
            id,
            last_name,
            email,
            salary,
            dept_id
        from
            tbl_employee
        where
            dept_id=#{deptId}
    </select>
1.7 Mybatis延迟加载【懒加载】
  • 需要时加载,不需要暂时不加载

  • 优势:提升程序运行效率

  • 语法

    • 全局设置

      xml 复制代码
      <!-- 开启延迟加载 -->
      <setting name="lazyLoadingEnabled" value="true"/>
      <!-- 设置加载的数据是按需加载3.4.2及以后的版本该步骤可省略-->
      <setting name="aggressiveLazyLoading" value="false"/>
    • 局部设置

      • fetchType

        • eager:关闭局部延迟加载
        • lazy:开启局部延迟加载
      • 示例代码

        xml 复制代码
        <association property="dept"
                    select="com.atguigu.mybatis.mapper.DeptMapper.selectDeptByDeptId"
                    column="dept_id"
                    fetchType="eager">
        </association>
1.8 扩展
  • 如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成

    Map来进行传递,语法如下**: {k1=v1, k2=v2...}**

相关推荐
Tatakai252 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
A_cot3 小时前
Redis 的三个并发问题及解决方案(面试题)
java·开发语言·数据库·redis·mybatis
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑4 小时前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
计算机学姐6 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
二十雨辰6 小时前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis
蔚一6 小时前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
VaporGas7 小时前
idea集成和使用Git指南
java·git·intellij-idea
djgxfc8 小时前
简单了解Maven与安装
java·maven
Amagi.8 小时前
Redis的内存淘汰策略
数据库·redis·mybatis
前端小马8 小时前
解决IDEA出现:java: 程序包javax.servlet不存在的问题
java·servlet·intellij-idea