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.hqwc.cn/news/65791.html

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

相关文章

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能&#xff0c;有两种思路&#xff0c;作为一个框架是否可以通过框架实现截屏&#xff0c;另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后&#xff0c;本文优先探索使用 Electron 实现截屏…

2023年10款常用的Mac工具合集

Typora Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器&#xff0c;与其他 Markdown 编辑器不同的是&#xff0c;Typora 没有采用源代码和预览双栏显示的方式&#xff0c;而是采用所见即所得的编辑方式&#xff0c;实现了即时预览的功能&#xff0c;但也可切换至源代…

通达OA SQL注入漏洞【CVE-2023-4165】

通达OA SQL注入漏洞【CVE-2023-4165】 一、产品简介二、漏洞概述三、影响范围四、复现环境POC小龙POC检测工具: 五、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损…

Offset Explorer

Offset Explorer 简介下载安装 简介 Offset Explorer&#xff08;以前称为Kafka Tool&#xff09;是一个用于管理和使Apache Kafka 集群的GUI应用程序。它提供了一个直观的UI&#xff0c;允许人们快速查看Kafka集群中的对象以及存储在集群主题中的消息。它包含面向开发人员和管…

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …

【设计模式】观察者模式

观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时&#xff0c;则使用观察者模式&#xff08;Observer Pattern&#xff09;。比如…

VR全景乡村旅游浇灭乡愁,近距离体验自然之美

说起乡愁&#xff0c;可能每位漂泊的游子都有所感受&#xff0c;在外漂泊数十载&#xff0c;每到佳节倍思亲&#xff0c;家乡的一草一木都浮现在脑海中&#xff0c;满载着儿时的回忆。为了留住那抹儿时回忆&#xff0c;VR全景助力数字化乡村建设。 乡村振兴是国家的重大战略&am…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

运维监控学习笔记2

硬件监控&#xff1a; 1&#xff09;使用IPMI 2&#xff09;机房巡检 路由器和交换机&#xff1a; 使用SNMP&#xff08;简单网络管理协议&#xff09;进行监控。 Linux 安装snmp&#xff1a; yum install -y net-snmp net-snmp-utils 说明&#xff1a;net-snmp是安装在snm…

在CMamke生成的VS项目中插入程序

在主文件夹的CMakeLists.tex中加入SET(COMPILE_WITH_LSVM OFF CACHE BOOL "Compile with LSVM") 再添加IF(COMPILE_WITH_LSVM) MESSAGE("Compiling with: LSVM") ADD_DEFINITIONS(-DCOMPILE_WITH_LSVM) ADD_SUBDIRECTORY(LSVM) LIST(APPEND SRC LSVM_wrap…

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: &#xff08;1&#xff09;赋值运算符左侧的[ ]用于批量声明变量&#xff0c;右侧数组的单元值将被赋…

《Zookeeper》源码分析(九)之选举通信网络

在上一篇文章中讲到QuorumCnxManager&#xff0c;它负责zookeeper服务器在选举期间最底层的网络通信&#xff0c;整个网络涉及到的类如下&#xff1a; 整个网络建立的过程如下&#xff1a; 选举前创建好QuorumCnxManager实例&#xff0c;并在QuorumCnxManager构造函数中创建好…