首页 > 其他分享 >day 113- mybatis的查询resultMap

day 113- mybatis的查询resultMap

时间:2023-06-28 21:22:27浏览次数:36  
标签:deptId empId resultMap id dept emp mybatis 查询 day

mybatis中的resultMap

resultMap用来处理字段名和属性名不一致的情况,处理映射关系

若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射

<!--
    字段名和属性名不一致的情况,处理映射关系:
    1. 为查询的字段设置别名,和属性名保持一致
    2. 当字段符合MySQL要求使用下划线_,而属性符合Java要求使用驼峰命名。
        此时可以在mybatis的核心配置文件中设置一个全局配置,可以自动将下划线命名为驼峰
    3.  使用resultMap自定义映射处理
-->
<!--
    resultMap:来设置自定义的映射关系
    id:唯一标识
    type:处理映射关系的实体类的类型
    常用标签:
    id:处理主键和实体类中的映射关系
    result:处理普通字段与实体类中属性的映射关系
    association:处理多对一的映射关系,处理实体类类型属性
    column:映射关系中的字段名,必须是sql查询出的某个字段
    property:设置映射关系中的属性名,必须是处理实体类类型中的属性名
    collection:处理一对多的映射关系,处理集合类型的属性
-->

 

多对一的映射处理

场景: 查询员工信息以及员工对应的部门信息

使用级联方式处理映射关系‘

/**
 * 获取员工以及所对应的部门信息
 * @param empId
 * @return
 */
Emp getEmpAndDept(@Param("empId") Integer empId);

 

<!--  Emp getEmpAndDept(@Param("empId") Integer empId);  -->
    <select id="getEmpAndDept" 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>

 

result Map:

<resultMap id="empAndDeptResultMapOne" 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>

 

自定义的方式定义映射文件

使用association处理映射关系

<!--  Emp getEmpAndDept(@Param("empId") Integer empId);  -->
    <select id="getEmpAndDept" 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>
<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:设置需要处理的映射关系的属性名
        javaType:设置要处理的属性的类型
        fetchType:在开启了延迟加载的环境中,通过该属性设置当前的分步查询是否开启延迟加载
                    eager/lazy 立即加载/延迟加载
    -->
    <association property="dept"
                 javaType="com.gu.mybatis.pojo.Dept"
                fetchType="lazy">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
    </association>
</resultMap>

 

分步查询

查询员工信息
/**
 * 获取员工以及所对应的部门信息,通过分步查询(第一步)
 * @param empId
 * @return
 */
Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);

 

<!--  Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);  -->
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        select * from t_emp where emp_id = #{empId}
    </select>
<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>
        <!--
            property:设置需要处理映射关系的属性的属性名
            select:设置分步查询的sql的唯一标识
            column:设置分步查询sql的条件,将查询出的某个字段作为下一个sql查询需要的条件
        -->
        <association property="dept"
                     select="com.gu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="dept_id">
        </association>
    </resultMap>

 

根据员工对应的部门id查询部门信息
/**
 * 获取员工以及所对应的部门信息,通过分步查询(第二步)
 * @return
 */
Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);

 

<!--  Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);  -->
<select id="getEmpAndDeptByStepTwo" resultType="com.gu.mybatis.pojo.Dept">
    select * from t_dept where dept_id = #{deptId}
    </select>

 

一对多的映射处理

collection

/**
 * 查询部门及部门中员工信息collection方法
 * @return
 */
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>
<resultMap id="deptAndEmpResultMap" type="Dept">
    <id column="dept_id" property="deptId"></id>
    <result column="dept_name" property="deptName"></result>
    <!--
        ofType:设置集合类型的属性中存储的数据的类型
    -->
    <collection property="emps" ofType="com.gu.mybatis.pojo.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>
    </collecti

 

on>
</resultMap>

分步查询

查询部门信息
/**
 * 查询部门及部门中员工信息 分步查询第一步
 * @param deptId
 * @return
 */
Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);

 

<!--  Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);  -->
<select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
    select * from t_dept where dept_id = #{deptId}
    </select>
<resultMap id="deptAndEmpResultMapByStep" type="Dept">
    <id column="dept_id" property="deptId"></id>
    <result column="dept_name" property="deptName"></result>
    <collection property="emps"
                ofType="com.gu.mybatis.pojo.Emp"
                select="com.gu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                column="dept_id"></collection>
</resultMap>

 

根据部门id查询部门中的所有员工
/**
 * 查询部门及部门中员工信息 分步查询第2步
 * @param deptId
 * @return
 */
List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);

 

<!--  List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);  -->
    <select id="getDeptAndEmpByStepTwo" resultType="com.gu.mybatis.pojo.Emp">
        select * from  t_emp where dept_id = #{deptId}
    </select>

 

总结

处理多对一的映射关系:
1. 级联方式
2. association
3. 分步查询
  分步查询的优点:可以实现延迟加载
      延迟加载:需要在核心配置文件中配置全局信息:
      lazyLoadingEnabled:设置开启延迟加载
      aggressiveLazyLoading:设置按需加载
                     
处理一对多关系的映射:
  1. collection
      resultMap中collection标签处理一对多的映射关系,处理集合类型的属性
  2. 分步查询

over

标签:deptId,empId,resultMap,id,dept,emp,mybatis,查询,day
From: https://www.cnblogs.com/GUGUZIZI/p/17512604.html

相关文章

  • Day05 5.1 Java环境搭建
    Day055.1Java环境搭建【一】Jdk的安装和配置【1】安装jdk是否需要再选择安装一个额外的JRE。这是可选的,因为之前安装的JDK中,已经包含了开发环境和JRE运行环境两部分,所以不必再安装一个JRE。【2】配置环境变量(1)新建JAVA_HOMEJAVA_HOMED:\ProgramFiles\Java\jdk-1......
  • Java基础-Day05
    Java基础-Day05breake和continue使用上的相同点和不同点不相同点:break:可用于switch-case和循环结构(结束当前循环)continue:只能循环结构(结束档次循环)相同点:其后不可以声明执行语句衡量一个功能代码的优劣正确性可读性健壮性高效率与低储存:时间复杂度(衡量效率)和空间......
  • mybatisplus跨库操作和@Transactional一起使用的问题
    1、当方法使用了@Transactional注解,mybatisplus切换库之前已经有对当前库进行操作的话,切库将不成功;2、当方法使用了@Transactional注解,mybatisplus切换库之前没有对当前库进行操作的话,切库成功,但是@Transactional注解好像没有生效,操作报异常之后上一个操作没有回退;......
  • python基础day34 魔术方法和反射
    魔术方法(内置方法)类里面内置的双下划线开头的一线方法,他们具有特殊的功能,我们称之为是魔术方法,简称魔法。eg:__init__魔术方法的学习之需要掌握每个方法什么时候触发或者执行1.__str__,__repr__方法classStudent():def__init__(self,name,age,gender):s......
  • day1.我的第一篇博客
    关于我对Java的兴趣及理解关于Java呢,我之前也有了解过一些,看过Java从入门到精通,只是讲的我不太理解,但我看过他的诞生,是从1995年吧,从甲骨文公司出来的确实很强,关于Java最早的了解,是在九边写的《向上生长》了解到的。后面又听了一些遇见狂神说,现在无论是我的信心还是坚守的心都提升......
  • mybatis generator生成乱码问题
    mybatisgenerator生成的文件可能会乱码,通过在Eclipse_Home/eclipse.ini文件中,指定-Dfile.encoding=UTF-8,参考截图openFile-vmargs-Dosgi.requiredJavaVersion=1.5-Xms40m-Xmx512m-Dfile.encoding=UTF-8-D,是java命令的一个选项,-D后面需要跟一个键值对......
  • Spring Boot 之 Mybatis Plus 分页插件
    创建分页插件所在的类MybatisPlusConfiguration,并添加注解@Configuration在配置类中添加以下代码@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){/***MybatisPlusInterceptor是插件主体,管理所有的插件*/MybatisPlusInterceptorinter......
  • dayjs 根据时间展示不同的信息
    getTime(data){consttime=this.$dayjs(data).format('YYYYMDD')constnowDate=this.$dayjs().format('YYYYMDD')//今天constyesterday=this.$dayjs().subtract(1,'day').format('YYYYMDD')//前一......
  • 闲话 Day13
    又是半个月过去。然而这半个月越来越菜了。。。鉴于啥题材都没有了,所以今天闲话我们来炒炒冷饭。警告:以下内容没有任何实用价值。对复杂度不感兴趣可以直接跳过。常见算法/数据结构瞎写。之前的一车复杂度分析炸了所以被迫删了重写(然后发现没啥可写的所以开始瞎写(先说ST......
  • Java基础 -Day04
    Java基础-Day04For循环循环结构的4个要素:①初始化条件②循环条件----->只能是Boolean类型③循环体④迭代条件循环结构for(①;②;④){③}执行过程:①->②->③->④->②->③->④->...->②/*输入两个正整数(m,n),求其最大公约数和最小公倍数*/impor......