MyBatis之ResultMap玩法回顾

红烧土豆泥
• 阅读 1705

1、Select_ResultMap

自定义结果集映射规则

<!-- 指定主键列的封装规则
    id:定义主键据说会有底层优化
    colum:指定哪一列
    property: 指定对应java的bean属性
-->
<resultMap type="com.demo.pojo.Employee" id="MyEmp">
    <id column="id" property="id"/>
    <!-- 定义普通列封装属性 -->
    <result column="last_name" property="lastName"/>
</resultMap>
<select id="" resultMap="MyEmp">
    select * from employee where id=#{id}
</select>

关联查询_级联属性封装结果

<!--
    场景一:(一对一)
        查询Employee的同时查询员工对应的部门
 -->
<resultMap type="employee" id="">
    <id column="id" property="id"/>
    <result column="did" property="dept.id"/>
    <result column="deptName" property="dept.departmentName"/>
</resultMap>
<select id="" resultMap="">
    select * from employee e, department d where e.id = d.id
</select>

关联查询_association定义封装对象规则

<resultMap type="employee" id="">
    <id column="id" property="id"/>
    <!-- association可以指定联合的JavaBean对象
        property="dept":指定哪个属性是联合的对象
        javaType:指定这个属性对象的类型[不能省略]
     -->
    <association property="dept" javaType="dept">
        <id column="id" property="id"/>
        <result column="deptName" property="departmentName"/>
    </association>
</resultMap>
<select id="" resultMap="">
    select * from employee e, department d where e.id = d.id
</select>

关联查询_assocation分步查询

<!--
    使用association进行分步查询
    1、先按照员工id查询员工信息
    2、根据查询员工信息中的id值去部门表查询出部门信息
    3、部门设置到员工中
-->
<resultMap type="employee" id="">
    <id column="id" property="id"/>
    <result column="email" property="email"/>
    <result column="gender" property="gender"/>
    <!--
        select:表明当前属性是调用select指定的方法查处的结果
        column:指定将哪一列的值传给这个方法
    -->
    <assocation property="dept" select="com.demo.mapper.DeptMapper.getDeptById" column="d_id">    
    </assocation>
</resultMap>
<select id="" resultMap="">
    select * from employee where id=#{id}
</select>

关联查询__assocation_分步查询_延迟加载(懒加载/按需加载)

<!-- 在Setting中显式指定,防止版本更替 -->
<setting name="lazyLoadingEnable" value="true"></setting>
<setting name="aggressiveLazyLoading" value="false"></setting>

关联查询_collection定义关联集合封装规则

<!--
    场景二、(一对多)
        查询部门的时候将部门对应的员工信息查询出来
-->
<resutMap type="department" id="de">
    <id column = "did" property="id"/>
    <result column="deptName" property="departmentName"/>
    <!-- collection定义关联集合类型的属性的封装规则
        collection: 定义关联集合类型属性的封装规则
        ofType: 指定集合里面元素的类型
     -->
    <collection property="emps" ofType="employee">
        <!-- 定义这个集合中元素的封装规则 -->
        <id column="eid" property="id"/>
        <result column="email" property="email"/>
    </collection>
</resutMap>
<select id="" resultMap="de">
    select * from dept d left join employee e on d.id=e.id
</select>

关联查询_collection分步查询

同上assocation分步查询方式

分步查询拓展

<!-- 传递多列的值
    将多列的值封装Map传递
    key为需要接收参数的列,column为去传递参数的列
    column="{key1=column1,key2=column2}"
    fetchType="lazy":表示使用懒加载
            -lazy:懒加载
            -eager:立即查询
-->

discriminator鉴别器

<!--
    <discriminator javaType=""></discriminator>
    鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为

    封装Employee:
        如果是女,则查出部门信息
        如果是男,则将lastName赋值给email
-->
<resultMap type="employee" id="">
    <id column = "id" property="id"/>
    <result column="lastName" property="lastName"/>
    <result column="gender" property="gender"/>
    <!-- 
        column: 指定要判断的列名
        javaType: 列值对应的java类型
    -->
    <discriminator javaType="string" column="gender">
        <!-- 女生 -->
        <case value="0" resulyType="employee">
            <assocation property="dept" select="com.demo.mapper.DeptMapper.getDeptById" column="d_id"></assocation>
        </case>
        <case value="1" resulyType="employee">
            <id column = "id" property="id"/>
            <result column="lastName" property="email"/>
        </case>
    </discriminator>
</resultMap>

回顾:Select_记录封装Map

多条记录封装一个map:Map<Integer,Employee>: 键是这条记录的主键,值是记录封装后的Java对象

告诉MyBatis封装这个map时使用哪个属性作为主键,使用注解标明

@MapKey("id")

------------------------------------> - 原创不易,转载请备注来源

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这