MyBatis resultMap id标签的错误使用方式

作者:BEESTACK 时间:2022-02-01 05:25:37 

MyBatis resultMap id标签的错误使用

我们在编写VO对象,如果业务场景稍微复杂一点,就会用到集合属性。例如用户查看个人订单列表,每个订单又包含多种或者多个规格的商品。

本节的问题主要是我对mybatis id标签的错误使用

id是resultMap以及Collection的子标签,标记出作为 ID 的结果可以帮助提高整体性能。特别注意的是,id是当前命名空间中的一个唯一标识,用于标识一个结果映射。

如下图,itemId(商品id)字段值在数据库中不唯一,错误使用会导致只返回该订单某商品的一条记录。因为对于某个商品,麻辣味和五香味只是商品规格,其商品id是相同的。

MyBatis resultMap id标签的错误使用方式

MyBatis resultMap id标签的错误使用方式

改用普通result标签后,返回正确结果。

MyBatis resultMap id标签的错误使用方式

MyBatis resultMap id标签的错误使用方式

EOF

resultMap标签的使用规则

自定义结果映射规则

<!-- resultMap自定义某个javabean的封装规则
? ? ? ?type:自定义规则的java类型
? ? ? ?id:唯一id方便引用
? ? ?-->
? ? <resultMap type="entity.Employee" id="getEmpByIdMap">
? ? ? ?<!-- id指定主键列的封装规则
? ? ? ? ? ?column:指定哪一列
? ? ? ? ? ?property:指定对应的javabean属性
? ? ? ? -->
? ? ? ?<id column="id" property="id"/>
? ? ? ?<!-- result定义普通列封装规则,若属性名与数据库对应表的列名相同可不写,
? ? ? ? ? ? mybatis会自动封装,但建议将所有的映射规则都写上
? ? ? ?-->
? ? ? ?<result column="name" property="name"/>
? ? ? ?<result column="sex" property="sex"/>
? ? ? ?<result column="email" property="email"/>
? ? </resultMap>
? ? <!-- public Employee getEmpById(Integer id) -->
? ? <select id="getEmpById" resultMap="getEmpByIdMap">
? ? ? ?select * from employee where id=#{id}
? ? </select>

association联合查询

  • association可以指定联合的javabean对象

  • property="dept":指定哪个属性是联合对象

  • javaType:指定这个属性的类型

<resultMap type="entity.Employee" id="getEmpAndDeptMap">
? ? ? ?<id column="id" property="id"/>
? ? ? ?<result column="empName" property="name"/>
? ? ? ?<result column="sex" property="sex"/>
? ? ? ?<result column="email" property="email"/>
? ? ? ?<!-- association可以指定联合的javabean对象
? ? ? ? ? ? property="dept":指定哪个属性是联合对象
? ? ? ? ? ? javaType:指定这个属性的类型-->
? ? ? ?<association property="dept" javaType="entity.Department">
? ? ? ? ? ?<id column="did" property="id"/>
? ? ? ? ? ?<result column="deptName" property="departmentName"/>
? ? ? ?</association>
? ? </resultMap>
? ? <!-- public Employee getEmpAndDept(Integer id) -->
? ? <select id="getEmpAndDept" resultMap="getEmpAndDeptMap">
? ? ? ?select e.id id,e.name empName,e.email email,e.sex sex,e.d_id d_id,
? ? ? ? ? ?d.id did,d.name deptName from employee e,dept d
? ? ? ? ? ?where e.d_id=d.id and e.id=#{id}
? ? </select>

使用association进行分布查询

 1、先按照员工id查询员工信息将会调用查询员工的sql

2、根据查询员工信息中的d_id值去部门表中查出部门信息

3、部门设置到员工中

        

<resultMap type="entity.Employee" id="getEmpAndDeptStepMap">
? ? ? ?<id column="id" property="id"/>
? ? ? ?<result column="name" property="name"/>
? ? ? ?<result column="sex" property="sex"/>
? ? ? ?<result column="email" property="email"/>
? ? ? ?<!-- association定义关联对象的封装规则
? ? ? ? ? ? select:表明当前属性是调用select指定的方法查出的结果
? ? ? ? ? ? column:指定将那一列的值作为参数传给这个方法
? ? ? ? ? ? ?流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,
? ? ? ? ? ? ?并封装给property指定的属性
? ? ? ? ? ? -->
? ? ? ? ? ? <!-- discriminator鉴别器
? ? ? ? ? ? ? ? ?column:指定判定的列名
? ? ? ? ? ? ? ? ?javaType:列值对应的java类型
? ? ? ? ? ? ?-->
? ? ? ?<discriminator javaType="string" column="sex">
? ? ? ? ? ?<!-- resultType不能缺少 -->
? ? ? ? ? ?<case value="男" resultType="entity.Employee">
? ? ? ? ? ? ? <association property="dept" select="dao.DepartmentMapper.getDeptById"
? ? ? ? ? ? ? ? ? column="d_id">
? ? ? ? ? ? ? </association>
? ? ? ? ? ?</case>
? ? ? ?</discriminator>
? ? </resultMap>
? ? <!-- public Employee getEmpByIdStep(Integer id) -->
? ? <select id="getEmpByIdStep" resultMap="getEmpAndDeptStepMap">
? ? ? ?select * from employee where id=#{id}
? ? </select>

嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则

<resultMap type="entity.Department" id="getDeptByIdPlusMap">
? ? ? ?<id column="did" property="id"/>
? ? ? ?<result column="deptName" property="departmentName"/>
? ? ? ?<!-- collection定义关联集合类型的属性的封装规则
? ? ? ? ? ? ofType:指定集合里面元素的类型 ? ? ? ? ? ??
? ? ? ? -->
? ? ? ?<collection property="emps" ofType="entity.Employee">
? ? ? ? ? ?<!-- 定义这个集合中元素的封装规则 -->
? ? ? ? ? ?<id column="eid" property="id"/>
? ? ? ? ? ?<result column="empName" property="name"/>
? ? ? ? ? ?<result column="sex" property="sex"/>
? ? ? ? ? ?<result column="email" property="email"/>
? ? ? ?</collection>
? ? </resultMap>
? ? <!-- public Department getDeptByIdPlus(Integer id) -->
? ? <select id="getDeptByIdPlus" resultMap="getDeptByIdPlusMap">
? ? ? ?select d.id did,d.name deptName,e.id eid,
? ? ? ? ? ?e.name empName,e.sex,e.email
? ? ? ? ? ?from dept d left join employee e
? ? ? ? ? ?on d.id=e.d_id
? ? ? ? ? ?where d.id=#{id}
? ? </select>

collection分步查询

<resultMap type="entity.Department" id="getDeptByIdStepMap">
? ? ? ?<id column="id" property="id"/>
? ? ? ?<result column="name" property="departmentName"/>
? ? ? ?<collection property="emps" select="dao.EmployeeMapperPlus.getEmpsByDeptId"
? ? ? ? ? ?column="{id}">
? ? ? <!-- 或则 column="{deptId=id}"-->
? ? ? ?</collection>
? ? </resultMap>
? ?<!-- public List<Employee> getEmpsByDeptId(Integer deptId -->
? ?<select id="getEmpsByDeptId" resultType="entity.Employee">
? ? ? ?select * from employee where d_id=#{deptId}
? ? </select>
? ? <!-- public Department getDeptByIdStep(Integer id) -->
? ? <select id="getDeptByIdStep" resultMap="getDeptByIdStepMap">
? ? ? ?select * from dept where id=#{id}
? ? </select>

当分布查询需要传递多个多个值时,将多个值封装map传递

colum=“{key1=column1,key2=colum2...}”

来源:https://blog.csdn.net/LIZHONGPING00/article/details/109148269

标签:MyBatis,resultMap,id标签
0
投稿

猜你喜欢

  • C#利用反射来判断对象是否包含某个属性的实现方法

    2023-02-26 06:57:52
  • 一个依赖搞定 Spring Boot 接口防盗刷的流程分析

    2023-06-01 16:46:41
  • 使用Jitpack发布开源Java库的详细流程

    2021-12-18 06:55:58
  • SpringBoot整合Redis之编写RedisConfig

    2023-08-29 02:35:57
  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    2023-12-06 07:34:14
  • Java设计模式之原型设计示例详解

    2023-08-04 04:53:35
  • springboot整合token的实现代码

    2023-11-10 19:02:03
  • C#实现的ZPL条码打印类完整实例

    2022-12-06 14:35:05
  • mybatis 报错显示sql中有两个limit的解决

    2022-04-30 02:50:49
  • Android实现倒计时的按钮的示例代码

    2021-10-17 14:45:11
  • Spring学习之Bean的装配多种方法

    2023-09-04 09:32:36
  • 利用openoffice+jodconverter-code-3.0-bate4实现ppt转图片

    2021-07-24 03:11:25
  • Java基础之简单的图片处理

    2022-08-12 03:49:01
  • 简单谈谈java的异常处理(Try Catch Finally)

    2021-08-01 12:40:02
  • Android开发笔记之:Handler Runnable与Thread的区别详解

    2023-11-10 12:29:01
  • idea中如何使用git进行版本回退详解

    2022-03-24 06:28:11
  • springboot vue测试平台开发调通前后端环境实现登录

    2021-08-13 03:54:02
  • spring cloud gateway请求跨域问题解决方案

    2021-11-05 11:19:25
  • Android编程绘图操作之弧形绘制方法示例

    2021-10-06 00:33:45
  • Spring深入刨析声明式事务注解的源码

    2023-10-23 09:41:48
  • asp之家 软件编程 m.aspxhome.com