李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
02.MyBatis获取参数值的两种方式
Leefs
2022-12-05 PM
1179℃
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
NLP
4
标签云
随笔
算法
Elasticsearch
Http
nginx
Stream流
前端
Kafka
链表
Filter
Beego
Spark Core
递归
Tomcat
并发编程
数据结构和算法
Eclipse
Map
Java工具类
CentOS
设计模式
Typora
ajax
VUE
人工智能
gorm
Git
FileBeat
Thymeleaf
工具
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭