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

目录
  • MyBatis resultMap id标签的错误使用
    • 本节的问题主要是我对mybatis id标签的错误使用
  • resultMap标签的使用规则
    • 自定义结果映射规则
    • association联合查询
    • 使用association进行分布查询
    • collection分步查询

MyBatis resultMap id标签的错误使用

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

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

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

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

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

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...}”

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis的mapper.xml中resultMap标签的使用详解

    1.前言 最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null的情况.或者是resultMap标签和驼峰规则不太明白的同学,可以看这里. 于是顺便梳理一下. 2.关于resultMap 2.1.什么是resultMap? 在mybatis中有一个resultMap标签,它是为了映射select查询出来结果的集合,其主要作用是将实体类中的字段与数据库表中的字段进

  • mybatis mapper互相引用resultMap启动出错的解决

    目录 mybatis mapper互相引用resultMap启动出错 问题 原因 解决方法 mybatis resultMap引发的吐血bug 简单的讲 以下是详细的 利用mybatis读取数据时,发生不可理解的事情 mybatis mapper互相引用resultMap启动出错 问题 Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for kulink.cv

  • Mybatis之@ResultMap,@Results,@Result注解的使用

    目录 Mybatis注解@Results.@Result.@ResultMap 问题 方法一 方法二 mybatis注释使用 resultMap对应的注释,及对应注解Results.Result.One.Many的使用 1.@Results注解 2.@Resutl注解 3.@One注解(一对一) 4.@Many注解(多对一) Mybatis注解@Results.@Result.@ResultMap 问题 在使用mybatis时发现,mybatis能自动匹配实体名和数据库字段名相同的字段.当有实体

  • mybatis中resultMap 标签的使用教程

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检索等jdbc繁杂的过程代码. MyBatis特点: 1.开源的优秀持久层框架 2.SQL语句与代码分离 3.面向配置的编程 4.良好支持复杂数据映射 5.动态SQL resultMap 标签: 用来描述如何从数据库结果集中来加载对象 (敲黑板!!)主管数据库的字段和实体类属性的匹配,

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

    目录 MyBatis resultMap id标签的错误使用 本节的问题主要是我对mybatis id标签的错误使用 resultMap标签的使用规则 自定义结果映射规则 association联合查询 使用association进行分布查询 collection分步查询 MyBatis resultMap id标签的错误使用 我们在编写VO对象,如果业务场景稍微复杂一点,就会用到集合属性.例如用户查看个人订单列表,每个订单又包含多种或者多个规格的商品. 本节的问题主要是我对mybatis id

  • Mybatis resultMap标签继承、复用、嵌套方式

    目录 resultMap标签继承.复用.嵌套 定义表与实体类 表 实体类 定义与表映射的resultMap 继承.复用.嵌套 使用resultmap需要注意的地方 resultMap标签继承.复用.嵌套 记录演示 Mybatis 中 resultMap 标签继承.复用(包括跨文件)以及多层嵌套的使用方法, 继承: 继承已存在的 resultMap 标签进行扩展 复用: 跨mapper文件引用现存的 resultMap 标签 嵌套: 多层嵌套的JavaBean与 resultMap 映射方法 定义

  • Mybatis resultMap标签继承、复用、嵌套方式

    目录 resultMap标签继承.复用.嵌套 定义表与实体类 表 实体类 定义与表映射的resultMap 继承.复用.嵌套 使用resultMap需要注意的地方 resultMap标签继承.复用.嵌套 记录演示 Mybatis 中 resultMap 标签继承.复用(包括跨文件)以及多层嵌套的使用方法, 继承: 继承已存在的 resultMap 标签进行扩展 复用: 跨mapper文件引用现存的 resultMap 标签 嵌套: 多层嵌套的JavaBean与 resultMap 映射方法 定义

  • MyBatis中foreach标签的collection属性的取值方式

    目录 foreach标签的collection属性的取值 传的是List列表 传的是Array数组 传的是Map collection属性总结 MyBatis使用foreach标签报错 原因 解决方案 foreach标签的collection属性的取值 传的是List列表 接口代码 List<Emp> findEmpByDeptnos(List<Integer> deptnos); xml配置代码 <select id="findEmpByDeptnos"

  • 基于mybatis中<include>标签的作用说明

    MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段 sql标签中id属性对应include标签中的refid属性.通过include标签将sql片段和原sql片段进行拼接成一个完整的sql语句进行执行. <sql id="sqlid"> res_type_id,res_type </sql> <select id="selectbyId" resultType="com.property.vo

  • Mybatis中Mapper标签总结大全

    一.标签分类 定义SQL语句 insert delete update select 配置关联关系 collection association 配置java对象属性与查询结果集中列名的对应关系 resultMap 控制动态SQL拼接 foreach if choose 格式化输出 where set trim 定义常量 sql 其他 include 二.标签总结 1. 基础SQL标签 1.1 查询select 标签属性 id 唯一的名称,对应dao中mapper的接口名称 paramterTy

  • mybatis resultmap 如何为对象赋值的调用顺序

    目录 resultmap 为对象赋值的调用顺序 java bean定义如下 部分mybatis映射文件如下 createResultObject方法的代码如下 使用resultMap时需注意的问题 直接用原始方式就行 如果是实体中是list集合 使用association 标签来写 应该使用collection标签 resultmap 为对象赋值的调用顺序 写了一个mybatis的mapper映射文件, java bean定义如下 public class GroupCourseResult e

  • mybatis多表查询的实现(xml方式)

    目录 前言 数据库表及关系 一对多查询 多对一及一对一查询 总结 前言 表之间的关系有几种:一对多.多对一. 一对一.多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和用户是多对一关系,但每个账户只对应一个用户.所以在mybatis中,多对一的关系可以看成一对一的关系.这里我把一对多和多对一的xml配置方式总结了一下,同时还有加载方式.一对多,多对多:通常情况下我们都是采用延迟加载.多对一,一对一:通常情况下我们都是采用立即加载.至于注解方式和多对多查询的xml和注解方

  • Mybatis的where标签使用总结梳理

    目录 背景 原始的手动拼接 Mybatis where标签的使用 进阶:自定义trim标签 where语句的坑 小结 背景 在上篇文章,我们系统地学习了where 1=1 相关的知识点,大家可以回看<MySQL中where 1=1方法的使用及改进>这篇文章.文章中涉及到了Mybatis的替代方案,有好学的朋友在评论区有朋友问了基于Mybatis写法的问题. 本篇文章会将Mybatis中where标签的基本使用形式.小技巧以及容易踩到的坑进行总结梳理,方便大家更好地实践运用d 原始的手动拼接 在

  • 使用MyBatis进行简单的更新与查询方式

    目录 MyBatis增删改查的用法 sql映射文件 myBatis框架的缓存 myBatis框架的新增 myBatis框架的更新 myBatis框架的删除 myBatis框架的简单查询 MyBatis框架的结果映射 resultType和resultMap总结 MyBatis增删改查的用法 sql映射文件 sql映射文件中的顶级元素说明 元素 说明 mapper sql映射文件的根元素,只有一个属性namespace,用于区分不同的mapper,必须全局唯一. cache 为给定命名空间配置缓存

随机推荐