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

目录

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方法:

    @Testpublic 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方法:

    @Testpublic 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>
-->

 在测试类中测试该方法:

    @Testpublic void getUserByUsername() {SqlSession sqlSession= JdbcUtil.getSqlSession();///获取UserMapper的代理实现类对象UserMapper userMapper=sqlSession.getMapper(UserMapper.class);User user=userMapper.getUserByUsername("小黑子");System.out.println(user);JdbcUtil.closeSqlSessionAndCommit(sqlSession);}@Testpublic 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.rhkb.cn/news/88795.html

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

相关文章

【MySQL】Java实现JDBC编程

文章目录 1. JDBC2. 添加驱动包3. 编程3.1 创建数据源3.2 与数据库建立连接3.3 构造SQL语句3.4 执行SQL语句3.5 释放资源&#xff0c;关闭连接 1. JDBC 数据库编程必须掌握至少一门编程语言&#xff0c;一种数据库&#xff0c;会导入数据库驱动包。 操作和连接不同数据库都需要…

《C语言深度解剖》.pdf

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 C语言深度解剖.pdf 提取码:yunx

Jmeter请求接口返回值乱码解决

乱码示例 解决步骤&#xff1a; 1.打开Jmeter安装目录下的bin目录&#xff0c;找到jmeter.properties 2.使用记事本或其他编译工具打开jmeter.properties文件&#xff0c;然后全局搜索sampleresult.default.encoding 3.在文件中添加sampleresult.default.encodingutf-8,保存…

15_基于Flink将pulsar数据写入到ClickHouse

3.8.基于Flink将数据写入到ClickHouse 编写Flink完成数据写入到ClickHouse操作, 后续基于CK完成指标统计操作 3.8.1.ClickHouse基本介绍 ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用…

C语言快速回顾(一)

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。C/C是音视频必…

MySQL数据库练习

目录 表结构 建表 插入数据 1、用SQL语句创建学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在系的默认值是 “计算机”。 2、修改student 表中年龄&#xff08;age&#xff09;字段属性&#xff0c;数据类型由…

【LangChain概念】了解语言链️:第2部分

一、说明 在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架&#xff0c;它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则&#xff0c;LangChain正在重新定义通过传统API可以实现的极限。 在上一篇博…

【ts】【cocos creator】excel表格转JSON

需要将表格导出为text格式放到项目resources/text文件夹下 新建场景&#xff0c;挂载到Canvas上运行 表格文件格式&#xff1a; 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…

IDEA的常用设置,让你更快速的编程

一、前言 在使用JetBrains的IntelliJ IDEA进行软件开发时&#xff0c;了解和正确配置一些常用设置是非常重要的。IDEA的强大功能和定制性使得开发过程更加高效和舒适。 在本文中&#xff0c;我们将介绍一些常用的IDEA设置&#xff0c;帮助您更好地利用IDEA进行开发。这些设置包…

Kotlin 中的 Lambda 与 Inline

在Kotlin中&#xff0c;有很多很酷很实用的特性&#xff0c;比如Lambda和高阶函数&#xff0c;利用这些特性&#xff0c;我们可以更加快速的实现开发&#xff0c;提升效率。 比如我们实现一个捕获Throwable&#xff0c;安全执行部分代码的高阶函数 fun safeRun(runnable: () …

034_小驰私房菜_[问题复盘] Qcom平台,某些三方相机拍照旋转90度

全网最具价值的Android Camera开发学习系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 【一、问题】 某些三方相机,预览正常,拍照旋转90度 【二、问题排查】 1 ) HAL这边Jpeg编码数据在哪个地方…

【动态map】牛客挑战赛67 B

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 考虑动态的map 可以先定义一个状态&#xff0c;然后用map统计前缀这个状态的出现次数 在这里&#xff0c;定义{a,b}为cnt1 - cnt0和cnt2 - cnt0 当cnt0 和 cnt1都和cnt2相同时&#xff0c;统计贡献…

在 IntelliJ IDEA 中使用 Docker 开发指南

目录 一、IDEA安装Docker插件 二、IDEA连接Docker 1、Docker for Windows 连接 2、SSH 连接 3、Connection successful 连接成功 三、查看Docker面板 四、使用插件生成镜像 一、IDEA安装Docker插件 打开 IntelliJ IDEA&#xff0c;点击菜单栏中的 "File" -&g…

百度屏蔽词有哪些?其中就有移民关键词指数被屏蔽?

我是百收网SEO&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今日tombkeeper消息爆料&#xff1a;百度指数已经屏蔽“移民”等关键词指数。 大家好&#xff0c;我是百收网SEO商学院的狂潮微课老师&#xff0c;今天我们来讲解第 12 节课关键词优化难度分析…

【JavaEE基础学习打卡03】Java EE 平台有哪些内容?

目录 前言一、Java EE平台说明二、Java EE平台容器及组件1.平台容器2.平台组件 三、JavaEE平台API服务1.API服务概览2.平台API 总结 前言 &#x1f4dc; 本系列教程适用于Java Web初学者、爱好者&#xff0c;小白白。我们的天赋并不高&#xff0c;可贵在努力&#xff0c;坚持不…

每天一道leetcode:72. 编辑距离(动态规划困难)

今日份题目&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例1 输入&#xff1a;word1 "horse", word…

静态库和动态库制作

文章目录 前言一、静态库和动态库介绍1、静态库2、动态库 二、静态库的制作及使用1、准备好源码2、编译源码生成 .o 文件3、制作静态库4、使用静态库 三、动态库的制作及使用1、生成位置无关的 .o 文件2、制作动态库3、使用动态库4、指定动态库路径并使其生效 四、对比1、静态库…

链表OJ详解

&#x1f495;人生不满百&#xff0c;常怀千岁忧&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;链表oj详解 题目一&#xff1a;移除元素 题目要求&#xff1a; 画图分析&#xff1a; 代码实现&#xff1a; struct ListNode* removeElements(struct List…

Linux实用命令合集

适用于CentOS7系统&#xff0c;其他系统有些命令不支持 yum install epel-release 失败 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo vi/vim检索关键字 命令模式:/****"n"可以跳转到下一个关键字位置 cat 查看配置文件不显示…

Redis 6.5 服务端开启多线程源码

redis支持开启多线程&#xff0c;只有从socket到读取缓冲区和从输出缓冲区到socket这两段过程是多线程&#xff0c;而命令的执行还是单线程&#xff0c;并且是由主线程执行 借鉴&#xff1a;【Redis】事件驱动框架源码分析&#xff08;多线程&#xff09; 一、main启动时初始化…