Java_mybatis-结果集映射-ResultTypeResultMap
Mybatis返回值接收
可以使用两种方式进行参数的接收
resultTyperesultMap
这两种分别都是需要在Mapper.xml文件中去设置的
当结果是一个简单的对象或者list或者map,对象中没有嵌套对象,或者集合时,就可以直接使用resultType
反之如果需要返回的值是一个复杂对象,其中包含list或者map的时候,就需要使用resultMap去确定返回值格式
1 使用 resultType
<sql id="basicSelect">id,name,age,address,emp_detail
</sql>
-
查询单个Map对象
<select id="selectUsers" resultType="map">select id, username, hashedPasswordfrom some_tablewhere id = #{id} </select>Map selectUsers(Long id); -
查询具体单个对象
<select id="selectEmpById" resultType="cn.sycoder.domain.Employee">select<include refid="basicSelect"></include>from employee where id = #{id}</select> <!-- 定义sql--> <sql id="basicSelect">id,name,age,address,emp_detail </sql>Employee selectEmpById(Long id); -
查询集合对象
<select id="selectEmp" resultType="cn.sycoder.domain.Employee">select<include refid="basicSelect"></include>from employeewhere id = #{id} </select>List<Employee> selectEmp(Long id); -
查询单个值
<select id="selectCount" resultType="java.lang.Integer">select count(*) from employee </select>Integer selectCount();
2 使用 resultMap
2.1 简单使用
-
应用场景:实体类属性和数据库列名不匹配的时候(比如,数据库采用经典命名法,java 使用驼峰命名法的时候)
<resultMap id="basicMap" type="cn.sycoder.domain.Employee"> <!-- 设置数据库id 的对应字段--><id property="id" column="id"></id><result property="empDetail" column="emp_detail"></result><result property="name" column="name"></result></resultMap><select id="selectEmpById" resultMap="basicMap">select<include refid="basicSelect"></include>from employee where id = #{id}</select>
-
解决方式2
<settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings> -
id & result
<id property="id" column="post_id"/> <result property="subject" column="post_subject"/> -
id & result 属性
属性 描述 property映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。否则 MyBatis 将会寻找给定名称的字段(field)。无论是哪一种情形,你都可以使用常见的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。 stu.name column数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName)方法的参数一样。javaType一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
2.2多结果集处理前期准备
-
新建学生和班级表


create table class (id bigint auto_incrementprimary key,name varchar(64) null );create table student (id bigint auto_incrementprimary key,name varchar(64) null,age int null,class_id bigint null,constraint student_class_id_fkforeign key (class_id) references class (id) );insert into class values (null,'软工1班'),(null,'计科2班');insert into student (id, name, age,class_id) values (null,'sy',18,1),(null,'zs',19,1),(null,'zz',20,1),(null,'小明',22,2);
2.3一对多处理
-
collection :使用 collection 就可以获取到多个结果集对象
-
一个班级对应多个学生
-
操作
-
第一步,新建 mapper 方法
public interface ClassMapper {MyClass getById(Long id); } -
第二步,编写 xml
<resultMap id="basicMap" type="cn.sycoder.domain.MyClass"><id property="id" column="id"></id><result property="name" column="name"></result> <!-- 获取学生信息信息--><collection property="stus" ofType="cn.sycoder.domain.Student"><id property="id" column="sId"></id><result property="name" column="sName"></result><result property="age" column="age"></result><result property="classId" column="class_id"></result></collection></resultMap><select id="getById" resultMap="basicMap">selectc.*,s.id sId,s.name sName,s.age,s.class_idfromclass c left join student s on c.id = s.class_idwhere c.id = #{id}</select>
-
2.4多对一的处理
-
关联(association):如果我的类里面有其它对象的关联关系,可以使用 association 来进行操作
属性 描述 property映射到列结果的字段或属性。如果用来匹配的 JavaBean存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称的字段。无论是哪一种情形,你都可以使用通常的点式分隔形式进行复杂属性导航。比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。 javaType一个 Java 类的完全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。 -
传统操作
-
使用级联操作
<resultMap id="basicMap" type="cn.sycoder.domain.Student"><id property="id" column="id"></id><result property="name" column="name"></result><result property="age" column="age"></result><result property="classId" column="class_id"></result><result property="cls.id" column="cId"></result><result property="cls.name" column="cName"></result></resultMap><select id="listAllStus" resultMap="basicMap">selectstu.*,c.id cId,c.name cNamefromstudent stu left join class c on stu.class_id = c.id</select>
-
-
使用 association 操作
-
代码
<resultMap id="AssociationMap" type="cn.sycoder.domain.Student"><id property="id" column="id"></id><result property="name" column="name"></result><result property="age" column="age"></result><result property="classId" column="class_id"></result><association property="cls" javaType="cn.sycoder.domain.MyClass"><id property="id" column="cId"></id><result property="name" column="cName"></result></association></resultMap><select id="listAllStusByAssociation" resultMap="AssociationMap">selectstu.*,c.id cId,c.name cNamefromstudent stu left join class c on stu.class_id = c.id</select>
-
3 嵌套 select 查询
- 以多条sql 的方式执行
3.1关联关系 assciation select
-
查询学生信息,包含班级信息
<resultMap id="AssociationSelectMap" type="cn.sycoder.domain.Student"><id property="id" column="id"></id><result property="name" column="name"></result><result property="age" column="age"></result><result property="classId" column="class_id"></result><association property="cls" column="class_id"select="cn.sycoder.mapper.StudentMapper.getClassById"/></resultMap><select id="listAllStusByAssociationSelect" resultMap="AssociationSelectMap">select * from student</select><select id="getClassById" resultType="cn.sycoder.domain.MyClass">select * from class where id = #{id}</select> -
如果关联的是多个结果集使用 resultSet
属性 描述 column当使用多个结果集时,该属性指定结果集中用于与 foreignColumn匹配的列(多个列名以逗号隔开),以识别关系中的父类型与子类型。foreignColumn指定外键对应的列名,指定的列将与父类型中 column的给出的列进行匹配。resultSet指定用于加载复杂类型的结果集名字。 <resultMap id="blogResult" type="Blog"><id property="id" column="id" /><result property="title" column="title"/><association property="author" javaType="Author" resultSet="authors" column="author_id" foreignColumn="id"><id property="id" column="id"/><result property="username" column="username"/><result property="password" column="password"/><result property="email" column="email"/><result property="bio" column="bio"/></association> </resultMap>
3.2 collection select
-
需求:通过班级去查学生,使用嵌套 select 查询
<resultMap id="collectionSelect" type="cn.sycoder.domain.MyClass"><id property="id" column="id"></id><result property="name" column="name"></result><!-- 获取学生信息信息--><collection property="stus" ofType="cn.sycoder.domain.Student"select="getStudentByClassId" column="id"/></resultMap><select id="getByClassId" resultMap="collectionSelect">select * from class where id = #{id}</select><select id="getStudentByClassId" resultType="cn.sycoder.domain.Student">select * from student where class_id = #{id}</select>
3.3 关联查询的总结
- 优点:
- 可以实现延迟加载,前提是要配置
- sql 写起来变得简单了
- 缺点:
- 发起了多条 sql,正常查询只发起一条sql
相关文章:
Java_mybatis-结果集映射-ResultTypeResultMap
Mybatis返回值接收 可以使用两种方式进行参数的接收 resultTyperesultMap 这两种分别都是需要在Mapper.xml文件中去设置的 当结果是一个简单的对象或者list或者map,对象中没有嵌套对象,或者集合时,就可以直接使用resultType 反之如果需要…...
【Java】MySQL存储 MD5 值应该用 VARCHAR 还是CHAR?
CHAR 非常适合存储 MD5 值。因为MD5 值是一个定长的值,对于固定长度的非常短的列,CHAR比VARCHAR的效率更高。 CHAR和VARCHAR的区别: 1)存储长度不同,CHAR 的长度是固定的,VARCHAR 的长度是可变的 假设,当我们定义 CHA…...
pytorch中五种常用随机矩阵构造方法:rand、randn、randn_like、randint、randperm
1 torch.rand:构造均匀分布张量 torch.rand是用于生成均匀随机分布张量的函数,从区间[0,1)的均匀分布中随机抽取一个随机数生成一个张量,其调用方法如下所示: torch.rand(sizes, outNone) ➡️ Tensor 参数: sizes&…...
2023第二届全国大学生数据分析大赛A完整原创论文(含摘要+问题分析+模型建立与求解+python代码)
大家好,从昨天肝到现在,终于完成了2023第二届全国大学生数据分析大赛A题某电商平台用户行为分析与挖掘的完整论文啦。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 12 二.问题分析 13 2.1问题一 13 2.2问…...
Qt 面试指南
一、c基础知识 1、进程和线程的同步方式 进程:1)管道,是内核里的一串缓存 2)消息队列 3)共享内存 4)信号量机制 5)信号 6)socket 线程:1)等待通知机制 2&…...
开利网络的数字化技术加持下,加快扶贫和乡村振兴的效果和进程!
今日,来自山区省份的从事公益、区域民族文化传播、帮扶贫困地区脱贫、农业兴村贵州项目组一行来开利进行数字化脱贫、帮助乡村振兴解决方案探讨交流,交流中,开利网络总结出历经多年实践验证且行之有效的数字化经营、数字化建设经验得到与会成…...
PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)
如何选择合适的字幕添加进短视频呢?首先要先确定增加的视频风格,简约、商务、科技感、炫酷;再确定用途,注释、标记、语音翻译、引用、介绍;最后在相应的模板中挑选几个尝试,悬着一个最切合主题的使用&#…...
金融行业文件摆渡,如何兼顾安全和效率?
金融行业是数据密集型产业,每时每刻都会产生海量的数据,业务开展时,数据在金融机构内部和内外部快速流转,进入生产的各个环节。 为了保障基础的数据安全和网络安全,金融机构采用网络隔离的方式来隔绝外部网络的有害攻击…...
[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System EG1: 烧水与控温水壶EG2: 蓄水与最终水位闭环控制系统 EG1: 烧水与控温水壶 EG2: 蓄水与最终水位 h ˙ q i n A − g h A R \dot{…...
每日一题,杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]]...
Java_Mybatis_缓存
缓存 1.概述 Mybatis 缓存:MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制 2.会话缓存(一级缓存) sqlSession 级别的,也就是说,使用同一个 sqlSession 查询同一 sql 时&#x…...
C#基础面试题集
C#基础 1. 简述值类型和引用类型有什么区别2. C# String类型比 stringBuilder 类型的优势是什么?3.面向对象的三大特点4.请简述private,public,protected,internal的区别5.结构体和类6.请描述Interface与抽象类之间的不同7.在类的构造函数前…...
可视化监管云平台EasyCVR宠物粮食食品厂智能视频监控方案
由于我国养宠物群体的不断膨胀,宠物市场也占据了经济的很大一部分,宠物做为人类的好朋友,可以给人们带来极高的精神抚慰,作为“毛孩子”家长,爱宠人士自然不会亏待自家宠物,都会选择最好的口粮以供宠物食用…...
ArkUI组件
目录 一、概述 声明式UI 应用模型 二、常用组件 1、Image:图片展示组件 示例 配置控制授权申请 2、Text:文本显示组件 示例 3、TextInput:文本输入组件 示例 4、Button:按钮组件 5、Slider:滑动条组件 …...
C语言--动态内存【详细解释】
一.动态内存介绍🍗 在C语言中,动态内存分配是指在程序运行时根据需要动态申请内存空间,以便在程序的不同阶段存储和使用数据。动态内存的分配与释放需要一组函数来实现,包括malloc、calloc、realloc和free。 malloc: 函数用于分配…...
施工现场安全管理系统
伴随着社会发展,各行各业都十分注重安全生产管理;建筑施工行业,由于施工环境具有复杂性、危险源较多、施工人员素质参差不齐等因素,导致安全事故时有发生;凡尔码施工安全管理系统,灵活根据施工现场管理要求…...
电线电缆行业生产管理MES系统解决方案
电线电缆行业生产管理mes系统核心功能 基础数据管理:对基础数据进行统一管理,包括组织架构、原材料数据、设备数据、报工数据、检验数据、员工数据等工艺与BOM管理:对工艺标准进行统一管理,包括工艺的版本管理、关联型号管理&…...
滑动窗口最大值和前K个高频元素
滑动窗口最大值和前K个高频元素 239. 滑动窗口最大值 核心:建立一个单调队列,维护里面的最大值,并且从大到小的顺序即可!【只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。…...
C语言实现在顺序表中找到最大值
用C语言实现在顺序表中找到最大值: #include <stdio.h> #define MAX_SIZE 100 int findMax(int arr[], int size) { int max arr[0]; // 假设第一个元素为最大值 for (int i 1; i < size; i) { // 从第二个元素开始遍历列表 if (…...
数字工厂管理系统建设层级分为哪几层
随着工业4.0时代的到来,数字工厂已成为制造业转型升级的必经之路。数字工厂管理系统作为数字工厂的核心组成部分,对于提高生产效率、降低成本、提升质量等方面具有重要意义。数字工厂管理系统的建设层级一般分为以下几个层次,本文将对其进行详…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
