Mybatis --- 获取参数值和查询功能
一、MyBatis的增删改查
1.1、新增
<!--int insertUser();-->
<insert id="insertUser">insert into t_user values(null,'admin','123456',23,'男')
</insert>
1.2、删除
<!--int deleteUser();-->
<delete id="deleteUser">delete from t_user where id = 1
</delete>
1.3、修改
<!--int updateUser();-->
<update id="updateUser">update t_user set username='ybc',password='123' where id = 6
</update>
1.4、查询一个实体类对象
<!--User getUserById();-->
<select id="getUserById" resultType="com.ssm.mybatis.bean.User">select * from t_user where id = 2
</select>
1.5、查询list集合
<!--List<User> getUserList();-->
<select id="getUserList" resultType="com.ssm.mybatis.bean.User">select * from t_user
</select>
注意: 查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
二、MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:${} 和 #{}
${} 的本质就是字符串拼接,#{} 的本质就是占位符赋值
${} 使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单 引号;
#{} 使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号
2.1、单个字面量类型的参数
若 mapper 接口中的方法参数为单个的字面量类型
此时可以使用 ${} 和 #{} 以任意的名称获取参数的值,注意 ${} 需要手动加单引号
<!--User getUserByUsername(String username);--><select id="getUserByUsername" resultType="User"><!--select * from t_user where username = '${username}'-->select * from t_user where username = #{username}</select>
2.2、多个字面量类型的参数
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值、以 param1,param2...为键,以参数为值;
因此只需要通过 ${} 和 #{} 访问map集合的键就可以获取相 对应的值,注意 ${} 需要手动加单引号
<!--User checkLogin(String username, String password);--><select id="checkLogin" resultType="User"><!--select * from t_user where username = '${arg0}' and password = '${arg1}'--><!--select * from t_user where username = #{param1} and password = #{param2}-->select * from t_user where username = #{arg0} and password = #{arg1}</select>
2.3、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在 map中
只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应的值,注意 ${} 需要手动加单引号
<!--User checkLoginByMap(Map<String ,Object> map);--><select id="checkLoginByMap" resultType="User"><!--select * from t_user where username = '${username}' and password = '${password}'-->select * from t_user where username = #{username} and password = #{password}</select>
2.4、实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用 ${} 和 #{} ,通过访问实体类对象中的属性名获取属性值,注意 ${} 需要手动加单引号
<!--void insertUser(User user);--><insert id="insertUser" >insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})</insert>
2.5、使用@Param标识参数
可以通过 @Param 注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以 param1,param2...为键,以参数为值;
只需要通过 ${} 和 #{} 访问map集合的键就可以获取相对应 的值, 注意 ${} 需要手动加单引号
<!--User checkLoginByParam(@Param("username") String username, @Param("password") String password);--><select id="checkLoginByParam" resultType="User"><!--select * from t_user where username = '${username}' and password = '${password}'-->select * from t_user where username = #{username} and password = #{password}</select>
三、MyBatis的各种查询功能
3.1、查询一个实体类对象
package com.ssm.mybatis.mapper;import com.ssm.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** Author:wy* Date:2023/3/18*/public interface SelectMapper {/*** 根据用户id查询用户信息* @param id* @return*/User getUserById(@Param("id") int id);
}
<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User">select * from t_user where id = #{id}
</select>
@Testpublic void testGetUserById() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);User user = mapper.getUserById(1);System.out.println(user);}
3.2、查询一个list集合
/*** 查询所有用户信息* @return*/List<User> getUserList();
<!--List<User> getUserList();--><select id="getUserList" resultType="User">select * from t_user</select>
@Testpublic void testGetUserList() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);List<User> userList = mapper.getUserList();for (User user : userList) {System.out.println(user);}}
当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException;
但是若查询的数据只有一条,可以使用实体类或集合作为返回值
3.3、查询单个数据
/*** 查询用户的总记录数* @return*/Integer getCount();
<!--Integer getCount();--><!--在MyBatis中,对于Java中常用的类型都设置了类型别名例如: Integer: int, integer例如: int: _int, _integer例如: Map: mapList: list--><select id="getCount" resultType="Integer">select count(*) from t_user</select>
@Testpublic void testGetCount() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Integer count = mapper.getCount();System.out.println("用户总数=" + count);}
3.4、查询一条数据为map集合
/*** 根据用户id查询用户信息为map集合* @param id* @return*/Map<String, Object> getUserByIdToMap(@Param("id") Integer id);
<!--Map<String, Object> getUserByIdToMap(@Param("id") int id);--><select id="getUserByIdToMap" resultType="map">select * from t_user where id = #{id}</select>
@Testpublic void testGetUserByIdToMap() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Map<String, Object> map = mapper.getUserByIdToMap(1);System.out.println(map);//结果:{password=123456, gender=男, id=1, age=21, email=123456@qq.com, username=张三}}
3.5、查询多条数据为map集合
方式一
/*** 查询所有用户信息为map集合* @return* 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合此时可以将这些map放在一个list集合中获取*/@MapKey("id")List<Map<String, Object>> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();--><select id="getAllUserToMap" resultType="map">select * from t_user</select>
@Testpublic void testGetAllUserToMap() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);List<Map<String, Object>> allUserToMap = mapper.getAllUserToMap();for (Map<String, Object> map : allUserToMap) {System.out.println(map);}}
方式二
/*** 查询所有用户信息为map集合* @return* 可以将每条数据转换的map集合放在一个大的map中,* 但是必须要通过@Mapkey注解将查询的某个字段的值作为大的map的键*/@MapKey("id")Map<String, Object> getAllUserToMap();
<!--Map<String, Object> getAllUserToMap();--><select id="getAllUserToMap" resultType="map">select * from t_user</select>
@Testpublic void testGetAllUserToMap() {SqlSession sqlSession = SqlSessionUtil.getSqlSession();SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);Map<String, Object> map = mapper.getAllUserToMap();System.out.println(map);//{ // 1={password=123456, gender=男, id=1, age=21, email=123456@qq.com, username=张三}, // 2={password=123456, gender=女, id=2, age=19, email=123456@qq.com, username=老六} // }}
相关文章:
Mybatis --- 获取参数值和查询功能
一、MyBatis的增删改查 1.1、新增 <!--int insertUser();--> <insert id"insertUser">insert into t_user values(null,admin,123456,23,男) </insert> 1.2、删除 <!--int deleteUser();--> <delete id"deleteUser">dele…...

【C++】C++入门,你必须要知道的知识
1.C关键字 🔥前言: C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。今天的主要目标: 1️⃣ 补充C语言语法的不足&…...

spring(七):事务操作
spring(七):事务操作前言一、什么是事务二、事务四个特性(ACID)三、事务操作(搭建事务操作环境)四、事务操作(Spring 事务管理介绍)五、事务操作(注解声明式事…...

Word怎么转换成PDF文件格式?思路提供
PDF是一种通用的文件格式,它可以在不同操作系统和设备上保持一致的显示效果。在日常工作或学习中,我们常常需要将Word文档转换为PDF格式,以便更好地进行分享、存档或打印,毕竟Word文档则往往会因为不同版本的软件或者字体等原因而…...
HCIE-Cloud Computing LAB备考第二步:逐题攻破--第五题:规划--根据网络平面规划表,完成ensp中接入交换机SW1/2的配置
我是第五题规划题目的要求之一,需要从这里跳转过来,没看过题目的彭友,可以先跳转过去哈 解题:根据网络平面规划表,在两台交换机上对应的端口表填写服务器的网口号,完成ensp中接入交换机SW1/2的配置 答案 完成交换机端口表 第一:心中划分好“服务器接口表”,考试不需…...

【无标题】Perforce研讨会回顾 | Helix Core在芯片行业的应用实例:芯片项目的版本控制、持续集成及自动化
2023年2月28日,龙智联合全球领先的数字资产管理和DevSecOps工具厂商Perforce共同举办Perforce on Tour网络研讨会——“赋能‘大’研发,助力‘快’交付”。 研讨会上,在芯片行业有15年经验的Perforce Helix Core深度用户——何刚了带来精彩演…...
AdamW 优化器
Adam 优化器于 2014 年推出,其思想:既然知道某些参数移动得更快、更远,则每个参数不需要遵循相同的学习率,因为最近梯度的平方代表每一个权重可以得到多少信号,可以除以这个,确保即使是最迟钝的权重也有机会…...

手把手教你基于HTML、CSS搭建我的相册(上)
The sand accumulates to form a pagoda写在前面HTML是什么?CSS是什么?demo搭建写在最后写在前面 其实有过一些粉丝咨询前端该从什么开始学,那当然是我们的前端基础三件套开始学起,HTML、CSS、javaScript,前端的大部分…...
基于Redis实现的延时队列
基于Redis实现的延时队列 针对于Redis实现延时队列有两种实现方式: 使用zset实现实现的延时队列 借助redis zset来实现延时队列,具体的实现代码很简单,就是从zset中取出score小于当前时间戳的数据 import cn.hutool.json.JSONUtil; impor…...

(3.16——3.19)本周后半段总结
周四(3.16) 1.封装了TitleTip组件,并写了博客记录 http://t.csdn.cn/DAY4chttp://t.csdn.cn/DAY4c2.菜单跳转配置完毕,进行了一些页面的细节样式修改 3.基本写完了ServerSideEncryption页面,十一点多剩最后一点交互的…...
C++ 基础: cin和getline() 有啥区别?
所谓温故而知新,所以时不时会回头来看看我们最最基础的知识。 获取标准键盘输入的方法有多种。以C语言来说,最常用的就是cin 和geline() 。那么它们之间有什么区别呢,我们总结一下。 一、cin和geline的异同点 在 C 中,cin 和 ge…...

在使用fastjson中遇到的问题
一、在使用fastjson中遇到的问题 导论:最近在写一个JavaFx项目的时候使用到了fastjson作为处理json数据的依赖。在其它非JavaFx项目中也使用到了相同版本的fastjson,但是可以正常运行,而在JavaFx项目中却报异常,刚开始以为是我的依…...

C++造轮子飙车现场之无锁、有锁环形队列实现
先看带锁的实现。 带锁版本 circular_queue.h // 头文件防卫 #ifndef CIRCULAR_QUEUE_H #define CIRCULAR_QUEUE_H#include <mutex> // 互斥量 #include <condition_variable> // 条件变量template <typename T> class CircularQueue { public:// 构造函数…...
Spring Profiles and @Profile
1. Overview In this tutorial, we’ll focus on introducing Profiles in Spring. Profiles are a core feature of the framework — allowing us to map our beans to different profiles — for example, dev, test, and prod. We can then activate different profiles…...
数据分析-数据探索
文章目录前言主要内容总结更多宝藏前言 😎🥳😎🤠😮🤖🙈💭🍳🍱 随着大数据和人工智能技术的不断发展,数据分析已经成为了一种非常重要的技能和工…...

7个最受欢迎的Python库,大大提高开发效率
当第三方库可以帮我们完成需求时,就不要重复造轮子了 整理了GitHub上7个最受好评的Python库,将在你的开发之旅中提供帮助 PySnooper 很多时候时间都花在了Debug上,大多数人呢会在出错位置的附近使用print,打印某些变量的值 这个…...

Intellij IDEA 中调试 maven 插件
Intellij IDEA 中调试 maven 插件话痨一下步骤1. classfinal-demo 项目部分2. ClassFinal 部分参考资料话痨一下 目前有两个项目: ClassFinal 是一款java class文件安全加密工具。classfinal-demo 是我建的一个Demo,用来测试ClassFinal的加密效果。 目…...

Java全栈知识(1)缓存池
我们先看这么一道题 Integer x new Integer(123); Integer y new Integer(123); System.out.println(x y); // false Integer z 123; Integer k 123; System.out.println(z k); // true Integer a 200; Integer b 200; System.out.println(z k); //false 我们…...

网络安全的特性
0x00 前言 网络安全的特性包括,机密性,完整性,可用性,真实性和不可否认性。详细的内容可以参考如下的内容。 Xmind资源请下载~ 0x01 机密性 机密性(Confidentiality) 意味着阻止未经授权的实体&#x…...

YOLOv8 多目标跟踪
文章大纲 简介环境搭建代码样例跟踪原理代码分析原始老版实现新版本封装代码实现追踪与计数奇奇怪怪错误汇总lap 安装过程报错推理过程报错参考文献与学习路径简介 使用yolov8 做多目标跟踪 文档地址: https://docs.ultralytics.com/modes/track/https://github.com/ultralyt…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...