老司机学习MyBatis之如何处理参数(单个参数或者多个参数)

司机学习MyBatis之如何使用命名参数 一、前言上一节我们介绍了MyBatis单个参数多个参数递的处理方式,当我们处理多个参数递时出现了一点小问题,可以对照前一章节查看问题所在,这一节我们介绍MyBatis提供的另外一种使用注解来参入多个参数的方式,这种方式需要在接口的参数上添加@Param注解二、案例参考前面一节的代码在UserMapper.java修改查询方法findUserByIdAndUserName,如下:/** * 根... 阅读详情

一、前言

Mybatis在使用Mapper接口进行编程时,底层采用了动态代理机制,表面上是调用的Mapper接口,而实际上是通过动态代理调用的SqlSession的对应方法,其最终会获得一个代理了Mapper接口的MapperProxy对象。MapperProxy对象在调用Mapper接口方法时会把传递的参数做一个转换,然后把转换后的参数作为入参传递给SqlSession对应的操作方法(如selectOne、insert等)。转换过程可以参考MapperMethod的execute()方法实现。简单来说是以下规则:
♦单个参数:可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
♦多个参数:任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1…,值就是参数的值。
♦命名参数:为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字。
♦POJO:当这些参数属于我们业务POJO时,我们直接传递POJO。
♦Map:我们也可以封装多个参数为map,直接传递。

本节我们将介绍一下,MyBatis是如何处理单个参数和多个参数的?

二、案例

在MySQL下新建数据库表t_user,并插入一条数据

CREATE TABLE t_user (
  id int(10) NOT NULL AUTO_INCREMENT,
  loginId varchar(20) DEFAULT NULL,
  userName varchar(100) DEFAULT NULL,
  role varchar(255) DEFAULT NULL,
  note varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

INSERT INTO t_user(loginId,userName,role,note) VALUES ('queen', '奎恩', '海贼王副把手', '专门负责提鞋的。。。');
编写UserMapper.xml文件
<select id="findUserById" resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{id}
</select>
编写MyBatisTest.java测试类,新增测试方法testOneParam
@Test
public void testOneParam() throws IOException {
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	SqlSession openSession = sqlSessionFactory.openSession();
	try {
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		User user = mapper.findUserById(1);
		System.out.println(user);
	} finally {
		openSession.close();
	}
}

运行测试,控制台打印如下:

2017-08-04 23:07:28,536 [main] [com.queen.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id = ? 
2017-08-04 23:07:28,589 [main] [com.queen.mybatis.mapper.UserMapper.findUserById]-[DEBUG] ==> Parameters: 1(Integer)
2017-08-04 23:07:28,626 [main] [com.queen.mybatis.mapper.UserMapper.findUserById]-[DEBUG] <==      Total: 1
User [id=1, loginId=queen, userName=奎恩, role=海贼王副把手, note=专门负责提鞋的。。。]
其实,当你传递单个参数时,#{xxx}里面这个“xxx”无论你写什么都一样,因为只有一个参数,你可以试着修改UserMapper.xml文件中where id = #{idabcd},如下:
<select id="findUserById" resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{idabcd}
</select>

测试查询,同样可以查出数据。单个参数下,MyBatis不会做任何处理。那如果是多个参数呢?

同样是查询User信息,但是我们以ID和userName两个参数去查询,在UserMapper.java中新增查询方法,如下:

/**
* 根据ID和用户名查找用户
* @param id
* @param userName
* @return
 */
public User findUserByIdAndUserName(int id, String userName);

在UserMapper.xnl增加配置如下

<select id="findUserByIdAndUserName" resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName}
</select>

编写MyBatisTest.java测试类,新增测试方法testTwoParam

@Test
public void testTwoParam() throws IOException {
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	SqlSession openSession = sqlSessionFactory.openSession();
	try {
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		User user = mapper.findUserByIdAndUserName(1, "奎恩");
		System.out.println(user);
	} finally {
		openSession.close();
	}
}

大家想一想,当我们传递两个参数的时候,这种方式编写能成功吗?我们先试着运行一下testTwoParam方法,看啊看控制台打印何种结果?运行结果如下:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [1, 0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [1, 0, param1, param2]
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:111)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:66)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
	at com.sun.proxy.$Proxy2.findUserByIdAndUserName(Unknown Source)
	at com.queen.mybatis.MyBatisTest.testTwoParam(MyBatisTest.java:46)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
很不凑巧,大失所望,控制台报错:“Parameter ‘id’ not found. Available parameters are [1, 0, param1, param2]”,说绑定异常,参数ID没有找到,有效的参数是[1, 0, param1, param2]。这是什么意思呢?

其实MyBatis在处理多个参数的时候,MyBatis会做特殊处理,多个参数会被封装成一个map,map中是这么存值的

map.put("param1","传入的参数值1");
map.put("param2","传入的参数值2");
map.put("param3","传入的参数值3");
                  .
                  .
                  .
map.put("paramN","传入的参数值N");
#{}就是从map中获取指定的key值。

这个时候我们要将UserMapper.xml中查询方法做如下修改:

<select id="findUserByIdAndUserName" resultType="com.queen.mybatis.bean.User">
	<!--select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} -->
	select id, loginId, userName, role, note from t_user where id = #{param1} and userName=#{param2}
</select>

或者

<select id="findUserByIdAndUserName" resultType="com.queen.mybatis.bean.User">
	<!--select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} -->
	<!--select id, loginId, userName, role, note from t_user where id = #{param1} and userName=#{param2} -->
	select id, loginId, userName, role, note from t_user where id = #{0} and userName=#{1}
</select>

测试查询,控制台打印如下:

2017-08-04 23:41:38,401 [main] [com.queen.mybatis.mapper.UserMapper.findUserByIdAndUserName]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id = ? and userName=? 
2017-08-04 23:41:38,466 [main] [com.queen.mybatis.mapper.UserMapper.findUserByIdAndUserName]-[DEBUG] ==> Parameters: 1(Integer), 奎恩(String)
2017-08-04 23:41:38,503 [main] [com.queen.mybatis.mapper.UserMapper.findUserByIdAndUserName]-[DEBUG] <==      Total: 1
User [id=1, loginId=queen, userName=奎恩, role=海贼王副把手, note=专门负责提鞋的。。。]

虽然这两种方式,都能取到值,但是给人的感觉比较怪怪的,看起来跟我们平时的写法不太一样,按照大家预想where id = #{id} and userName=#{userName} 这种写法方式,是最让人舒服的。为了解决这种方式使用,MyBatis提供了命名参数的方式,在传递参数时,明确指出封装参数时map的key,这样我们在XML中就能使用where id = #{id} and userName=#{userName} 这种写法来传递参数了。


=======欢迎大家拍砖,小手一抖,多多点赞哟!=======

版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。


司机学习MyBatisMyBatis如何使用Map处理参数 一、前言如果多个参数不是业务模型中的数据,没有对应的POJO,为了方便,我们直接封装成Map入。#{key}取出map中对应的值。二、案例在UserMapper.java增加查询方法findUserByMapParam,如下:/** * 封装Map作为参数的载体 * @param user * @return */ public User findUserByMapParam(Map&l... 阅读详情

相关推荐

司机学习MyBatis之使用POJO参数

11

Java小蚂蚁 2922

MyBatis多个参数的方法以及入混合参数的获取方式

概述 Mybatis在使用Mapper接口进行编程时,其实底层是采用了动态代理机制,表面上是调用的Mapper接口,而实际上是通过动态代理调用的SqlSession的对应方法,其最终会获得一个代理了Mapper接口的MapperProxy对象。MapperProxy对象在调用Mapper接口方法时会把递的参数一个转换,然后把转换后的参数作为入参调用SqlSession对应的操作方法(如:selectOne、insert等)。 使用myBatis注解形式的SQL,则首先需要在启动类上使用@Mappe

tanghuan0827的博客 4633

pe卸载win10更新补丁_禁用Win10系统更新

众所周知,最近WIN10的强制更新导致了很多问题。如:(部分专业软件系统更新后无法使用,硬件中键盘、鼠标、指纹之类的硬件,更新补丁后失灵等问题)。而之前的禁用WindowsUpdate的方法已经失效。下面我们另辟蹊径,利用系统权限的方法使Win10无法更新,达到禁用更新的目的。1.计算机管理-服务中禁用Windows Update服务。2.打开C:\Windows\softwareDistribu...

weixin_39702479的博客 1万+

Mybatis Plus基础使用】Mapper.java多个参数

根据实际情况总结了以下几种多参数递的方法: 顺序参法。不推荐使用,参数顺序易出错 Java Bean参 Map参 @Param 注解参 顺序参法 根据Mapper.java中参数的顺序进行相应的调用 Mapper.java List<PlatformUser> selectUserPage(String creator, String userId); Mapper....

绊脚石 9811

MybatisMybatis-Plus多个参数处理

在使用MybatisMybatis-Plus开发的过程中,我们经常会遇到多个参数的场景,这时如果不加处理的话就可能报错,那么,怎么规避这些问题呢,下面分享下我在项目中的处理: 方案一、 dao层注解处理,也是最常用的一种处理方法,例如: public boolean updateBean(@Param("id")String id, @Param("code")String code); XML Mapper正常接收使用就好 <update id="updateBean"..

默慊的博客 5303

Mybatis 多个参数查询数据 (3种方法)

第一种方案 DAO层的函数方法: public User selectUser(String name,String area); 对应的Mapper.xml: <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} </select> 其中,#{0}代表接收的是dao层中的第一...

zhuyongxin_6688的博客 3163

mybatis参数处理----单个参数多个参数

文章目录mybatis 参数处理:1.单个参数2.多个参数3.select的使用(resultType)4.resultMap5 动态sql mybatis 参数处理: 1.单个参数 直接使用#{参数名称},直接取就可以了。 2.多个参数 1.param1,param2 参数少可以这样使用 java dao层代码如下 public Employee getEmpByIdAndLastName(In...

qq_39908911的博客 1509

mybatis 参数处理单个参数多个参数

1、单个参数 mybatis不做特殊处理。#{参数名}即可取出值,参数名随意取 2、多个参数 mybatis会将其封装成map, key:param1,param2,。。。paramN,或参数的索引 value:入的参数值 #{}就是从map中获取制定的key值。 例如: 接口为:public Employee getEmpByIdAndLastName(Integer id,

hamov的专栏 6565

Mybatis对各种参数处理

一. Mybatis参数处理 在正常的开发中,参数可能是单个参数,也可能是多个参数,也可能是实体类的对象,这些是较常见的,还有一些特殊的,比如参数是map键值对,是list,除了map和list之外还有其他的多个参数。 ①单个参数(Integer empId):单个参数MyBatis不会做任何特殊处理,在SQL映射文件中使用任意的参数名称都可以取得该参数多个参数(String empName,Integer pageCurrent,Integer pageSIze): 首先我们测试一下多个参数,看情况

哈哈哈 1150

mybaits返回单个sum或者count,返回多个sum或者多个count

1、我们在利用mybatis的实际开发当中,经常会需要利用SQL来统计数据,那么在在mybaits写好sql以后怎么将统计的数据返回呢?这里有两个案例。 案例一:在要返回多个sum和count的情况下。 Map<String, Object> otherProfitSum(@Param("stationId")Integer stationId, @Param("activity...

qq_36138652的博客 1万+

MyBatis参数处理

MyBatis 提供了丰富的参数处理机制,包括单个参数多个参数、对象参数和集合参数处理。通过#{}和@Param等方式,MyBatis 实现了对 SQL 语句中的参数绑定和动态 SQL 的灵活支持。合理使用 MyBatis参数处理机制,能够简化数据库操作代码,同时保持 SQL 语句的灵活性和可读性。

Flying_Fish_roe的博客 749

mybatis parametertype 多个参数

mybatis parametertype 多个参数 一、单个参数: public List<XXBean> getXXBeanList(@param("id")String id); <select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean"> ...

YunWisdom 1132

MyBatis参数处理详解

OUTINOUT参数位置支持的属性:对于单个参数mybatis不会做特殊处理,可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。。对于多个参数mybatis会做特殊处理多个参数会被封装成 一个map。key:param1…paramN,或者参数的索引也可以value:入的参数值#{}就是从map中获取指定的key的值;也可以对参数进行指定名称处理,使用指定的名称进行取值。

小小默:进无止境 1330

MyBatis多个参数的问题

一、单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean">   select t.* from tableName t where t.id...

<'_'>的博客 9715

MyBatis单个参数多个参数如何递及如何取值。

MyBatis单个参数,如果是普通类型(String+8个基本)的,取值时在#{}中可以任意指定,如果是对象类型的,则在#{}中使用对象的属性名来取值 MyBatis多个参数,默认情况下,MyBatis会对多个参数进行封装Map. 取值时 在#{}可以使用0 1 2 .. 或者是param1 param2.. MyBatis多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用 @Param() 来指定封装Map时用的key. 取值时在#{}中使用@Param..

weixin_44050355的博客 2969

MyBatis 参数上的处理的细节内容

告诉mybatis框架,我这个方法的参数类型是什么类型的,mybatis 框架自身带有类型自动推断的机制,所以大部分情况下 parameterType 属性都是可以省略不写的。其实对于Mybatis 框架来说,简单类型对于mybatis来说都是可以自动类型识别的:在MyBatis 框架当中如下,为的类型被定义为简单类型简单类型包括:String也就是说对于mybatis来说,它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。

CTZL123456的博客 1009

Mybatis查询单个参数多个参数用法

一:单个参数Mybatis不会做特殊处理 二:多个参数Mybatis会做特殊处理 1:多个多个参数时候,第一种写法如下 比如递了两个参数,用 #{param1} and #{param2}取值 2:多个多个参数时候,第二种写法如下 在接口的多个参数前分别加上@param注解 ...

小泽 2158

SAP RAP学习系列合集介绍

《SAP RAP学习系列合集:从入门到部署的完整指南》摘要: 本文介绍了作者创建的SAP RAP学习系列合集,涵盖RAP开发从基础概念到实战部署的全流程。系列目前包含17篇文章,系统讲解了RAP核心开发技术:从数据建模、UI构建到行为定义(包括并发控制、草稿功能、授权验证等),最后详细演示了应用部署到Fiori Launchpad的两种方案(OP版和ES版)。

DeveloperMrMeng的博客 1376

Arduino UNO开发板原理图

Arduino UNO开发板原理图

上一篇: 老司机学习MyBatis之mappers如何配置映射注册
下一篇: 老司机学习MyBatis之如何使用命名参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值