当前位置: 首页 > news >正文

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

img

img

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

img

img

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集合中的。
}

运行测试:

img

img

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盘启动盘 下载镜像 去官网下载镜像&#xff0c;找到 mirrors链接&#xff08;速度快&#xff09; 选择一个中…...

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&#xff08;Set&#xff09;的底层是一个搜索…...

测试——基本概念

概念 测试和调试有以下几点区别&#xff1a; 测试是测试人员进行的工作&#xff0c;调试是开发人员调试是发现并解决问题&#xff0c;测试只是发现问题测试贯穿于整个项目的生命周期&#xff0c;而调试主要在编码阶段 测试人员一般有如下的工作&#xff1a; 需求分析&#x…...

SnowFlake 雪花算法和原理(分布式 id 生成算法)

一、概述 SnowFlake 算法&#xff1a;是 Twitter 开源的分布式 id 生成算法。核心思想&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位&#xff0c;始终为0&#xff0c;不可用。41位的时间序列&#xff0c;精确到毫秒级&#xff0c;41位…...

【死磕数据库专栏】MySQL对数据库增删改查的基本操作

前言 本文是专栏【死磕数据库专栏】的第二篇文章&#xff0c;主要讲解MySQL语句最常用的增删改查操作。我一直觉得这个世界就是个程序&#xff0c;每天都在执行增删改查。 MySQL 中我们最常用的增删改查&#xff0c;对应SQL语句就是 insert 、delete、update、select&#xf…...

阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了

前言 随着现在移动端技术的突飞猛进&#xff0c;导致现在市场上&#xff0c;APP 应用数不胜数&#xff0c;那对于测试工程师而言&#xff0c;对于 APP 的测试&#xff0c;那基本就是一个必修课了。 今天&#xff0c;我就来给大家介绍一下&#xff0c;adb 连接 Android 手机的两…...

Docker安装YApi

目录0、Docker 环境准备1、数据库准备 MongoDB2、启动 YAPI3、官网教程0、Docker 环境准备 Docker 容器之间网络互通需要使用 docker network create yapi 创建一个自定义网络 docker network create yapi1、数据库准备 MongoDB YAPI 的数据库是 MongoDB&#xff0c;准备镜像…...

springboot自定义参数解析器

为什么要自定义参数解析器呢&#xff1f; 因为很多项目每次获取用户信息&#xff0c;需要重复从请求头中获取token&#xff0c;用token再去redis或是sql中去拿到存储的计本对象&#xff0c;再将获取到的Json数据&#xff0c;转化为我们需要的对象等代码&#xff0c;作为一名程…...

Python Unittest ddt数据驱动

1、数据驱动介绍&#xff1a; ddt.ddt&#xff08;类装饰器&#xff0c;申明当前类使用ddt框架&#xff09;ddt.data&#xff08;函数装饰器&#xff0c;用于给测试用例传递数据&#xff09;&#xff0c;支持传python所有数据类型&#xff1a;数字&#xff08;int&#xff0c;…...

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、文档说明 本篇文档将通过举例&#xff0c;解析字符的比较运算符之间的用法和区别&#xff0c;涉及到的操作符&#xff1a;CO|CN|CA|NA|CS|NS|CP|NP 2、用法和区别 用法总览 以下举例&#xff0c;几乎都使用一个字符变量和一个硬编码字符进行对比的方式&#xff0c;忽略尾…...

RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解

🚀返回专栏总目录 文章目录 一、pinctrl子系统结构描述二、重要的概念三、主要的数据结构和接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们知道在许多soc内部包含有多个pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。Linux…...

ROS小车研究笔记:二维SLAM建图简介与源码分析

ROS提供了现成的各类建图算法实现。如果只是应用的话不需要了解详细算法原理&#xff0c;只需要了解其需要的输入输出即可。 1 Gmapping Gmapping使用粒子滤波算法进行建图&#xff0c;在小场景下准确度高&#xff0c;但是在大场地中会导致较大计算量和内存需求 Gmapping需要…...

番外9:使用ADS对射频功率放大器进行非线性测试1(以IMD3测试为例)

番外9&#xff1a;使用ADS对射频功率放大器进行非线性测试1&#xff08;以IMD3测试为例&#xff09; 一般可以有多种方式对射频功率放大器的非线性性能进行测试&#xff0c;包括IMD3、ACPR、ACLR等等&#xff0c;其中IMD3的实际测试较为简单方便不需要太多的仪器。那么在ADS中…...

车载软件背景(留坑)

目前&#xff0c;车载软件已经成为汽车电子系统中不可或缺的一部分。随着汽车制造商不断增加车载软件的功能和性能&#xff0c;车载软件的市场规模也在不断扩大。据市场研究公司 Grand View Research 预测&#xff0c;到2025年&#xff0c;全球车载软件市场规模将达到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的相关视频&#xff0c;那它到底是什么&#xff1f;对软件测试行业会有什么影响&#xff1f; 今天汇智妹就用一篇文章来给大家讲清楚。 一、ChatGPT是什么&#xff1f; 简单来说&#xff0c;ChatGPT是一款人工智能聊天机器人&#xff0c;…...

破局足球数据分析困境:Understat工具的技术赋能与实战应用

破局足球数据分析困境&#xff1a;Understat工具的技术赋能与实战应用 【免费下载链接】understat An asynchronous Python package for https://understat.com/. 项目地址: https://gitcode.com/gh_mirrors/un/understat 问题发现&#xff1a;足球数据分析的三重技术壁…...

智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo数据集 深度学习数据集 第10625期

智能驾驶之红绿灯识别 斑马线识别 减速带识别 yolo第10625期 README 项目概述 本数据集聚焦于智能驾驶核心道路要素的识别任务&#xff0c;提供高质量标注图像&#xff0c;专为训练和评估目标检测模型而设计。数据涵盖城市道路常见交通设施与标记&#xff0c;适用于自动驾驶感知…...

ESP32-S3的AI新玩法:除了语音唤醒,还能用TensorFlow Lite Micro做哪些酷事?(环境音识别/振动监测实战)

ESP32-S3边缘智能实战&#xff1a;从环境音识别到工业振动监测的AI新范式 当一颗售价不到5美元的芯片能够听懂玻璃破碎声、预测电机故障&#xff0c;甚至识别婴儿啼哭时&#xff0c;物联网设备的"感知能力"正在被重新定义。ESP32-S3搭配TensorFlow Lite Micro&#x…...

从权重计分到算杀引擎:五子棋AI核心算法实战解析

1. 五子棋AI的算法演进&#xff1a;从基础评分到算杀引擎 五子棋作为一款经典策略游戏&#xff0c;其AI算法的核心在于如何评估棋盘局势并做出最优决策。早期AI主要依赖简单的评分机制&#xff0c;比如给不同的棋形&#xff08;活二、活三、冲四等&#xff09;赋予固定分值&…...

Qwen2.5-VL-7B-Instruct部署案例:律所合同图像关键条款高亮+法律依据自动关联

Qwen2.5-VL-7B-Instruct部署案例&#xff1a;律所合同图像关键条款高亮法律依据自动关联 1. 这不是普通OCR&#xff0c;是懂法的视觉助手 你有没有遇到过这样的场景&#xff1a;律所助理收到客户发来的扫描版PDF合同&#xff0c;需要在30分钟内标出违约责任、管辖法院、保密义…...

手把手教你用GDFN模块改进图像处理(附Restormer实战代码)

手把手教你用GDFN模块改进图像处理&#xff08;附Restormer实战代码&#xff09; 在计算机视觉领域&#xff0c;图像处理技术正经历着从传统方法到深度学习范式的深刻变革。作为这一变革的前沿代表&#xff0c;Restormer框架凭借其创新的Transformer架构&#xff0c;在图像去噪…...

终极免费开源图像修复工具:ComfyUI-BrushNet完整使用指南

终极免费开源图像修复工具&#xff1a;ComfyUI-BrushNet完整使用指南 【免费下载链接】ComfyUI-BrushNet ComfyUI BrushNet nodes 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BrushNet 想要快速掌握AI图像编辑的核心技术&#xff1f;ComfyUI-BrushNet作为一款…...

Java开源项目—上门家政系统源码

首页与服务展示LBS定位服务&#xff1a; 系统自动定位用户所在城市&#xff08;如“广州”&#xff09;&#xff0c;并根据地理位置推荐附近的服务资源&#xff0c;确保服务的时效性。多品类服务入口&#xff1a; 首页采用图标矩阵展示&#xff0c;涵盖家庭保洁、上门维修、家电…...

KEITHLEY 6221+2182A组合在霍尔测量中的5个实战技巧(避坑指南)

KEITHLEY 62212182A组合在霍尔测量中的5个实战技巧&#xff08;避坑指南&#xff09; 霍尔测量作为材料科学研究中的关键手段&#xff0c;对仪器精度和操作细节的要求近乎苛刻。KEITHLEY 6221电流源与2182A纳伏表的组合&#xff0c;凭借其出色的低噪声性能和微电流处理能力&…...

Qwen3-Reranker-0.6B效果展示:长文档片段(32K)语义匹配能力实测

Qwen3-Reranker-0.6B效果展示&#xff1a;长文档片段&#xff08;32K&#xff09;语义匹配能力实测 1. 引言&#xff1a;当搜索遇到“大海捞针” 你有没有过这样的经历&#xff1f;面对一份几十页的PDF报告&#xff0c;或者一个包含数千条记录的数据库&#xff0c;想快速找到…...