李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
02.MyBatis获取参数值的两种方式
Leefs
2022-12-05 PM
566℃
0条
[TOC] ### 一、获取参数值的方式 **MyBatis获取参数值的两种方式**:`${}`和`#{}` + `${}`的本质就是字符串拼接,`#{}`的本质就是占位符赋值 + `${}`使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号; + `#{}`使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。 ### 二、单个字面量类型的参数 > 若mapper接口中的方法参数为单个的字面量类型(只有一个参数值),此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值 > > 注意${}需要手动加单引号 + **#{}方式** ```xml
select * from t_user where username = #{username}
``` **注意**:映射文件中 `#{username}`的参数可以写成**任意的** ```sql select * from t_user where username = #{username} # 可以写成 select * from t_user where username = #{name} select * from t_user where username = #{abc} select * from t_user where username = #{helloworld} ``` 因为`mybatis`执行映射文件的底层代码中也不知道你的参数名叫`username`,只是一一对应。但是建议写成`username`。 + **${}方式** ```xml
select * from t_user where username = '${username}'
``` 同样`${username}`的参数可以写成**任意的**,除了数字之外。 **测试代码** > 通过参数名称查询出对应用户的信息 ```java @Test public void testGetUserByUsername(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.getUserByUsername("admin"); System.out.println(user); } ``` **运行结果** ``` DEBUG 12-05 22:54:11,034 ==> Preparing: select * from t_user where username = ? (BaseJdbcLogger.java:137) DEBUG 12-05 22:54:11,080 ==> Parameters: admin(String) (BaseJdbcLogger.java:137) DEBUG 12-05 22:54:11,106 <== Total: 1 (BaseJdbcLogger.java:137) User{id=1, username='admin', password='123456', age=22, sex='男', email='123@qq.com'} ``` 此处返回的是以`#{}`方式接收参数的测试返回结果 ### 三、多个字面量类型的参数 + **先看一种错误写法** ```xml
select * from t_user where username = #{username} and password = #{password}
``` **运行会报如下错误** ![02.MyBatis获取参数值的两种方式01.png](https://lilinchao.com/usr/uploads/2022/12/1155649245.png) 这里报错意思就是:解析配置文件的时候错误,绑定参数的时候出现异常,参数`username`没有找到。 **那么我们该如何接收参数呢?** > + 若mapper接口中的方法参数为多个时,此时`MyBatis`会自动将这些参数放在一个map集合中 > + 以`arg0`,`arg1`…为键,以参数为值; > + 以`param1`,`param2`…为键,以参数为值; > + 因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。 > + 使用`arg`或者`param`都行,要注意的是,`arg`是从`arg0`开始的,`param`是从`param1`开始的 + **通过`#{}`方式** ```xml
select * from t_user where username = #{arg0} and password = #{arg1}
``` 当然也可以写成如下方式 ```sql select * from t_user where username = #{param1} and password = #{param2} select * from t_user where username = #{arg0} and password = #{param2} select * from t_user where username = #{param1} and password = #{arg1} ``` **注意:arg和param两种方式可以混合使用,对结果没有影响** + **通过`${}`方式** ```xml
select * from t_user where username = '${param1}' and password = '${param2}'
``` `#{}`接收参数的方式对`${}`也适用。 **测试代码** > 通过用户名和密码两个参数,验证用户登录,并返回对应用户的信息 ```java @Test public void testCheckLogin(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.checkLogin("admin", "123456"); System.out.println(user); } ``` **运行结果** ``` DEBUG 12-05 23:15:20,572 ==> Preparing: select * from t_user where username = ? and password = ? (BaseJdbcLogger.java:137) DEBUG 12-05 23:15:20,618 ==> Parameters: admin(String), 123456(String) (BaseJdbcLogger.java:137) DEBUG 12-05 23:15:20,676 <== Total: 1 (BaseJdbcLogger.java:137) User{id=1, username='admin', password='123456', age=22, sex='男', email='123@qq.com'} ``` > 注意:虽然该种方式可以得到想要的结果,但是在实际工作中不建议采用该种方式,对参数可性差,并且容易造成参数对应出错问题 ### 四、Map集合类型的参数 > 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值 > > 注意${}需要手动加单引号 ```xml
select * from t_user where username = #{username} and password = #{password}
``` **测试代码** > 验证登录(参数为map),传递参数用户名和密码 ```java @Test public void testCheckLoginByMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); Map
map = new HashMap<>(); map.put("username", "admin"); map.put("password", "123456"); User user = mapper.checkLoginByMap(map); System.out.println(user); } ``` **运行结果** ``` DEBUG 12-05 23:25:17,087 ==> Preparing: select * from t_user where username = ? and password = ? (BaseJdbcLogger.java:137) DEBUG 12-05 23:25:17,133 ==> Parameters: admin(String), 123456(String) (BaseJdbcLogger.java:137) DEBUG 12-05 23:25:17,187 <== Total: 1 (BaseJdbcLogger.java:137) User{id=1, username='admin', password='123456', age=22, sex='男', email='123@qq.com'} ``` ### 五、实体类类型的参数 > 若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值 > > 注意${}需要手动加单引号 ```xml
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
``` *注意:此时的参数必须和实体类属性名称相对应,不能够在随便写* **测试代码** > 通过实体类方式,向表中添加一条用户信息 ```java @Test public void testInsertUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); int result = mapper.insertUser(new User(null, "Leefs", "123456", 23, "男", "123@qq.com")); System.out.println(result); } ``` **运行结果** ``` DEBUG 12-05 23:33:35,159 ==> Preparing: insert into t_user values(null,?,?,?,?,?) (BaseJdbcLogger.java:137) DEBUG 12-05 23:33:35,205 ==> Parameters: Leefs(String), 123456(String), 23(Integer), 男(String), 123@qq.com(String) (BaseJdbcLogger.java:137) DEBUG 12-05 23:33:35,277 <== Updates: 1 (BaseJdbcLogger.java:137) 1 ``` ### 六、使用@Param标识参数 > 可以通过`@Param`注解标识mapper接口中的方法参数,此时,会将这些参数放在map集合中 > > 1. 以`@Param`注解的value属性值为键,以参数为值; > 2. 以`param1`,`param2`…为键,以参数为值; > > 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号 + **方式一** ```xml
select * from t_user where username = #{username} and password = #{password}
``` + **方式二** ```xml
select * from t_user where username = #{param1} and password = #{param2}
``` **测试代码** > 通过用户名和密码查询对应用户相关信息 ```java @Test public void testCheckLoginByParam(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class); User user = mapper.checkLoginByParam("admin", "123456"); System.out.println(user); } ``` **运行结果** ``` DEBUG 12-05 23:45:21,451 ==> Preparing: select * from t_user where username = ? and password = ? (BaseJdbcLogger.java:137) DEBUG 12-05 23:45:21,480 ==> Parameters: admin(String), 123456(String) (BaseJdbcLogger.java:137) DEBUG 12-05 23:45:21,502 <== Total: 1 (BaseJdbcLogger.java:137) User{id=1, username='admin', password='123456', age=22, sex='男', email='123@qq.com'} ``` ### 总结 建议分成两种情况进行处理: + 实体类类型的参数 + 使用`@Param`标识参数(建议不管是传递一个参数还是多个参数,都加上该注解)
标签:
MyBatis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2666.html
上一篇
01.MyBatis核心配置文件详解
下一篇
03.MyBatis各种查询功能
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Java工具类
NIO
队列
gorm
Spark Core
Yarn
Kafka
GET和POST
数据结构
Tomcat
栈
随笔
Kibana
RSA加解密
机器学习
Python
稀疏数组
Redis
nginx
人工智能
锁
Spark SQL
查找
排序
Hadoop
Java
ajax
容器深入研究
Map
Http
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞