mybatis的mapper接口需要和mapper映射文件进行关联,上一节已经展示接口方法的返回值是如何和mapper映射文件的resultType进行映射。这一节主要讲解接口方法的参数如何与映射文件进行关联。由于映射文件的id(及就是接口方法名称)是唯一的,因此在java代码中,方法重载不能使用。方法重载时方法名称可以相同,但是在mapper映射文件中的id是不可以有相同的。

思考下,接口方法中的参数可能有 如下几种。

  • 单个参数
  • 多个参数

由于每次建立工程比较复杂,可以参考第一节:mybatis入门来搭建一个简单的工程,然后来测试本节内容。

1、单个参数


第一节:mybatis入门测试的接口就是使用单个参数,其中mapper接口方法如下:

public interface PersonMapper
{
Person getPerson(Integer id);
}

在mapper映射文件中:

<select id="getPerson" resultType="com.yefengyu.mybatis.entity.Person">
select * from person where id = #{id}
</select>

其中上面的 #{id} 中的 id,可以随便写,都不会对查询造成实质影响。

2、多个参数


新添加一个mapper接口方法。主要是根据address和age查询结果。

public interface PersonMapper
{
List<Person> getPersons(String address, Integer age);
}

然后编写mapper映射文件。

<select id="getPersons" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{address} and age > #{age}
</select>

测试

public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> personList = mapper.getPersons("beijing", 30);
System.out.println(personList);
}

结果

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'address' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'address' not found. Available parameters are [arg1, arg0, param1, param2]
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

分析:mybatis对于多个参数会特殊处理,把多个参数封装为map,key默认取值为param1, param2,依次类推,value取实际的值。

根据这个原理,我们把

<select id="getPersons" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{address} and age > #{age}
</select>

改为

<select id="getPersons" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{param1} and age > #{param2}
</select>

再次测试可以得到正常结果。

上面的方式虽然解决了多个参数的传递问题,但是对于书写和阅读都有障碍,最好是使用命名参数,指定封装map的key,实现很简单,在接口方法的参数声明处使用Param注解,指定值作为map的key.

public interface PersonMapper
{
List<Person> getPersons(@Param("address") String address, @Param("age") Integer age);
}
<select id="getPersons" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{address} and age > #{age}
</select>

这样就可以实现多个参数传递。

源码位置:org.apache.ibatis.reflection.ParamNameResolver 有兴趣可以看下源码。

3、特殊情况


1、如果是业务参数模型数据,使用POJO,接口就变为一个参数,sql中使用#{}来获取数据,#{}中使用属性名称即可获取POJO对应属性的值。

2、如果不是业务参数,但是参数很少,可以使用Param注解(上面已经提到)或者是map方式(该方式中#{}使用map的键即可获取对应键的值)。

3、如果是非业务参数比较多,就是用一个数据传输对象TO。

4、参数是Set集合,也是封装为map,其中key只能为collection。

5、参数是List集合,也是封装为map,其中key只能为collection或list。

6、参数是数组,也是封装为map,其中key只能为array。

4、关于Param注解


在java8中,反射获取方法参数名这一个特性被支持,因此在较新的mybatis版本中,如果程序开启-parameters编译选项,mapper接口那么就可以省略Param注解。

添加位置:File->Settings->Build,Execution,Deployment->Java Compiler下的Additional command line parameters选项中添加-parameters。

mybatis之参数处理的更多相关文章

  1. mybatis 传递参数的方法总结

    有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml ...

  2. 【转载】Mybatis多参数查询映射

    转载地址:http://www.07net01.com/zhishi/402787.html 最近在做一个Mybatis的项目,由于是接触不久,虽然看了一下资料,但在实际开发中还是暴 露了很多问题,其 ...

  3. MyBatis传递参数

    MyBatis传递参数 一.使用 map 接口传递参数 在 MyBatis 中允许 map 接口通过键值对传递多个参数,把接口方法定义为 : public List<Role> findR ...

  4. MyBatis传入参数为list、数组、map写法(转载)

    MyBatis传入参数为list.数组.map写法 1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item ...

  5. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入

    Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...

  6. MyBatis的参数,不能传入null

    今天在调试的过程中发现一个bug,把传入的参数写到查询分析器中执行没有问题,但是在程序中执行就报错:org.springframework.jdbc.UncategorizedSQLException ...

  7. MyBatis传入参数为list、数组、map写法

    1.foreach简单介绍: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有item,index,collection,open,sep ...

  8. mybatis中参数为list集合时使用 mybatis in查询

    mybatis中参数为list集合时使用 mybatis in查询 一.问题描述mybatis sql查询时,若遇到多个条件匹配一个字段,sql 如: select * from user where ...

  9. 【mybatis源码学习】mybatis的参数处理

    一.mybatis的参数处理以及参数取值 1.单个参数 mybatis不做任何处理 取值方式: ​ #{参数名/任意名} <!-- Employee getEmpById(Integer id) ...

  10. Mybatis传入参数类型为Map

    mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...

随机推荐

  1. python外星人入侵(游戏开发)

    实现的项目要求: 1.外星人游戏添加飞船上下移动功能: 2.为游戏添加背景音乐: 3.在玩家得分.最高得分.玩家等级前添加"Score"."High Score" ...

  2. 阿里巴巴高级Java面试题(首发,70道)

    整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害.下面题目都带超详细的解答,详情见底部. 1.java事件机制包括哪三个部分?分别介绍. 2.为什么要使用线程池? 3.线程池有什么作用 ...

  3. 深入研究浏览器对HTML解析过程

    HTML HTML解析 HTML解析是一个将字节转化为字符,字符解析为标记,标记生成节点,节点构建树的过程. 标记化算法 是词法分析过程,将输入内容解析成多个标记.HTML标记包括起始标记.结束标记. ...

  4. rabbitmq-5-案例1-简单的案例

    最简单的案例: https://gitee.com/n_zhe/rabbitmq-demo 通过简单的例子分析mq是怎样发送和拉取消息的:  quickStart中的简单案例     通过简单的案例来 ...

  5. OAuth授权登录

    一.写在前面 日常生活中,我们经常看到到一个网站时,需要登录的时候,都提供了第三方的登录,也就是说你可以使用你的微信,QQ,微博等账号进行授权登录.那么这个认证登录的东西到底是什么呢? 微信授权登录页 ...

  6. jquery 弹出框效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  7. vue 项目中使用阿里巴巴矢量图标库iconfont

    原文:https://www.jianshu.com/p/38262f18eee2 1.打开iconfont阿里巴巴官网https://www.iconfont.cn 2.新建项目(这样方便后期维护图 ...

  8. CNN基础二:使用预训练网络提取图像特征

    上一节中,我们采用了一个自定义的网络结构,从头开始训练猫狗大战分类器,最终在使用图像增强的方式下得到了82%的验证准确率.但是,想要将深度学习应用于小型图像数据集,通常不会贸然采用复杂网络并且从头开始 ...

  9. GA来源分析

    网页中广告素材分为:文字,图片和FLASH三种.针对这三种素材,2种有无参数的情况,新旧版GA收集到的结果为: 提醒:FLASH素材如果不加参数收集不到来源: 具体GA参数如下: 可参考:https: ...

  10. uORBMain.cpp学习

    uorb_main int uorb_main(int argc, char *argv[]) { if (argc < 2) { usage();                        ...