Mybatis-各种查询功能

比较推荐的是用@para注解,我们一步一步讲


1. 查询一个实体类对象

若查询出的数据只有一条,可以通过实体类对象接收查询结果


查询一个实体类对象,根据id查询

SelectMapper.java

package com.sakurapaid.mybatis3.select.mapper;import com.sakurapaid.mybatis3.select.bean.User;
import org.apache.ibatis.annotations.Param;public interface SelectMapper {// 查询一个实体类对象,但查询所有男生的信息public User findUserByIdAndId(@Param("id") int id);
}

SelectMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sakurapaid.mybatis3.select.mapper.SelectMapper"><select id="findUserByIdAndId" resultType="User2">select * from user where id = #{id}</select>
</mapper>

测试输出

package com.sakurapaid.mybatis3.select.test;import com.sakurapaid.mybatis3.select.bean.User;
import com.sakurapaid.mybatis3.select.mapper.SelectMapper;
import com.sakurapaid.mybatis3.select.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;public class SelecTest {@Testpublic void test(){// 从SqlSessionUtils工具类中获取SqlSessionSqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);User userByIdAndId = mapper.findUserByIdAndId(1);if (userByIdAndId != null) {System.out.println(userByIdAndId);} else {System.out.println("没有这个用户");}}
}


2. 查询一个list集合

当需要查询一个实体类集合,且预期结果可能包含多个匹配项(如查询所有男性用户)时,直接使用实体类对象接收查询结果会导致编译错误。这是因为查询结果为多条数据,与单个实体类对象的期望类型不符。

为正确处理这种情况,应改用List集合(或其他可容纳多个元素的集合类型)来接收查询得到的多个数据项。


查询所有用户对象

SelectMapper.java

package com.sakurapaid.mybatis3.select.mapper;import com.sakurapaid.mybatis3.select.bean.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface SelectMapper {// 查询一个实体类对象,根据id查询public User findUserByIdAndId(@Param("id") int id);// 查询对象,但查询所有用户public List<User> findAllUser();
}

SelectMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sakurapaid.mybatis3.select.mapper.SelectMapper"><select id="findUserByIdAndId" resultType="User2">select * from user where id = #{id}</select><select id="findAllUser" resultType="User2">select * from user</select>
</mapper>

测试输出

package com.sakurapaid.mybatis3.select.test;import com.sakurapaid.mybatis3.select.bean.User;
import com.sakurapaid.mybatis3.select.mapper.SelectMapper;
import com.sakurapaid.mybatis3.select.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;import java.util.List;public class SelecTest {@Testpublic void test(){// 从SqlSessionUtils工具类中获取SqlSessionSqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);// 查询一个实体类对象,根据id查询/*User userByIdAndId = mapper.findUserByIdAndId(1);if (userByIdAndId != null) {System.out.println(userByIdAndId);} else {System.out.println("没有这个用户");}*/// 查询对象,但查询所有男用户List<User> allUser = mapper.findAllUser();if (allUser != null) {for (User user : allUser) {System.out.println(user);}} else {System.out.println("没有这个用户");}}
}
package com.sakurapaid.mybatis3.select.test;import com.sakurapaid.mybatis3.select.bean.User;
import com.sakurapaid.mybatis3.select.mapper.SelectMapper;
import com.sakurapaid.mybatis3.select.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;import java.util.List;public class SelecTest {@Testpublic void test(){// 从SqlSessionUtils工具类中获取SqlSessionSqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);// 查询一个实体类对象,根据id查询/*User userByIdAndId = mapper.findUserByIdAndId(1);if (userByIdAndId != null) {System.out.println(userByIdAndId);} else {System.out.println("没有这个用户");}*/// 查询对象,但查询所有男用户List<User> allUser = mapper.findAllUser();if (allUser != null) {for (User user : allUser) {System.out.println(user);}} else {System.out.println("没有这个用户");}}
}


3. 查询单个数据

比如查询语句的结果不是要查询一个实体类或者实体类集合

在MyBatis中,对于Java中常用的类型都设置了类型别名

例如:这写都是在Mybatis官方文档上找到的

mybatis – MyBatis 3 | 配置

在MyBatis的XML映射文件中,可以这样使用类型别名:

<!-- 使用resultType映射到单个实体类 -->
<select id="selectUserById" parameterType="int" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}
</select><!-- 使用resultType映射到基本类型(如整数) -->
<select id="countUsers" parameterType="void" resultType="int">SELECT COUNT(*) FROM users
</select><!-- 使用resultType映射到实体类集合 -->
<select id="selectAllUsers" parameterType="void" resultType="com.example.User">SELECT * FROM users
</select><!-- 使用resultType映射到List<Map<String, Object>>类型 -->
<select id="selectUserDetails" parameterType="int" resultType="map">SELECT id, name, email, age FROM users WHERE id = #{id}
</select>

上述例子中:

  • resultType="com.example.User"表明查询结果将被映射到User实体类。
  • resultType="_int"使用了别名_int,代表查询结果是整数类型(可能是Integer或int,具体取决于MyBatis配置)。
  • resultType="list"使用了别名list,表示查询结果将被映射到一个List类型的集合,其中元素类型由SQL查询的列数据决定。

使用聚合函数查询所有用户总数

SelectMapper.java

package com.sakurapaid.mybatis3.select.mapper;import com.sakurapaid.mybatis3.select.bean.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface SelectMapper {// 查询一个实体类对象,根据id查询public User findUserByIdAndId(@Param("id") int id);// 查询对象,但查询所有用户public List<User> findAllUser();// 使用聚合函数查询所有用户总数public int findUserCount();
}

SelectMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sakurapaid.mybatis3.select.mapper.SelectMapper"><select id="findUserByIdAndId" resultType="User2">select * from user where id = #{id}</select><select id="findAllUser" resultType="User2" >select * from user</select><select id="findUserCount" resultType="java.lang.Integer">select count(*) from user</select>
</mapper>

测试输出

package com.sakurapaid.mybatis3.select.test;import com.sakurapaid.mybatis3.select.bean.User;
import com.sakurapaid.mybatis3.select.mapper.SelectMapper;
import com.sakurapaid.mybatis3.select.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;public class SelecTest {@Testpublic void test(){// 从SqlSessionUtils工具类中获取SqlSessionSqlSession sqlSession = SqlSessionUtils.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);User userByIdAndId = mapper.findUserByIdAndId(1);if (userByIdAndId != null) {System.out.println(userByIdAndId);} else {System.out.println("没有这个用户");}}
}


4. 查询一条数据为map集合

当查询结果无法直接映射到某个实体类,或者需要以更灵活的方式组织数据(如跨表查询、聚合查询等)时,查询结果转为Map集合尤为实用。


SelectMapper.java

package com.sakurapaid.mybatis3.select.mapper;import com.sakurapaid.mybatis3.select.bean.User;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface SelectMapper {// 查询一个实体类对象,根据id查询User findUserByIdAndId(@Param("id") int id);// 查询对象,但查询所有用户List<User> findAllUser();// 使用聚合函数查询所有用户总数int findUserCount();// 根据id查询用户信息为一个map集合Map<String, Object> findUserToMap(@Param("id") int id);
}

SelectMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sakurapaid.mybatis3.select.mapper.SelectMapper"><select id="findUserByIdAndId" resultType="User2">select * from user where id = #{id}</select><select id="findAllUser" resultType="User2" >select * from user</select><select id="findUserCount" resultType="java.lang.Integer">select count(*) from user</select><select id="findUserToMap" resultType="java.util.Map">select * from user where id = #{id}</select>
</mapper>

测试输出

// 根据id查询用户信息为一个map集合
Map<String, Object> userToMap = mapper.findUserToMap(1);
System.out.println(userToMap);


5. 查询多条数据为map集合

5.1. 方式一

List<Map<String, Object>>

查询结果是一个List,其中每个元素是一个Map,表示一条数据。Map的键为字段名,值为字段值。适用于需要保持查询结果顺序,或者需要进行进一步集合操作(如过滤、排序等)的情况。

SelectMapper.java

// 查询所有用户信息为map集合
List<Map<String, Object>> findAllUserToMap();

SelectMapper.xml

<select id="findAllUserToMap" resultType="java.util.Map">select * from user
</select>

测试输出

// 查询所有用户信息为map集合
List<Map<String, Object>> allUserToMap = mapper.findAllUserToMap();
for (Map<String, Object> map : allUserToMap) {System.out.println(map);
}


5.2. 方式二

Map<String, Map<String, Object>>

查询结果是一个Map,其键由指定的字段(如"id")值决定,值为一个表示单条数据的Map。这种方式将数据以特定字段为索引组织起来,方便根据该字段快速查找或遍历数据。适用于需要根据特定字段(如"id")直接访问某条数据的场景。

如使用使用@MapKey("id")注解指定Map的键为数据记录的"id"字段。

SelectMapper.java

// 查询所有用户信息为map集合
@MapKey("id")
Map<String, Object> findAllUserToMap();

SelectMapper.xml

<select id="findAllUserToMap" resultType="java.util.Map">select * from user
</select>

测试输出

// 查询所有用户信息为map集合
Map<String, Object> allUserToMap = mapper.findAllUserToMap();
System.out.println(allUserToMap);
输出结果
{1={sex=男, name=萨达姆, id=1, age=26}, 2={sex=男, name=小王, id=2, age=19}, 3={sex=女, name=小红, id=3, age=18}, 4={sex=男, name=小明, id=4, age=18}}


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

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

相关文章

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的&#xff0c;使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 二、特性(为什么要用Redis&#x…

NFT Insider #125:Astar将与索尼开发的新公链将关注游戏或 NFT 等众多领域

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

Python 多线程同步锁实战

大家好&#xff0c;今天我们要聊聊Python中的多线程世界&#xff0c;你知道吗&#xff1f;在并行处理任务时&#xff0c;多线程就像厨房里的大厨们同时烹饪多个菜品&#xff0c;但得保证每道菜都能完美出锅。这就需要我们引入一个神秘的角色——同步锁&#xff08;Lock&#xf…

docker容器内存检测排查

查询容器使用内存 在运维当中&#xff0c;你会发现内存很彪的高&#xff0c;但是如何判断为什么会高&#xff0c;是什么样的程序造成的呢&#xff1f;赶快使用 top&#xff0c;或者 free -h或者 ps -v。是吗&#xff1f;道理是对的。 但是你会发现&#xff0c;全部都是docker…

C语言编译与链接

前言 我们想一个问题&#xff0c;我们写的C语言代码都是文本信息&#xff0c;电脑能直接执行c语言代码吗&#xff1f;肯定不能啊&#xff0c;计算机能执行的是二进制指令&#xff0c;所以将C语言转化为二进制指令需要一段过程&#xff0c;这篇博客讲一下编译与链接&#xff0c;…

OpenHarmony OpenCV应用样例开发

背景 OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C 类构成&#xff0c;同时提供 Python、Java 和 MATLAB 等语言的接口&#xff0c;实现了图像处理和计算机视觉方面…

内源 npm 无法同步官方 npm 解法

内源的 NPM 通常通过 npm config set registry http://内网 全局配置了内源 NPM&#xff0c;采用 T1 进行官方 NPM 的缓存同步。 但可能会存在没有 sync 机制的场景&#xff0c;当依赖的一个外部包发了新版本是无法立即消费的。 可以采用以下方式修正。 1. scope 限制 regis…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…

LeetCode_1.两数之和

一、题目描述 二、方法 1.方法1&#xff08;暴力枚举法&#xff09; 利用两个for循环&#xff0c;对数组进行逐一的遍历&#xff0c;直到找到两个数的和为目标值时返回这两个数的下标。以下为c实现的完整代码。 # include<iostream> using namespace std; #include<…

FPGA芯片在通信基站中的作用

基站作为移动通信系统的核心组成部分&#xff0c;承担着信号的发送和接收任务&#xff0c;包括天线、射频前端、数字信号处理和控制等功能。 随着通信技术不断进步和网络容量的提升&#xff0c;基站功能日益复杂&#xff0c;数量也在增加。 与此同时&#xff0c;FPGA芯片被广…

第P1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 二、我…

Excel·VBA数组分组问题

看到一个帖子《excel吧-数据分组问题》&#xff0c;对一组数据分成4组&#xff0c;使每组的和值相近 目录 代码思路1&#xff0c;分组形式、可分组数代码1代码2代码2举例 2&#xff0c;数组所有分组形式举例 这个问题可以转化为2步&#xff1a;第1步&#xff0c;获取一组数据…

iOS —— 初识KVO

iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项&#xff1a; KVO的基础 1. KVO概念 KVO是一种开发模式&#xff0c;它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…

向开发板上移植ip工具:将ip工具移植到开发板系统中

一. 简介 前面一篇文章对 ip工具源码进行了交叉编译&#xff0c;生成了ip工具。文章如下&#xff1a; 向开发板上移植ip工具&#xff1a;交叉编译 ip工具-CSDN博客 本文对生成的 ip工具进行移植&#xff0c;即移植到开发板系统中&#xff0c;并确定是否可用。 二. 向开发板…

1.Netty介绍及NIO三大组件

Netty网络编程Netty的底层是NIO&#xff08;非阻塞IO&#xff09;&#xff0c;常用的多线程和线程池使用的是阻塞IO&#xff0c;其效率并不高。支持高并发&#xff0c;性能好高性能的服务端程序、客户端程序 NIO三大组件 一、Channel 读写数据的双向传输通道 常见的传输通道…

【数字IC/FPGA】书籍推荐(1)----《轻松成为设计高手--Verilog HDL实用精解》

在下这几年关于数字电路、Verilog、FPGA和IC方面的书前前后后都读了不少&#xff0c;发现了不少好书&#xff0c;也在一些废话书上浪费过时间。接下来会写一系列文章&#xff0c;把一部分读过的书做个测评&#xff0c;根据个人标准按十分制满分来打分分享给大家。 书名&#xf…

链表合集(easy难度)

合并两个有序链表 双指针法 由于list1和list2都是递增的&#xff0c;可以想到用双指针法。假如当前list1这个指针指向的节点被收入完成&#xff0c;那就list1&#xff1b;如果是list2被收入&#xff0c;那就list2。 具体是list1和节点被收入还是list2的节点被收入&#xff…

一、图片隐写[Stegsolve、binwalk、010editor、WaterMark、BlindWaterMark、文件头尾]

工具配置 1.Stegsolve 工具地址&#xff1a;http://www.caesum.com/handbook/Stegsolve.jar 解释&#xff1a;该工具需要安装jar包后才能配合使用&#xff0c;下面同时会给出快速打开工具的代码&#xff0c;需要两个文件&#xff0c;启动的时候启动vbs文件 start.bat java …

docker-compose部署postgresql

1、docker-compose.yml文件 version: "3.9" services:postgis:image: postgis/postgiscontainer_name: postgisrestart: alwaysdeploy:resources:limits:cpus: 1.00memory: 1Greservations:cpus: 0.50memory: 1Ghealthcheck:test: [ "CMD", "pg_isre…

2020年天津市二级分类土地利用数据(矢量)

天津市&#xff0c;位于华北平原海河五大支流汇流处&#xff0c;东临渤海&#xff0c;北依燕山。地势以平原和洼地为主&#xff0c;北部有低山丘陵&#xff0c;海拔由北向南逐渐下降&#xff0c;地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形&#xff0c;平原约…