MyBatis学习笔记(五) —— MyBatis获取参数值的两种方式

news/2024/4/24 18:37:30/文章来源:https://blog.csdn.net/fashionjay2019/article/details/129207955

5、MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${} 和 #{}
${} 的本质就是字符串拼接, #{} 的本质就是占位符赋值
${} 使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;>但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加>单引号

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

若mapper接口中的方法参数为单个的字面量类型,

此时可以使用 ${} 和

#{} 以任意的名称获取参数的值,注意${} 需要手动加单引号

UserMapper.java

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;
/*** MyBatis获取参数值的两种方式:#{} 和 ${}* #{}的本质是占位符,${}的本质是字符串拼接* 1、若mapper接口方法的参数为单个的字面量类型* 此时可以通过#{} 和 ${}以任意的内容获取参数值,一定要注意${}的单引号问题
*/public interface UserMapper {/*** 根据用户名查询用户信息* @param username* @return*/User getUserByUsername(String username);
}

UserMapper.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.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User">select * from t_user where username = #{username}</select>
</mapper>

ParameterTest.java

package com.fan.mybatis;import com.fan.mybatis.mapper.UserMapper;
import com.fan.mybatis.pojo.User;
import com.fan.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;public class ParameterTest {@Testpublic void testGetUserByUsername(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.getUserByUsername("admin");System.out.println(user);}
}

运行,控制台打印输出如下

DEBUG 02-24 17:35:24,407==> Preparing: select * from t_user where username = ? (BaseJdbcLogger.java:137)

DEBUG 02-24 17:35:24,426==> Parameters: admin(String) (BaseJdbcLogger.java:137)

DEBUG 02-24 17:35:24,442<== Total: 1 (BaseJdbcLogger.java:137)

User{id=1, username=‘admin’, password=‘123456’, age=23, gender=‘男’, email=‘12345@qq.com’}

可以看到映射文件中的 #{} 变为? ,#{} 被当做占位符。传过来的参数是admin,查询出来1条数据。

<?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.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User">select * from t_user where username = #{name}</select>
</mapper>

将#{usenrame}变为#{name} , 运行可以看到查询出来的结果。

在mybatis传递参数的过程,不知道传递的参数叫什么名字,只知道传递的值是 admin,所以传递参数值跟#{}里的参数名字没有关系。

建议#{}里的参数名字和传递的参数名一样。

${}测试

错误写法:${username}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User"><!--select * from t_user where username = #{username}-->select * from t_user where username = ${username}</select>
</mapper>

img

可以看到 admin是一个字符串,传入sql中没有加引号。不加单引号会被当做字段来解析,

Unknown column ‘admin’ in ‘where clause’

where字句中有一个不认识的列/字段 admin

#{}执行sql的时候,占用的是?; ${} 执行sql的时候,是直接拼接在sql中的。

正确写法:‘${usenrame}’

<?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.fan.mybatis.mapper.UserMapper"><select id="getUserByUsername" resultType="User"><!--select * from t_user where username = #{username}-->select * from t_user where username = '${username}'</select>
</mapper>

img

${}里不能写数值,纯数字是可以运算的。

5.2、多个字面量类型的参数

若mapper接口中的方法参数为多个时,

此时MyBatis会自动将这些参数放在一个map集合中,以arg0, arg1…为键,以参数为值;以param1, param2 … 为键,以参数为值;因此只需要通过${} 和

#{} 访问map集合的键就可以获取相应的值,注意${} 需要手动加单引号

UserMapper.java

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** @Date: 2023/02/24* @Author: fan* @Description:* MyBatis获取参数值的两种方式:#{} 和 ${}* #{}的本质是占位符,${}的本质是字符串拼接* 1、若mapper接口方法的参数为单个的字面量类型* 此时可以通过#{} 和 ${}以任意的内容获取参数值,一定要注意${}的单引号问题* 2、若mapper接口的方法的参数为多个的字面量类型* 此时MyBatis会将参数放在map集合中,以两种方式存储数据* a> 以arg0,arg1,...为键,以参数为值* b> 以param1,param2,...为键,以参数为值* 因此,只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题*/
public interface UserMapper {/*** 验证登录* @param username* @param password* @return*/User checkLogin(String username,String password);
}

UserMapper.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.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
</mapper>

ParameterTest.java

@Testpublic void testCheckLogin(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.checkLogin("admin","123456");System.out.println(user);
}

运行,控制台报错:

org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

### Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

img

可以看到sql语句没有输出,PersistenceException是配置文件解析错误,BindingException是绑定参数时出现的异常。

Parameter ‘username’ not found. 参数username没有找到。

Available parameters are [arg1, arg0, param1, param2] 可用的参数时arg1, arg0, param1, param2。可参照此方案进行修改。

正确的写法:

方式一

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fan.mybatis.mapper.UserMapper"><select id="checkLogin" resultType="User">select * from t_user where username = #{arg0} and password = #{arg1}</select>
</mapper>

运行可以正常输出信息,查询到用户信息。

img

方式二:

UserMapper.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.fan.mybatis.mapper.UserMapper"><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>
</mapper>

运行可以正常输出信息,查询到用户信息。

img

UserMapper.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.fan.mybatis.mapper.UserMapper"><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 = '${arg0}'-->select * from t_user where username = '${param1}' and password = '${param2}'</select>
</mapper>

img

如果当前参数有两个时,mybatis会自动把这两个参数放在一个map集合中的。放在map集合中,会以两种方式来存储数据。

第一种方式:以arg0,arg1为键,以参数值为值

第二种方式:以parma1,param2为键,以参数值为值。

相当于从map集合中访问存储的数据。通过map中的键访问对应的值。

5.3、map集合类型的参数

若mapper解耦中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** 3、若mapper接口方法的参数为map集合类型的参数* 只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题*/
public interface UserMapper {/*** 添加用户信息* @param user*/void insertUser(User user);
}

ParameterTest.java

@Test
public void testCheckLoginByMap(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String,Object> map = new HashMap<>();map.put("username","admin");map.put("password","123456");User user = mapper.checkLoginByMap(map);System.out.println(user);
}

UserMapper.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.fan.mybatis.mapper.UserMapper"><select id="checkLoginByMap" resultType="User">select * from t_user where username = #{username} and password = #{password}</select>
</mapper>

运行测试类

img

5.4、实体类类型的参数

添加用户信息

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;/*** 4、若mapper接口方法的参数为实体类类型的参数* 只需要通过#{}和${}访问是实体类中的属性名,就可以获取相对应的属性值,一定要注意${}的单引号问题* 属性名只跟getXxx和setXXX的方法名有关系,把set和get去掉,剩余的字母首字母小写,就是当前的属性名*/
public interface UserMapper {/*** 添加用户信息* @param user*/void insertUser(User user);
}

ParameterTest.java

@Test
public void testInsertUser(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = new User(null,"root","123456",33,"女","123@qq.com");mapper.insertUser(user);
}

运行测试

img

img

5.5、使用@Param注解标识参数

可以通过@Param注解标识mapper接口中的方法参数,

此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以param1,param2…为键,以参数为值;只需要通过$

${}需要手动加单引号。

User checkLoginByParam(@Param("username") String username, @Param("password") String password);

加上@Param(“username”)后,mybatis仍然会将两个参数放进map中,放进map中的键就是@Param括号中的username和password

UserMapper接口

package com.fan.mybatis.mapper;import com.fan.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;/*** 5、可以在mapper接口方法的参数上设置@Param注解* 此时MyBatis会将这些参数放在map中,以两种方式进行存储* a> 以@Param注解的value属性值为键,以参数为值* b> 以param1,param2...为键,以参数为值* 只需要通过#{}和${}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题。*/
public interface UserMapper {/*** 验证登录(使用@Param)* @param username* @param password* @return*/User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}

UserMapper.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.fan.mybatis.mapper.UserMapper"><!-- 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></mapper>

ParameterTest.java

@Test
public void testCheckLoginByParam(){SqlSession sqlSession = SqlSessionUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.checkLoginByParam("admin","123456");System.out.println(user);
}

运行

img

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

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

相关文章

SpringBoot整合阿里云OSS文件上传、下载、查看、删除

SpringBoot整合阿里云OSS文件上传、下载、查看、删除1、开发准备1.1 前置知识1.2 环境参数1.3 你能学到什么2. 使用阿里云OSS2.1 创建Bucket2.2 管理文件2.3 阿里云OSS文档3. 项目初始化3.1 创建SpringBoot项目3.2 Maven依赖3.3 安装lombok插件4. 后端服务编写4.1 阿里云OSS配置…

4面美团软件测试工程师,却忽略了这一点,直接让我前功尽弃

说一下我面试别人时候的思路 反过来理解&#xff0c;就是面试时候应该注意哪些东西&#xff1b;用加粗部分标注了 一般面试分为这么几个部分&#xff1a; 一、自我介绍 这部分一般人喜欢讲很多&#xff0c;其实没必要。大约5分钟内说清楚自己的职业经历&#xff0c;自己的核…

自动驾驶仿真测试介绍

作者 | 楼泽如 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 引 言 自动驾驶汽车的兴起&#xff0c;正在重新定义汽车行业。随着自动驾驶技术的发展&#xff0c;自动驾驶汽车将会大大提升交通安全、减少事故发生、减少交通拥堵、提高公路容量等等&#xff0…

Java学习笔记 --- 正则表达式

一、体验正则表达式 package com.javase.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 体验正则表达式&#xff0c;给文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假设&#xff0c;编写了爬虫&…

Linux——UDP协议与相关套接字编程

一.概念在网络通信中&#xff0c;传输层中最常用的通信协议有两个&#xff1a;TCP协议与UDP协议。这两种协议虽然都可以用于网络通信&#xff0c;但是通信方式不同决定了应用场景的不同。与TCP协议相比&#xff0c;UDP协议最具特色的不同点有两个&#xff1a;无连接与面向数据报…

码住!新手容易上手的5个tiktok数据分析网站

当下短视频已经称霸了各大内容平台&#xff0c;越来越多的创作者进入到短视频赛道&#xff0c;为了更好地运营自己的内容平台&#xff0c;数据分析是必不可少的。很多人都入局了tiktok&#xff0c;对于商家或者博主红人来说&#xff0c;这是比较新平台&#xff0c;希望能在这个…

python库streamlit学习笔记

什么是streamlit&#xff1f; Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序。它是一个基于Python的库&#xff0c;专为机器学习工程师设计。数据科学家或机器学习工程师不是网络开发人员&#xff0c;他们对花几周时间学习…

Vue-cli脚手架在做些什么(源码角度分析)

什么是Vue脚手架&#xff1f;在学习初期&#xff0c;我们的项目往往需要借助webpack、vite等打包工具配置Vue的开发环境&#xff0c;但是在真实开发中我们不可能每个项目从头来完成所有的webpack配置&#xff0c;这样显得开发的效率会大大的降低&#xff1b;所有的真实开发中&a…

实现基于国密SM3的密钥派生(KDF)功能

实现基于国密SM3的密钥派生&#xff08;KDF&#xff09;前言KDF 标准基于SM3的kdf实现前言 密钥派生函数&#xff08;KDF&#xff09;&#xff1a;密钥派生函数是指从一个共享的秘密比特串中派生密钥数据&#xff0c;在密钥协商过程中&#xff0c;密钥派生函数作用在密钥交换所…

【一看就会】实现仿京东移动端页面滚动条布局

简单粗暴直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content&q…

中移链结合CA证书实现节点准入控制

01背景介绍BSN开放联盟链&#xff08;BSN Open Permissioned Blockchain&#xff0c; 简称OPB&#xff09;包括多条基于公有链框架和联盟链框架搭建的公用链&#xff0c;开发者可以选择适合应用业务需求的开放联盟链部署和运行智能合约和分布式应用&#xff0c;每条开放联盟链各…

码匠 × OpenAI :快速生成 SQL 语句,提升开发效率!

目录 使用 OpenAI 生成 SQL 码匠连接与集成 OpenAI 总结 关于码匠 在码匠中&#xff0c;编写 SQL 语句&#xff0c;并结合码匠一系列开箱即用的组件实现复杂的业务逻辑&#xff0c;是很常见的应用开发场景。然而&#xff0c;不同的数据库在 SQL 增删改查操作语法、类型字段和…

Java知识复习(二)Java集合

1、List、Set和Map的区别 List&#xff1a;存储的顺序是有序的、可重复的Set&#xff1a;存储的顺序是无序的、不可重复的Map&#xff1a;使用键值对存储&#xff0c;Key和Value都是无序的&#xff0c;其中Key不可重复&#xff0c;而Value可重复 2、ArrayList和LinkedList的区…

JavaEE简单实例——MyBatis的一对一映射的嵌套查询的简单介绍和基础配置

简单介绍&#xff1a; 在前一章我们介绍了关于MyBatis的多表查询的时候的对应关系&#xff0c;其中有三种对应关系&#xff0c;分别是一对一&#xff0c;一对多&#xff0c;多对多的关系。如果忘记了这三种方式的对应形式可以去前面看看&#xff0c;一定要记住这三种映射关系的…

项目重构,从零开始搭建一套新的后台管理系统

背景 应公司发展需求&#xff0c;我决定重构公司的后台管理系统&#xff0c;从提出需求建议到现在的实施&#xff0c;期间花了将近半个月的时间&#xff0c;决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的&#xff0c;没有考虑到后期的扩展性&#xf…

逆风翻盘拿下感知实习offer,机会总是留给有准备的人

个人背景211本&#xff0c;985硕&#xff0c;本科是计算机科学与技术专业&#xff0c;研究生是自学计算机视觉方向&#xff0c;本科主要做C和python程序设计开发&#xff0c;java安卓开发&#xff0c;研究生主要做目标检测&#xff0c;现在在入门目标跟踪和3d目标检测。无论文&…

并发编程学习篇从0-1合集

一、synchronized 一、原子性、有序性、可见性 1.1 原子性 数据库的事务&#xff1a;ACID A&#xff1a;原子性-事务是一个最小的执行的单位&#xff0c;一次事务的多次操作要么都成功&#xff0c;要么都失败。 并发编程的原子性&#xff1a;一个或多个指令在CPU执行过程中…

用Python获取弹幕的两种方式(一种简单但量少,另一量大管饱)

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…

怎么从零开始学黑客,黑客零基础怎么自学

很多朋友对成为黑客很感兴趣&#xff0c;很大原因是因为看到电影中黑客的情节觉的特别的酷&#xff0c;看到他们动动手指就能进入任何系统&#xff0c;还有很多走上黑客之路的朋友仅仅是因为自己的qq被盗了&#xff0c;或者游戏里的装备被别人偷了&#xff0c;想要自己盗回来&a…

听车企做开发朋友说,面试Framework 必问~

近期听在车企工作的朋友说&#xff0c;今年去他们公司面试的人比往年增长了30%左右&#xff0c;但实际面试达到标准的人屈指可数&#xff0c;大多都是从 Android 开发方向转过来的。 车企招聘要求有哪些&#xff1f; 每个车企因为业务部门的不同&#xff0c;他们的要求也会有…