Mybatis高级-resultMap之collection聚集

From: https://aodeng.cc/archives/mybatisgaoji

简介

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
额,估计这样说大家听不懂,简单的意思就是把两张表联系起来,用于解决一些奇怪的需求

代码

1.定义简单的sql片段

<!-- 基本查询--><sql id="vo_select">SELECTvo.expenseId,vo.projectId,vo.expenseUserId,sua.realName as expenseUserName,vo.expenseTime,vo.expenseTypeId,vo.beneficialDepartmentId,sd.name as beneficialDepartmentName,vo.currencyId,vo.money,vo.paperCheckerId,vo.paperCheckerTime,vo.paidDepartmentId,vo.paidUserId,vo.paidTime,vo.expenseNote,vo.description,vo.currentStatus,vo.invoiceAmount,vo.paperFlag,vo.recordFlag,vo.createUserId,vo.createTimeFROM p_expense voINNER JOIN sys_user_archive sua ON sua.userId=vo.expenseUserIdINNER JOIN sys_department sd ON sd.departmentId=vo.beneficialDepartmentId</sql> 

2.查询条件拼接,返回resultMap

<select id="findAll" parameterType="Pasv" resultMap="pexpenseMap"><include refid="vo_select"/>WHERE 1=1<!--根据登陆人判断流程审核步骤的人是否一样 --><if test="vo.userId !=null and vo.userId !=''">AND(EXISTS(select 0 from p_expense_flow pef where pef.flag=0 and pef.checkUserIds like concat('%#',#{vo.userId},'#%')AND pef.expenseID=vo.expenseId))</if><!-- 根据时间查询 --><if test="vo.searchStartTime !=null and vo.searchStartTime !=''">AND vo.createTime >=DATE_FORMAT(#{vo.searchStartTime},'%Y-%m-%d')</if><if test="vo.searchEndTime !=null and vo.searchEndTime !=''">AND vo.createTime <DATE_FORMAT(date_add(#{vo.searchEndTime}, INTERVAL 1 day),'%Y-%m-%d')</if><!-- 注释掉是避免从我的任务中查询显示一条数据--><!-- <if test="null!=vo.expenseId and ''!=vo.expenseId">AND vo.expenseId = #{vo.expenseId}</if> --><if test="null!=vo.projectId and ''!=vo.projectId">AND vo.projectId = #{vo.projectId}</if><if test="null!=vo.expenseUserId and ''!=vo.expenseUserId">AND vo.expenseUserId = #{vo.expenseUserId}</if><if test="null!=vo.expenseTime and ''!=vo.expenseTime">AND vo.expenseTime = #{vo.expenseTime}</if><if test="null!=vo.expenseTypeId and ''!=vo.expenseTypeId">AND vo.expenseTypeId = #{vo.expenseTypeId}</if><if test="null!=vo.beneficialDepartmentId and ''!=vo.beneficialDepartmentId">AND vo.beneficialDepartmentId = #{vo.beneficialDepartmentId}</if><if test="null!=vo.currencyId and ''!=vo.currencyId">AND vo.currencyId = #{vo.currencyId}</if><if test="null!=vo.money and ''!=vo.money">AND vo.money = #{vo.money}</if><!-- 根据报销人 --><if test="vo.searchName !=null and vo.searchName !=''">AND sua.realName LIKE CONCAT(CONCAT('%', #{vo.searchName}),'%')</if><if test="null!=vo.paperCheckerId and ''!=vo.paperCheckerId">AND vo.paperCheckerId = #{vo.paperCheckerId}</if><if test="null!=vo.paperCheckerTime and ''!=vo.paperCheckerTime">AND vo.paperCheckerTime = #{vo.paperCheckerTime}</if><if test="null!=vo.paidDepartmentId and ''!=vo.paidDepartmentId">AND vo.paidDepartmentId = #{vo.paidDepartmentId}</if><if test="null!=vo.paidUserId and ''!=vo.paidUserId">AND vo.paidUserId = #{vo.paidUserId}</if><if test="null!=vo.paidTime and ''!=vo.paidTime">AND vo.paidTime = #{vo.paidTime}</if><if test="null!=vo.description and ''!=vo.description">AND vo.description = #{vo.description}</if><if test="null!=vo.currentStatus and ''!=vo.currentStatus">AND vo.currentStatus = #{vo.currentStatus}</if><if test="null!=vo.invoiceAmount and ''!=vo.invoiceAmount">AND vo.invoiceAmount = #{vo.invoiceAmount}</if><if test="null!=vo.paperFlag and ''!=vo.paperFlag">AND vo.paperFlag = #{vo.paperFlag}</if><if test="null!=vo.recordFlag and ''!=vo.recordFlag">AND vo.recordFlag = #{vo.recordFlag}</if><if test="null!=vo.createUserId and ''!=vo.createUserId">AND vo.createUserId = #{vo.createUserId}</if><if test="null!=vo.createTime and ''!=vo.createTime">AND vo.createTime = #{vo.createTime}</if><if test="null!=vo.enabled and ''!=vo.enabled">AND vo.enabled = #{vo.enabled}</if><!-- 根据报销金额范围查询 --><if test="vo.searchStartMoney !=null and vo.searchStartMoney !='' and vo.searchStartMoney!=0">and vo.money <![CDATA[ >= ]]> #{vo.searchStartMoney}</if><if test="vo.searchEndMoney !=null and vo.searchEndMoney !='' and vo.searchEndMoney!=0">and vo.money <![CDATA[ <= ]]> #{vo.searchEndMoney}</if></select>

3.定义resultMap,用于上面返回的resultMap,重点在于collection,先看代码,我下面解释

<resultMap type="com.account.web.vo.project.PExpenseVo" id="pexpenseMap"><id column="expenseId" property="expenseId"/><result column="projectId" property="projectId"/><result column="expenseUserId" property="expenseUserId"/><result column="expenseUserName" property="expenseUserName"/><result column="expenseTime" property="expenseTime"/><result column="expenseTypeId" property="expenseTypeId"/><result column="beneficialDepartmentId" property="beneficialDepartmentId"/><result column="beneficialDepartmentName" property="beneficialDepartmentName"/><result column="currencyId" property="currencyId"/><result column="money" property="money"/><result column="paperCheckerId" property="paperCheckerId"/><result column="paperCheckerTime" property="paperCheckerTime"/><result column="paidDepartmentId" property="paidDepartmentId"/><result column="paidUserId" property="paidUserId"/><result column="paidTime" property="paidTime"/><result column="expenseNote" property="expenseNote"/><result column="description" property="description"/><result column="currentStatus" property="currentStatus"/><result column="invoiceAmount" property="invoiceAmount"/><result column="paperFlag" property="paperFlag"/><result column="recordFlag" property="recordFlag"/><result column="createUserId" property="createUserId"/><result column="createTime" property="createTime"/><collection property="checkers"  ofType="com.account.web.vo.admin.system.SysUserArchiveVo"select="findChecker3" column="{expenseId2=expenseId}"></collection></resultMap>

4.定义collection用的sql片段

<select id="findChecker3" resultType="com.account.web.vo.admin.system.SysUserArchiveVo">select pef.expenseFlowId,sua.userId,sua.realName,pef.folwMomentId as folwMomentIdfrom sys_user_archive suaINNER JOIN p_expense_flow pef ON pef.checkUserId =sua.userId AND pef.expenseid=#{expenseId2}</select>

低调小熊猫独家解析

先给大家看一张图,我就是靠这一张图学会的,不要说图看不清楚,自己ctrl+

ok,这样聪明的估计就学会了,不会的看上面代码吧
额,还是解释几个地方

<collection property="checkers"  ofType="com.account.web.vo.admin.system.SysUserArchiveVo"select="findChecker3" column="{expenseId2=expenseId}"></collection>

1.property=”checkers”就是上面那个resultMap返回的实体类里面封装的一个集合属性。

2.ofType=”com.account.web.vo.admin.system.SysUserArchiveVo”就是集合的类型

3.select=”findChecker3”就是第四步使用的sql片段的id

4.column=”{expenseId2=expenseId}”那,这个就比较重要了,expenseId就是上面resultMap的字段的名字,expenseId2就是下面sql片段里面条件接收值的字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑公司 Ghost XP SP3 国庆特别版 v2011.10

电脑公司 Ghost XP SP3 国庆特别版 v2011.10 文件名称:DNGS_GhostXpSp3_v2011.10.iso文件大小:686.59MB &#xff08;719,945,728字节&#xff09;系统格式:NTFSCRC32:DDEBC170MD5:FA264E6241154EE7F80EFED3CFF1C6A2SHA1:FFEB1C13854AA954D9EE384153815FAF52E0747B电脑城系统 …

TCP中间件_Delphi_client

1、界面 1.1、formMain.pas 1.1.1、 object frmMain: TfrmMainLeft 191Top 103Width 542Height 466Caption frmMainColor clBtnFaceFont.Charset DEFAULT_CHARSETFont.Color clWindowTextFont.Height -11Font.Name MS Sans SerifFont.Style []OldCreateOrder False…

Java、Mysql、MyBatis 中枚举 enum 的使用

From: https://yulaiz.com/java-mysql-enum/ Java 和 MySql 中都有枚举的概念&#xff0c;合理的使用枚举&#xff0c;可以让代码阅读和数据库数据查询更加直观、高效。那么我们怎么使用呢&#xff0c;什么时候使用&#xff0c;两者之间怎么进行数据关联呢&#xff1f;&#x…

ny12 喷水装置(二)

喷水装置&#xff08;二&#xff09; 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述有一块草坪&#xff0c;横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<10000)个点状的喷水装置&#xff0c;每个喷水装置i喷水的效果是让…

wordpress插件制作视频教程【资料分享】

2019独角兽企业重金招聘Python工程师标准>>> 一共5集&#xff0c;每一集15分钟左右&#xff0c;适合入门用哦~ 资料地址&#xff1a; http://wordpresshy.com/create-plugin 分集介绍&#xff1a; 1 【教学大纲】 1.介绍什么是插件&#xff1b; 2.插件的文件结…

博主故事:博客提升了我在口腔行业的影响力

自从我上次谈了谈个人开设博客的目的一文后&#xff0c;今天就有一位博友发来了感谢留言&#xff0c;他说他的博客让他在国内做牙齿矫正行业的有了一定影响力&#xff0c;下月被请到上海讲课&#xff0c;也有不少民营机构前来挖他&#xff0c;还被邀请参加中国口腔医学界最盛大…

RabbitMQ入门教程——发布/订阅

什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系&#xff0c;让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时&#xff0c;会通知所有的订阅者对象&#xff0c;使他们能够自动更新自己的状态。 为了描述这种模式&#xff0c;我们将会构建…

linux C 学习---函数指针

我们经常会听到这样的说法&#xff0c;不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否&#xff0c;但是它都从侧面反应出了函数指针的重要性&#xff0c;所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。 函数是由执行语句组成的指令序列或者…

CSS3与页面布局学习笔记(六)——CSS3新特性(阴影、动画、渐变、变形( transform)、透明、伪元素等)...

一、阴影 1.1、文字阴影 text-shadow<length>①&#xff1a; 第1个长度值用来设置对象的阴影水平偏移值。可以为负值 <length>②&#xff1a; 第2个长度值用来设置对象的阴影垂直偏移值。可以为负值 <length>③&#xff1a; 如果提供了第3个长度值则用来设置…

解决表字段使用关键字导致Mybatis Generator生成代码异常的解决方案

From: http://blog.itfsw.com/2017/05/23/jiejue-biao-ziduan-shiyong-guanjianzi-daozhi-mybatis-generator-shengcheng-daima-yichang-de-jiejue-fangan/ 在某个项目中遇到这么一个问题&#xff0c;因为原始表结构中某些字段定义使用了MySQL的关键字如match等&#xff0c;在…

Linux C编程---指针数组简析(二维数组、多级指针)

讲到指针和数组&#xff0c;先给大家看一道例题&#xff1a; 题目&#xff1a;填空练习&#xff08;指向指针的指针&#xff09; 1.程序分析&#xff1a;      2.程序源代码&#xff1a; main() { char *s[]{"man","woman","girl","bo…

20169210《Linux内核原理与分析》第十二周作业

Return-to-libc 攻击实验 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址&#xff0c;使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击&#xff0c;一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话&#xff0c;一旦程序…

判断android图片是否硬解码(方法)

2019独角兽企业重金招聘Python工程师标准>>> 在oncreate方面的setContentView(R.layout.main); 前面&#xff0c;添加如下代码&#xff1a; getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HAR…

Linux C 编程技巧--利用有限状态机模型编程

我们知道&#xff0c;一般编写程序时都要画出流程图&#xff0c;按照流程图结构来编程&#xff0c;如果编写一个比较繁琐&#xff0c;容易思维混乱的程序时&#xff0c;我们可以利用有限状态机模型画出一个状态转移图&#xff0c;这样便可以利用画出的逻辑图来编写程序&#xf…

linux远程登录三种方式telnet,ssh,vnc

linux远程连接三种方式telnet&#xff0c;ssh&#xff0c;vnctelnet和ssh服务只能实现基于字符界面的远程控制&#xff0c;如果要基于图形界面进行远程控制&#xff0c;可以借助免费的VNC来完成。一、telnet连接1.首先进入终端&#xff0c;查看是否安装了telnet服务。linux默认…

大数据之Yarn——Capacity调度器概念以及配置

试想一下&#xff0c;你现在所在的公司有一个hadoop的集群。但是A项目组经常做一些定时的BI报表&#xff0c;B项目组则经常使用一些软件做一些临时需求。那么他们肯定会遇到同时提交任务的场景&#xff0c;这个时候到底如何分配资源满足这两个任务呢&#xff1f;是先执行A的任务…

C/C++经典面试题

面试题1&#xff1a;变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义&#xff0c;不分配地址的称为声明。一个变量可以在多个地方声明&#xff0c;但只能在一个地方定义。加入extern修饰的是变量的声明&#xff0c;说明此变量将在文件以外或在文件后面部分定义…

Java跳出多重循环

From: https://www.cnblogs.com/fastfn/p/9777067.html 场景&#xff1a;很多的时候需要做到跳出多重循环&#xff0c;而在Java中虽然后goto关键字&#xff0c;但是是保留字&#xff0c;并没有启用。而在处理分支结构的if...else,switch...case,好像都达不到想要的效果。 作为…

java基础集合简介Map(三)下

From: https://www.cnblogs.com/douyu2580860/p/8358768.html --Map接口简介 今天来看一看map集合&#xff0c;map映射接口&#xff0c;用于存放键值对&#xff0c;<key,value>&#xff0c;通过key来查找value,顾名思义key不能为空&#xff0c;唯一且不重复&#xff0c;不…

从getmemery()函数看内存管理、函数传参等一系列问题

在C 面试题目中&#xff0c;会经常出现getmemery()函数的改错题&#xff0c;比如下面这道题&#xff0c; 例一&#xff1a;代码如下&#xff1a; [cpp] view plaincopy #include <stdio.h> char *getmemery() { char p[] "hello world!"; …