NO.3 MyBatis获取参数的两种方式

news2024/11/25 6:58:13

目录

1、两种方式的区别

2、单个字面量类型的参数

2.1 在映射文件中,用#{}加任意名称获取参数的值:

2.2 在映射文件中,用${}加任意名称获取参数的值:

2.3 小结

3、在map集合类型的参数

3.1 使用MyBatis默认的map映射集合

3.2 实验:使用自定义map集合

3.2 结果

4、实体类类型的参数

4.1 实验

4.2 结果

 5、使用@Param标识参数

 5.1 @Param注解使用方法

 5.2 使用@Param注解单(多)个字面类型的参数

 5.3 其他情况


MyBatis获取参数有两种方式,分别为#{}和${}。下面Sql语句以t_user表为例,mapper接口、映射文件、表结构等参考博客:NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查_qq_46053741的博客-CSDN博客

1、两种方式的区别

${}:${}的本质就是字符串拼接,${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;

例如:

select *from t_user where id='${id}'

#{}:#{}的本质就是占位符赋值,但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号。

例如:

select *from t_user where id=#{id}

2、单个字面量类型的参数

在UserMapper接口中定义了多个数据库操作方法,对于只有一个字面量类型的参数,此时可以使用${}和#{}以任意的名称获取参数的值

以UserMapper接口中的User getUserByUsername(String username)方法为例,使用两种方式在Sql语句中获取参数值。

2.1 在映射文件中,用#{}加任意名称获取参数的值:

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{arg0}
    </select>

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{abc}
    </select>

2.2 在映射文件中,用${}加任意名称获取参数的值:

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${arg0}'
    </select>

<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${abc}'
    </select>

因为是以${}方式获取字面量参数的值,因此要在${}外面手动加上单引号,拼接Sql语句。

2.3 小结

 对于以上两种方式,因为getUserByUserBname方法只有一个字面量类型参数,因此可以通过任意的名称获取username参数的值。代码中使用的arg0是MyBatis自动将参数放在一个map映射集合中,以arg0、arg1...(或param1、param2...)为键,以参数为值存储的。因此只需要通过${}和#{}访问map集合的键就可以获取相对应的参数值。以arg0、arg1...(或param1、param2...)为键,获取参数值的方式在多个字面量类型的参数中也可使用。

如果方法中有多个字面量类型的参数,可以通过MyBatis默认的map映射集合获取对应的参数的值,此时不能通过任意的名称获取参数的值。

3、在map集合类型的参数

3.1 使用MyBatis默认的map映射集合

使用MyBatis默认的map映射集合,通使用${}或#{}方法,访问map集合中的arg或param键获取对应的参数值。

3.2 实验:使用自定义map集合

在Sql语句中获取参数的值可以通过MyBatis默认的map集合,同样的也可以使用自定义的map集合访问map集合的键获取参数的值,此时需要我们手动设置key-value。

在UserMapper接口中创建以下方法:

    //通过自定义Map集合获取用户信息,String对应用户名,Object对应用户密码
    User getUserByMap(Map<String,Object> map);

在UserMapper.xml文件中创建该方法的sql语句:

<!--    void getUserByMap(Map<String,Object> map);-->
    <select id="getUserByMap" resultType="User" >
        select *from t_user where username=#{username} and password=#{password}
    </select>

在测试类中测试getUserByMap方法:

    @Test
    public void getUserByMap() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //创建map集合
        Map<String,Object> map=new HashMap<String,Object>();
        //向集合中添加元素
        map.put("username","小黑子");
        map.put("password","123456");
        User user=userMapper.getUserByMap(map);

        System.out.println(user);

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

3.2 结果

 数据库中数据如下:

 查询结果如下:

4、实体类类型的参数

若mapper接口中的方法参数为实体类对象时,此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。

4.1 实验

以UserMapper接口中的int insertUser(User user)方法为例:

    //添加用户
    int insertUser(User user);

UserMapper.xml配置文件中sql语句如下:

<!--    int insertUser(User user);-->
    <insert id="insertUser" >
        insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
    </insert>

 在测试类中测试insertUser方法:

    @Test
    public void insertUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isInsert=0;
        isInsert=userMapper.insertUser(new User(null,"李斯","daqinwangchao",34,'男'));
        if(isInsert>0){
            System.out.println("数据添加成功");
        }else{
            System.out.println("数据添加失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

4.2 结果

控制台输出结果:

数据库数据: 

 

 5、使用@Param标识参数

 5.1 @Param注解使用方法

@Param标识参数适用于以上所有情况,通过@Param注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值。此时只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

 5.2 使用@Param注解单(多)个字面类型的参数

在UserMapper接口中以User getUserByUsername(String username)、int deleteUser(String username,String password)方法为例:

    //根据用户名查询用户信息
    User getUserByUsername(@Parameter("username") String username);
    //根据用户名和密码删除用户
    int deleteUser(@Param("username") String username,@Param("password") String password);

在UserMapper.xml配置文件中sql语句如下,通过注解的value属性值获取参数的值:

<!--    User getUserByUsername(@Param("username") String username);-->
<!--使用#{}方式获取参数的值-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{username}
    </select>
<!--
    使用${}方式获取参数的值
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username='${username}'
    </select>
-->




<!--    int deleteUser(@Param("username") String username,@Param("password") String password);-->
    <delete id="deleteUser">
        delete from t_user where username=#{username} and password=#{password}
    </delete>
<!--
    使用${}方式获取参数的值
    <delete id="deleteUser">
        delete from t_user where username='${username}' and password='${password}'
    </delete>
-->

 在测试类中测试该方法:

    @Test
    public void getUserByUsername() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.getUserByUsername("小黑子");
        System.out.println(user);
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }
    @Test
    public void deleteUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        ///获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isDelete=0;
        isDelete=userMapper.deleteUser("小黑子","1234");
        if(isDelete>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

 结果如下:

 5.3 其他情况

对于实体类类型的参数也可以通过@Param()注解的方式获取参数属性的值,一般情况下不这样使用,因为实体类类型的参数可以直接使用${}和#{}访问实体类对象中的属性名获取属性值。

对于Map集合只需要使用${}或#{},访问map集合中的的键获取对应的参数值,不需要设置@Param()注解。

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

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

相关文章

delphi11中的自动启动和关闭unigui应用服务器

1、设置。 注意&#xff1a;全部。 taskkill /f /im $(OUTPUTFILENAME) 2>1 || exit /B 0 自动运行chrome打开unigui网页 unit ServerModule;interfaceuses Winapi.ShellAPI, vcl.Dialogs;typeTUniServerModule class(TUniGUIServerModule)procedure UniGUIServerModu…

不一般的自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求&#xff0c;是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性&#xff0c;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

spring源码核心

spring创建bean的生命周期&#xff08;大概&#xff09; 容器 可以理解容器为一个Map<beanName, bean对象> 通过类的构造方法创建对象 有两个有参构造方法&#xff0c;就坏了&#xff0c;spring不知道用哪个&#xff0c;这个时候可以加**Autowired** 有无参和有参时…

运营商二要素认证API接口:提供手机号实名验证服务,确保用户信息的真实性

随着互联网的快速发展&#xff0c;各行各业都需要用户进行实名认证。其中&#xff0c;涉及到用户个人信息的场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景&#xff0c;必须要进行实名认证。然而&#xff0c;对于这些场景&#xff0c;用户的个人信息的真实…

04_14缺页异常,虚拟空间加深印象,匿名页,文件页

前言 写代码想知道某段时间内存够不够用 想更清楚高低水位 清楚虚拟ram和物理ram的关系 CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、I0设备等等, 但从CPU发出的访问 地址并非是这些外设在地址总线上的物理地址&#xff0c; 而一个虚拟地址&#xff0c…

idea集成chatGPT,免费使用的bito神器

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

Springboot整合RabbitMq,详细使用步骤

Springboot整合RabbitMq&#xff0c;详细使用步骤 1 添加springboot-starter依赖2 添加连接配置3 在启动类上添加开启注解EnableRabbit4 创建RabbitMq的配置类&#xff0c;用于创建交换机&#xff0c;队列&#xff0c;绑定关系等基础信息。5 生产者推送消息6 消费者接收消息7 生…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

Azure概念介绍

云计算定义 云计算是一种使用网络进行存储和处理数据的计算方式。它通过将数据和应用程序存储在云端服务器上&#xff0c;使用户能够通过互联网访问和使用这些资源&#xff0c;而无需依赖于本地硬件和软件。 发展历史 云计算的概念最早可以追溯到20世纪60年代的时候&#x…

阿里云Alibaba Cloud Linux镜像系统介绍_常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

数据统计与可视化的Dash应用程序

在数据分析和可视化领域&#xff0c;Dash是一个强大的工具&#xff0c;它结合了Python中的数据处理库&#xff08;如pandas&#xff09;和交互式可视化库&#xff08;如Plotly&#xff09;以及Web应用程序开发框架。本文将介绍如何使用Dash创建一个简单的数据统计和可视化应用程…

SpringBoot复习:(44)MyBatisAutoConfiguration

可以看到MyBatisAutoConfiguration引入了MyBatisProperties这个属性&#xff1a; MyBatisAutoConfiguration中配置了一个SqlSessionFactoryBean,代码如下&#xff1a; 可以配置mybatis-config.xml,需要配置文件里指定&#xff1a; mybatis.config-locationclasspath:/mybat…

ImportError: cannot import name ‘MutableMapping‘ from ‘collections‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【FreeRtos基础入门】任务状态

文章目录 前言一、任务状态1.阻塞状态(Blocked)2.暂停状态(Suspended)3.就绪状态(Ready) 总结 前言 本freertos使用stm32系列单片机&#xff0c;使用其他的也可以&#xff0c;如esp系列等… 任务管理是实时操作系统&#xff08;RTOS&#xff09;的核心功能之一&#xff0c;它…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

最强自动化测试框架Playwright(21)-测试生成器inspector

测试生成器 运行该命令时&#xff0c;将打开两个窗口&#xff0c;一个浏览器窗口&#xff0c;可以在其中与要测试的网站进行交互&#xff0c;另一个是Playwright Inspector窗口&#xff0c;可以在其中记录测试&#xff0c;然后将其复制到编辑器中。 使用该命令运行测试生成器…

7.9 SpringBoot实战 拷贝工具类,扩展BeanUtils.copyProperties

文章目录 前言一、拷贝普通对象Bean1.1 基础的Bean拷贝1.2 支持忽略某些属性1.3 支持忽略字段值为null的属性1.4 通用的Bean拷贝1.4.1 拷贝时可指定忽略属性1.4.2 拷贝时外加忽略null属性 二、拷贝集合对象List2.1 拷贝时可指定忽略属性2.2 拷贝时外加忽略null属性 三、拷贝分页…

HOT92-最小路径和

leetcode原题链接&#xff1a;最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;…

基础堆排序(Java 实例代码)

目录 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 src/runoob/heap/Heapify.java 文件代码&#xff1a; 基础堆排序 一、概念及其介绍 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。 堆是一个近…

① vue复习。从安装到使用

vue官网&#xff1a;cn.vuejs.org vue安装 cnpm install -g vue/cli 查看是否安装成功 vue --version 创建一个项目 vue create vue-demo(项目名称) 这个取消掉。空格可选中或者取消。 运行项目&#xff1a; cd 进入到项目下 npm run serve 运行成功后&#xff0c;访问这…