mybatis多层嵌套resultMap及返回自定义参数详解

1.两层嵌套,一个list中加另外一个list

data:[
{a:123,b:456,c:[{d:7,e:8}]}
]

xml文件定义的sql

select * from zhy z LEFT JOIN wl w on z.id = w.zid

resultMap可以定义:

<resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy自动生成的BaseResultMap">
 <collection property="c" resultMap="wl自动生成的BaseResultMap"/>
</resultMap>

如果测试表zhy与wl表中存在重复名称的字段可以使用columnPrefix

注意w_

select z.*,w.b as w_b,w.c as w_c from zhy z LEFT JOIN wl w on z.id = w.zid

<resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy自动生成的BaseResultMap">
 <collection property="c" resultMap="wl自动生成的BaseResultMap" columnPrefix="w_"/>
</resultMap>

如果接收的实体是自定义的实体并且还有默认参数

当resultMap返回的实体中存在默认值的时候,发现外层的zhy是可以赋值成功的,但是内层的wl却没有,这个时候需要将自动生成的BaseResultMap复制一份重新定义接收实体类

/**
 * 比如这样实体接收中存在默认赋值
 *
 * @author zhy
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class WlVo extends Wl {
 /**
 * 默认赋值false
 */
 private boolean select = false;
}

将type改为自定义的之后在引用

<resultMap id="wlBaseResultMap" type="com.yasugongshang.db.vo.WlVo">
 <id column="id" jdbcType="BIGINT" property="id" />
 <result column="a" jdbcType="BIGINT" property="a" />
</resultMap>
<resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy自动生成的BaseResultMap">
 <collection property="c" resultMap="wlBaseResultMap" columnPrefix="w_"/>
</resultMap>

2.三层嵌套,一个list中加另外一个list,内list中还存在list

data:[
{a:123,b:456,c:[{d:7,e:8,f:[str]}]}
]

这时候只需要在内层wlBaseResultMap中再增加一个collection即可

需要注意的是这个时候columnPrefix可能会导致数据为空

<resultMap id="wlBaseResultMap" type="com.yasugongshang.db.vo.WlVo">
 <id column="id" jdbcType="BIGINT" property="id" />
 <result column="a" jdbcType="BIGINT" property="a" />
 <collection property="f" ofType="string">
 <id column="f" jdbcType="VARCHAR"/>
 </collection>
</resultMap>

补充知识:Mybatis中查询返回多个对象使用resultType使用Map类型代替resultMap

查询resultType直接使用Type,Dao层返回对象为List嵌套的一个Map数据结构

List<Map<String,Object>> selectAll();
<select id="selectAll" resultType="Map">
 //查询语句
</select>

其中Map的key值为查询的属性,Object为查询的值.

注:使用map类型无法转换成驼峰命名,建议还是使用resultMap类型

以上这篇mybatis多层嵌套resultMap及返回自定义参数详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis批量修改时出现报错问题解决方案

    批量修改代码如下 <update id="UPDATE_HOTEL_REAL_TIME_PRICE" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" separator=";"> UPDATE VST_HOTEL_REAL_TIME_PRICE

  • 解决mybatis 中collection嵌套collection引发的bug

    我就废话不多说了,大家还是直接看代码吧~ <resultMap id="ParentMap" type="org.example.mybatis.Parent"> <id column="Id" jdbcType="VARCHAR" property="id" /> <result column="Name" jdbcType="VARCHAR&q

  • myBatis实现三级嵌套复杂对象的赋值问题

    平常我们工作中基本最多两级嵌套,但是有时候难免会遇到三级嵌套的业务场景,笔者最近就碰到了,使用一般的嵌套发现赋值为空,这可难倒了菜逼的我,后来在stackoverflow的帮助下终于搜到了解决办法,完美解决了问题 ,总结一下,方便有需要的同学,下面直接上栗子: 首先上实体类:三级嵌套如下 (电站 -----> 电桩 ---->电枪) 电站实体类 (实体为JPA写法,不影响mybatis的使用) package com.weima.cecapp.entities; import lombok.D

  • mybatis多层嵌套resultMap及返回自定义参数详解

    1.两层嵌套,一个list中加另外一个list data:[ {a:123,b:456,c:[{d:7,e:8}]} ] xml文件定义的sql select * from zhy z LEFT JOIN wl w on z.id = w.zid resultMap可以定义: <resultMap id="zhyResultMap" type="zhy的doman实体" extends="zhy自动生成的BaseResultMap">

  • Java之Mybatis多层嵌套查询方式

    目录 Mybatis多层嵌套查询 表的存储sql文件 实体类 XML Mybatis多层嵌套查询(多对多) 依赖 实体类Setmeal 实体类CheckGroup 实体类CheckItem mapper层 测试 Mybatis多层嵌套查询 三张表:user article blog 表的存储sql文件 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50620 Source Host

  • MyBatis中resultMap和resultType的区别详解

    总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功.(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系.(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些

  • springboot整合mybatis将sql打印到日志的实例详解

    在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-

  • jsp中自定义Taglib详解

    一.自定义标签入门之无参数自定义标签 1.开发自定义标签类 当我们在JSP页面使用一个简单的标签时,底层实际上由标签处理类提供支持,从而可以使用简单的标签来封装复杂的功能,从而使团队更好地协作开发(能让美工人员更好地参与JSP页面的开发). 自定义标签类都必须继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,或者TagSupport除此之外,JSP自定义标签类还有如下要求. 如果标签类包含属性,每个属性都有对应的getter和setter方法. 重

  • Java Mybatis框架增删查改与核心配置详解流程与用法

    目录 Mybatis简介 Mybatis开发步骤: Mybatis的映射文件概述 Mybatis的增删改查操作 MyBatis的核心配置文件概述 MyBatis核心配置文件层级关系 MyBatis常用配置解析 Mybatis相应API 原始JDBC操作 原始jdbc操作(查询数据) 原始jdbc操作(插入数据) 原始jdbc操作的分析原始jdbc开发存在的问题如下: ①数据库连接创建.释放频繁造成系统资源浪费从而影响系统性能 ②sql 语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可

  • MyBatis 延迟加载、一级缓存、二级缓存(详解)

    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis.xm

  • python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

  • pytorch中的自定义数据处理详解

    pytorch在数据中采用Dataset的数据保存方式,需要继承data.Dataset类,如果需要自己处理数据的话,需要实现两个基本方法. :.getitem:返回一条数据或者一个样本,obj[index] = obj.getitem(index). :.len:返回样本的数量 . len(obj) = obj.len(). Dataset 在data里,调用的时候使用 from torch.utils import data import os from PIL import Image 数

  • scrapy爬虫:scrapy.FormRequest中formdata参数详解

    1. 背景 在网页爬取的时候,有时候会使用scrapy.FormRequest向目标网站提交数据(表单提交).参照scrapy官方文档的标准写法是: # header信息 unicornHeader = { 'Host': 'www.example.com', 'Referer': 'http://www.example.com/', } # 表单需要提交的数据 myFormData = {'name': 'John Doe', 'age': '27'} # 自定义信息,向下层响应(respon

随机推荐