MyBatis学习笔记(六) —— MyBatis的各种查询功能
6、MyBatis的各种查询功能
6.1、查询一个实体类对象
SelectMapper.java接口
/*** 根据用户id查询用户信息* @param id* @return*/
User getUserById(@Param("id") int id);
SelectMapper.xml
<!--User getUserById(@Param("id") int id)-->
<select id="getUserById" resultType="User">select * from t_user where id = #{id}
</select>
SelectMapperTest.java
@Test
public void testGetUserById(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);User user = mapper.getUserById(1);System.out.println(user);
}
运行测试
DEBUG 02-25 02:33:02,731==> Preparing: select * from t_user where id = ? (BaseJdbcLogger.java:137)
DEBUG 02-25 02:33:02,757==> Parameters: 1(Integer) (BaseJdbcLogger.java:137)
DEBUG 02-25 02:33:02,777<== Total: 1 (BaseJdbcLogger.java:137)
User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘12345@qq.com’}
6.2、查询一个list集合
若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值,
否则会抛出异常 TooManyResultsException
若sql语句查询的结果为1条时,此时可以使用实体类类型或list集合类型作为方法的返回值
SelectMapper.java接口
/**
* 查询所有的用户信息
* @return
*/
List<User> getAllUser();
SelectMapper.xml
<select id="getAllUser" resultType="User">select * from t_user
</select>
当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException;
但是若sql语句查询的结果为1条时,此时可以使用实体类类型或list集合类型作为方法的返回值。
运行测试:
DEBUG 02-25 02:33:28,173==> Preparing: select * from t_user (BaseJdbcLogger.java:137)
DEBUG 02-25 02:33:28,198==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-25 02:33:28,215<== Total: 4 (BaseJdbcLogger.java:137)
User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘12345@qq.com’}
User{id=2, username=‘root’, password=‘123456’, age=33, gender=‘女’, email=‘123@qq.com’}
User{id=3, username=‘zhangsan’, password=‘123’, age=23, gender=‘男’, email=‘123@qq.com’}
User{id=4, username=‘lisi’, password=‘123’, age=null, gender=‘null’, email=‘null’}
6.3、查询单个数据
SelectMapper.java接口
查询用户总数
/**
* 查询用户的总数量
* @return
*/
Integer getCount();
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.SelectMapper"><!--MyBatis中为Java中常用的类型设置了类型别名Integer: Integer,intint: _int,_integerMap: mapString: string--><select id="getCount" resultType="int">select count(*) from t_user</select>
</mapper>
SelectMapperTest.java
@Test
public void testGetCount(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Integer count = mapper.getCount();System.out.println(count);
}
运行测试:
DEBUG 02-25 02:41:42,727==> Preparing: select count(*) from t_user (BaseJdbcLogger.java:137)
DEBUG 02-25 02:41:42,749==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-25 02:41:42,766<== Total: 1 (BaseJdbcLogger.java:137)
4


count()中的根据某个字段查询数据数量,若查询出来的结果中的某个字段为null,字段为null的数据不会放入map集合中。


6.4、查询一条数据为map集合
SelectMapper.java接口
/**
* 根据id查询用户信息为map集合
* @param id
* @return
*/
Map<String,Object> getUserByIdToMap(@Param("id") Integer id);
SelectMapper.xml
<select id="getUserByIdToMap" resultType="map">select * from t_user where id = #{id}
</select>
SelectMapperTest.java
@Test
public void testGetUserByIdToMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Map<String, Object> map = mapper.getUserByIdToMap(1);//查询一条数据转换为map集合//{password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin}System.out.println(map);//map集合没有固定的键,如果查询出来的结果集里某个字段为Null,这个字段是不会放在map集合中的。
}
运行测试:


6.5、查询多条数据为map集合
若查询的数据有多条时,并且要将每条数据转换为map集合。
有两种解决方案:
1、将mapper接口方法的返回值设置为泛型是map的list集合。
List<Map<String,Object>> getAllUserToMap();
结果:
[{password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin},{password=123456, gender=女, id=2, age=33, email=123@qq.com, username=root}, {password=123, gender=男, id=3, age=23, email=123@qq.com, username=zhangsan}, {password=123, id=4, username=lisi}
]
2、可以将每条数据转换的map集合放在一个大的map中,但是必须要通过 @MapKey 注解,将查询的某个字段的值作为map的键。
@MapKey(“id”)
Map<String,Object> getAllUserToMap();
结果:
{1={password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin},2={password=123456, gender=女, id=2, age=33, email=123@qq.com, username=root},3={password=123, gender=男, id=3, age=23, email=123@qq.com, username=zhangsan},4={password=123, id=4, username=lisi}
}
方式一:使用能存储map集合的List集合,作为方法的返回值。
SelectMapper.java 接口
/**
* 查询所有的用户信息为map集合
* @return
*/
List<Map<String,Object>> getAllUserToMap();
SelectMapper.xml
<select id="getAllUserToMap" resultType="map">select * from t_user
</select>
SelectMapperTest.java
@Test
public void testGetAllUserToMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);List<Map<String, Object>> list = mapper.getAllUserToMap();System.out.println(list);
}
运行测试
DEBUG 02-25 14:34:25,385==> Preparing: select * from t_user (BaseJdbcLogger.java:137)
DEBUG 02-25 14:34:25,402==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-25 14:34:25,421<== Total: 4 (BaseJdbcLogger.java:137)
[{password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin}, {password=123456, gender=女, id=2, age=33, email=123@qq.com, username=root}, {password=123, gender=男, id=3, age=23, email=123@qq.com, username=zhangsan}, {password=123, id=4, username=lisi}]
方式二:使用@MapKey()注解设置Map集合的键
Map集合中也可以存储多条数据,可以直接把每一条数据转换为Map集合放入List集合中,不能把每条转换为Map集合的数据放入Map集合中。map集合是键值对。查询出来的数据可以作为值。
注解:@MapKey() 把当前查询的数据所转换的Map集合,放入到一个大的Map集合中,通过@MapKey注解设置Map集合的键。
比如:@MapKey(“id”) 括号中id是以查询出来数据的字段id作为键,它的值就是每一条数据转换的Map集合。
SelectMapper.java接口
/**
* 方式二:查询所有的用户信息为map集合
* @return
*/
@MapKey("id")
Map<String,Object> getAllUserToMap2();
SelectMapper.xml
<select id="getAllUserToMap2" resultType="map">select * from t_user
</select>
SelectMapperTest.java
@Test
public void testGetAllUserToMap2(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);/*** {* 1={password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin},* 2={password=123456, gender=女, id=2, age=33, email=123@qq.com, username=root},* 3={password=123, gender=男, id=3, age=23, email=123@qq.com, username=zhangsan},* 4={password=123, id=4, username=lisi}* }*/Map<String,Object> map = mapper.getAllUserToMap2();System.out.println(map);
}
运行测试:
DEBUG 02-25 15:33:21,599==> Preparing: select * from t_user (BaseJdbcLogger.java:137)
DEBUG 02-25 15:33:21,622==> Parameters: (BaseJdbcLogger.java:137)
DEBUG 02-25 15:33:21,638<== Total: 4 (BaseJdbcLogger.java:137)
{1={password=123456, gender=男, id=1, age=23, email=12345@qq.com, username=admin}, 2={password=123456, gender=女, id=2, age=33, email=123@qq.com, username=root}, 3={password=123, gender=男, id=3, age=23, email=123@qq.com, username=zhangsan}, 4={password=123, id=4, username=lisi}}
相关文章:
MyBatis学习笔记(六) —— MyBatis的各种查询功能
6、MyBatis的各种查询功能 6.1、查询一个实体类对象 SelectMapper.java接口 /*** 根据用户id查询用户信息* param id* return*/ User getUserById(Param("id") int id);SelectMapper.xml <!--User getUserById(Param("id") int id)--> <selec…...
2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客
文章目录前言一、安装和配置环境1.安装 Git2.安装 Node.js二、新建博客项目1.GitLab配置CI/CD自动化部署1.1 GitLab新建项目1.2 GitLab自建Runners1.2.1 下载gitlab-runner1.2.2 注册Runners1.2.3 安装Runners并启动1.3 添加.gitlab-ci.yml文件2.拉取和推送hexo blog2.1 拉取he…...
centos7安装
centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像,找到 mirrors链接(速度快) 选择一个中…...
java String类(超详细,含常用方法、面试题,内存图,案例)
String类一、String类的特点二、String 类的常见构造方法三、String常见的面试题1.字符串常量池2.String s "abc"与String s new String("abc")区别3.字符拼接4.常量优化机制四、String常用方法1. 比较字符串内容2. 遍历字符串3.截取字符串4.替换字符串5…...
哈希表以及哈希冲突
目录 哈希表 哈希冲突 1. 冲突发生 2. 比较常见的哈希函数 3. 负载因子调节(重点) 散列表的载荷因子概念 负载因子和冲突率的关系 冲突-解决-闭散列 线性探测 二次探测 冲突-解决-开散列 结尾 我们在前面讲解了TerrMap(Set)的底层是一个搜索…...
测试——基本概念
概念 测试和调试有以下几点区别: 测试是测试人员进行的工作,调试是开发人员调试是发现并解决问题,测试只是发现问题测试贯穿于整个项目的生命周期,而调试主要在编码阶段 测试人员一般有如下的工作: 需求分析&#x…...
SnowFlake 雪花算法和原理(分布式 id 生成算法)
一、概述 SnowFlake 算法:是 Twitter 开源的分布式 id 生成算法。核心思想:使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位,始终为0,不可用。41位的时间序列,精确到毫秒级,41位…...
【死磕数据库专栏】MySQL对数据库增删改查的基本操作
前言 本文是专栏【死磕数据库专栏】的第二篇文章,主要讲解MySQL语句最常用的增删改查操作。我一直觉得这个世界就是个程序,每天都在执行增删改查。 MySQL 中我们最常用的增删改查,对应SQL语句就是 insert 、delete、update、select…...
阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了
前言 随着现在移动端技术的突飞猛进,导致现在市场上,APP 应用数不胜数,那对于测试工程师而言,对于 APP 的测试,那基本就是一个必修课了。 今天,我就来给大家介绍一下,adb 连接 Android 手机的两…...
Docker安装YApi
目录0、Docker 环境准备1、数据库准备 MongoDB2、启动 YAPI3、官网教程0、Docker 环境准备 Docker 容器之间网络互通需要使用 docker network create yapi 创建一个自定义网络 docker network create yapi1、数据库准备 MongoDB YAPI 的数据库是 MongoDB,准备镜像…...
springboot自定义参数解析器
为什么要自定义参数解析器呢? 因为很多项目每次获取用户信息,需要重复从请求头中获取token,用token再去redis或是sql中去拿到存储的计本对象,再将获取到的Json数据,转化为我们需要的对象等代码,作为一名程…...
Python Unittest ddt数据驱动
1、数据驱动介绍: ddt.ddt(类装饰器,申明当前类使用ddt框架)ddt.data(函数装饰器,用于给测试用例传递数据),支持传python所有数据类型:数字(int,…...
Vue自定义组件遇到分页传输数据不正确解决办法
测试环境 Vue3 Element Plus 遇到问题 <el-table:data"tableData">...其他el-table-column<template #default"scope">// 自定义组件<my-button name"编辑" :id"scope.row.id"/ ></template></el-table&…...
ABAP 辨析CO|CN|CA|NA|CS|NS|CP|NP
1、文档说明 本篇文档将通过举例,解析字符的比较运算符之间的用法和区别,涉及到的操作符:CO|CN|CA|NA|CS|NS|CP|NP 2、用法和区别 用法总览 以下举例,几乎都使用一个字符变量和一个硬编码字符进行对比的方式,忽略尾…...
RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解
🚀返回专栏总目录 文章目录 一、pinctrl子系统结构描述二、重要的概念三、主要的数据结构和接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们知道在许多soc内部包含有多个pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。Linux…...
ROS小车研究笔记:二维SLAM建图简介与源码分析
ROS提供了现成的各类建图算法实现。如果只是应用的话不需要了解详细算法原理,只需要了解其需要的输入输出即可。 1 Gmapping Gmapping使用粒子滤波算法进行建图,在小场景下准确度高,但是在大场地中会导致较大计算量和内存需求 Gmapping需要…...
番外9:使用ADS对射频功率放大器进行非线性测试1(以IMD3测试为例)
番外9:使用ADS对射频功率放大器进行非线性测试1(以IMD3测试为例) 一般可以有多种方式对射频功率放大器的非线性性能进行测试,包括IMD3、ACPR、ACLR等等,其中IMD3的实际测试较为简单方便不需要太多的仪器。那么在ADS中…...
车载软件背景(留坑)
目前,车载软件已经成为汽车电子系统中不可或缺的一部分。随着汽车制造商不断增加车载软件的功能和性能,车载软件的市场规模也在不断扩大。据市场研究公司 Grand View Research 预测,到2025年,全球车载软件市场规模将达到190亿美元…...
Hadoop-MapReduce
Hadoop-MapReduce 文章目录Hadoop-MapReduce1 MapRedcue的介绍1.1 MapReduce定义1.2 MapReduce的思想1.3MapReduce优点1.4MapReduce的缺点1.5 MapReduce进程1.6 MapReduce-WordCount1.6.1 job的讲解2 Hadoop序列化2.1 序列化的定义2.2 hadoop序列化和java序列化的区别3 MapRedu…...
ChatGPT来了,软件测试工程师距离失业还远吗?
小伙伴们前一段是不是都看到过ChatGPT的相关视频,那它到底是什么?对软件测试行业会有什么影响? 今天汇智妹就用一篇文章来给大家讲清楚。 一、ChatGPT是什么? 简单来说,ChatGPT是一款人工智能聊天机器人,…...
破局足球数据分析困境:Understat工具的技术赋能与实战应用
破局足球数据分析困境:Understat工具的技术赋能与实战应用 【免费下载链接】understat An asynchronous Python package for https://understat.com/. 项目地址: https://gitcode.com/gh_mirrors/un/understat 问题发现:足球数据分析的三重技术壁…...
智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo数据集 深度学习数据集 第10625期
智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo第10625期 README 项目概述 本数据集聚焦于智能驾驶核心道路要素的识别任务,提供高质量标注图像,专为训练和评估目标检测模型而设计。数据涵盖城市道路常见交通设施与标记,适用于自动驾驶感知…...
ESP32-S3的AI新玩法:除了语音唤醒,还能用TensorFlow Lite Micro做哪些酷事?(环境音识别/振动监测实战)
ESP32-S3边缘智能实战:从环境音识别到工业振动监测的AI新范式 当一颗售价不到5美元的芯片能够听懂玻璃破碎声、预测电机故障,甚至识别婴儿啼哭时,物联网设备的"感知能力"正在被重新定义。ESP32-S3搭配TensorFlow Lite Micro&#x…...
从权重计分到算杀引擎:五子棋AI核心算法实战解析
1. 五子棋AI的算法演进:从基础评分到算杀引擎 五子棋作为一款经典策略游戏,其AI算法的核心在于如何评估棋盘局势并做出最优决策。早期AI主要依赖简单的评分机制,比如给不同的棋形(活二、活三、冲四等)赋予固定分值&…...
Qwen2.5-VL-7B-Instruct部署案例:律所合同图像关键条款高亮+法律依据自动关联
Qwen2.5-VL-7B-Instruct部署案例:律所合同图像关键条款高亮法律依据自动关联 1. 这不是普通OCR,是懂法的视觉助手 你有没有遇到过这样的场景:律所助理收到客户发来的扫描版PDF合同,需要在30分钟内标出违约责任、管辖法院、保密义…...
手把手教你用GDFN模块改进图像处理(附Restormer实战代码)
手把手教你用GDFN模块改进图像处理(附Restormer实战代码) 在计算机视觉领域,图像处理技术正经历着从传统方法到深度学习范式的深刻变革。作为这一变革的前沿代表,Restormer框架凭借其创新的Transformer架构,在图像去噪…...
终极免费开源图像修复工具:ComfyUI-BrushNet完整使用指南
终极免费开源图像修复工具:ComfyUI-BrushNet完整使用指南 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet 想要快速掌握AI图像编辑的核心技术?ComfyUI-BrushNet作为一款…...
Java开源项目—上门家政系统源码
首页与服务展示LBS定位服务: 系统自动定位用户所在城市(如“广州”),并根据地理位置推荐附近的服务资源,确保服务的时效性。多品类服务入口: 首页采用图标矩阵展示,涵盖家庭保洁、上门维修、家电…...
KEITHLEY 6221+2182A组合在霍尔测量中的5个实战技巧(避坑指南)
KEITHLEY 62212182A组合在霍尔测量中的5个实战技巧(避坑指南) 霍尔测量作为材料科学研究中的关键手段,对仪器精度和操作细节的要求近乎苛刻。KEITHLEY 6221电流源与2182A纳伏表的组合,凭借其出色的低噪声性能和微电流处理能力&…...
Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测
Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测 1. 引言:当搜索遇到“大海捞针” 你有没有过这样的经历?面对一份几十页的PDF报告,或者一个包含数千条记录的数据库,想快速找到…...
