Mybatis【Map传参与模糊查询】

news2024/11/25 16:26:56

使用 Map 传参

当我们的实体类或者对应的数据库表的字段过多时,应当考虑使用Map!

我们之前通过对象传递参数来实现增改时,是通过传递对象做参数 来实现的:

 我们在测试类中调用接口中的方法后,UserMapper.xml 会自动根据对象的属性来确定参数从而实现参数的传递,所以对象的属性名必须和UserMapper.xml 中的参数名一一对应!【paramtype="com.lyh.pojo.User"】

注意:

  • UserMapper.xml 中尽量避免中文注释,容易报错!
  • 提交增删改语句时必须通过事务,否则不生效!

        我们使用Map传递参数,UserMapper.xml 可以直接通过map的键来读取到对应的值,所以map的键必须和UserMapper.xml 中的参数名一一对应!【paramtype="map"】

        但是一个实体类的属性名通常比较规范,而我们的Map的键名比较随意,重点是对应好UserMapper.xml 中的参数名即可。

        只有一个基本类型(通过id或name来查找或者删除用户时)的情况下,我们可以直接在sql中取到。但这也仅限于一个参数,多个参数时,仍然应该通过map来传递参数【paramtype="int/String"】

新增用户

map的key可以随意定义,但需要和UserMapper.xml 的参数名一一对应。

@Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        HashMap<String, Object> map = new HashMap<String, Object>();

        try {
            //传递给 UserMapper.xml 一个对象 它可以通过对象的属性将参数取出来
            map.put("userId",2);
            map.put("userName","李元芳");
            map.put("password","12345");

            int num = mapper.addUser2(map);
            System.out.println(num +" ");

            //提交事务
            sqlSession.commit();
            if (num>=1)
                System.out.println("插入成功");
            else
                System.out.println("插入失败");
        }catch (Exception e){
            System.out.println("SQL异常,该Id已存在");
        }finally {
            sqlSession.close();
        }
    }

 UserMapper.xml

    <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id,name,pwd)
        values (#{userId},#{userName},#{password});
    </insert>

UserMapper.java

在接口中新增方法

//通过map添加用户
    int addUser2(Map<String,Object> map);

查找用户

@Test
    public void getUserById2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //获得接口
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Map<String,Object> map = new HashMap<>();
        map.put("helloId",2);   //使用map可以随意定制参数名 只要对应UserMapper.xml 中的参数名即可
        User user = mapper.getUserById2(map);
        System.out.println(user);

        sqlSession.close();
    }

 在接口中新增方法

   User getUserById2(Map<String ,Object> map);

修改映射文件

    <select id="getUserById2" resultType="com.study.pojo.User" parameterType="map">
        select * from mybatis.user where id = #{helloId}
    </select>

模糊查询

        在MyBatis的映射文件中,parameterType 参数是可选的。它用于指定 SQL 语句中使用的参数的类型。如果不指定 parameterType,MyBatis 将会根据传递给映射语句的参数来自动推断参数类型。但如果我们提供了明确的参数类型时,MyBatis 可以更好地处理参数转换和类型匹配。因此,如果知道参数的类型,最好还是在映射文件中显式地定义 parameterType,以确保正确的类型处理。

1、在Java代码中使用通配符

在接口中新增方法

    List<User> getUserLike(String value);

映射文件

 <select id="getUserLike" resultType="com.study.pojo.User" parameterType="String">
        select * from mybatis.user where name like #{value}
    </select>

 测试类

    @Test
    public void getUserListLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //获得接口
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getUserLike("%李%");

        for(User user: users)
            System.out.println(user);

        sqlSession.close();
    }

 2、在SQL中使用通配符

 <select id="getUserLike" resultType="com.study.pojo.User" parameterType="String">
        select * from mybatis.user where name like "%"#{value}"%"
    </select>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云短信发送接口实现

使用阿里云短信接口发送验证码 1. 引入依赖 springboot 工程引入web 引入 lombok 关键代码引入 <!--阿里云短信服务--> <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.23<…

记录一次重装windows11没有WiFi驱动的排错错误示范

机器是自己组装的台式机&#xff1a; 查看主板的幸好&#xff0c;机箱我是没看懂&#xff0c;然后台式机 bios或者 msinfo32都可以查看 显示&#xff1a; 如下的页面进行查询&#xff1a; 下载 windows的驱动程序和工具包&#xff0c;结果显示华硕官网没有对应的驱动&#xf…

在线Markdown编辑器

一直在寻找一款好用的在线Markdown编辑器&#xff0c;但是好像没有比较知名的简洁的&#xff0c;寻思自己赶紧搞一个&#xff0c;于是找了项目&#xff0c;手动搞了一个上线了&#xff0c;效果不错&#xff0c;特性拉满。欢迎试用 支持“标准” Markdown / CommonMark 和 Gith…

点云可视化

pcl::visualization::CloudViewer 与 pcl::visualization::PCLVisualizer的区别 pcl::visualization::CloudViewer是一个简单的点云查看器类&#xff0c;提供了一个简单的接口来在窗口中显示点云数据。它可以快速地显示点云&#xff0c;并且只需要几行代码即可实现简单的点云查…

数据结构与算法:链表、树、图、堆、散列表

1 链表 链表是线性数据结构&#xff08;数据元素之间存在着“一对一”关系&#xff09;&#xff0c;链表中的每个元素是一个包含数据data和引用字段的对象&#xff0c;引用字段只有next为单向链表&#xff0c;同时又prev和next为双向链表。 1.1 链表基本操作 链表读取第 i 个…

java集合体系结构笔记

java集合的特点&#xff1a; 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变。 单列数据&#xff1a; 双列数据&#xff1a; 单列数据集合存储实现接口Collection 双列数据集合存储实现接口Map 单列数据集合&#xff0c;数据值可重复存储实…

git杀手级功能 —— 分支管理

目录 分支介绍 创建分支 切换分支 和并分支 删除分支 合并冲突 分支管理策略 分支策略 bug分支 其他问题 强行删除临时分支 结语 分支介绍 在版本回退里发现&#xff1a;每次提交&#xff0c;git都会把它们穿成一条时间线&#xff0c;而这条时间线就可以理解为一个分支…

数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

Percona Toolkit调优神器安装与使用 Percona Toolkit安装 本文基于Percona Toolkit 3.2.0&#xff0c;理论支持所有版本。 Percona Toolkit是一款MySQL世界里面非常实用的工具套件&#xff0c;如何安装它。 Windows系统 不支持。详见https://forums.percona.com/discussion/…

vue 一直运行 /sockjs-node/info?t=解决办法

sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。 服务端&#xff1a;sockjs-node&#xff08;https://github.com/sockjs/sockjs-node&#xff09;客户端&…

短视频抖音账号矩阵系统源码开发者自研(二)

一、短视频账号矩阵系统源码开发储存集群化开发运转更快 短视频账号矩阵系统源码开发采用储存集群化开发&#xff0c;可以显著提高系统的运转速度和效率。通过优化储存结构和算法&#xff0c;系统能够更快地处理短视频账号数据&#xff0c;确保用户能够流畅地浏览和观看短视频…

6.4 原子引用

1、什么是原子引用 原子引用以cas的方式实现控制多线程之前的同步&#xff0c;从而保证多线程的安全性 原子引用主要有以下三个类 AtomicReferenceAtomicStampReferenceAtomicMarkableReference 2、demo演示 Slf4j(topic "c.Test35") public class Test35 {pub…

C++day2

一、类和结构体的区别 成员访问权限&#xff1a;类中的成员默认是私有的&#xff0c;需要使用访问修饰符&#xff08;如public、private、protected&#xff09;来显式指定访问权限。而结构体中的成员默认是公共的&#xff0c;即可以直接访问。 继承&#xff1a;类支持继承&am…

面向对象高级实战演练之银行系统

面向对象高级实战演练之银行系统 实现功能&#xff1a; 1. 银行管理员(使用管理员密码)查看所有用户信息 2. 进入银行系统提示功能 3. 用户密码管理 4. 账户开户/销户 5. 存款/取款 6. 用户间转账 7. 用户余额查询 8. 常见错误检查和提示代码实现&#xff1a; import random…

【LeetCode】动态规划 刷题训练(六)

文章目录 123. 买卖股票的最佳时机 III题目解析零笔交易一笔交易两笔交易 状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 188. 买卖股票的最佳时机 IV题目解析状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 53. 最大子数组和状态转…

vhost-net-原理-初始化流程-数据传输流程

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考&#xff1a; 1.vhost net 传统的virtio…

深入理解Java虚拟机jvm-垃圾收集器日志参数

垃圾收集器日志参数 查看GC基本信息查看GC详细信息查看GC前后的堆、方法区可用容量变化查看GC过程中用户线程并发时间以及停顿的时间查看收集器Ergonomics机制&#xff08;自动设置堆空间各分代区域大小、收集目标等内容&#xff0c;从Parallel收集器开始支持&#xff09;自动调…

windows下nginx location root路径问题

Windows版本nginx的多级路径问题 windows 下 nginx location root路径为多级目录的问题解决方案&#xff1a;使用双反斜杠--\\Windows版本的nginx常用命令一览&#xff1a; windows 下 nginx location root路径为多级目录的问题 nginx的windows版本中location路径为多级目录 需…

Git客户端:Tower for Mac 注册版

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

【vs2022】MSVCRTD.lib 4098: 默认库“libcmtd.lib”与其他库的使用冲突

verbose-print- 整理&#xff1a;warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突&#xff1b;请使用 /NODEFAULTLIB:library 讲解的非常详细&#xff1a; Linker 加入命令行选项 To set this linker option in the Visual Studio development environment Open the p…