在mybatis映射器的接口中,一般在查询时需要传递一些参数作为查询条件,有时候是一个,有时候是多个。当只有一个参数时,我们只要在sql中使用接口中的参数名称即可,但是如果是多个呢,就不能直接用参数名称了,mybatis中有以下四种

第一种:使用map传递

1⃣️定义接口

 // 使用map传递多个参数进行查询
public List<Product> getByMap(Map<String, Object> paramMap);

2⃣️sql语句

 <!--第一种:通过map传递 -->
<select id="getByMap" resultType="product" parameterType="map">
SELECT * FROM product
WHERE product_name LIKE concat('%',#{name},'%') AND
CAST(product_price AS INT) > #{price}
</select>

需要注意的有:

1、parameterType参数类型为map(此处使用别名)

2、参数名称是map中的key

3⃣️查询

 /**
* 通过map传递多个参数
*
* @return
*/
public void getProductsByMap() {
System.out.println("使用map方式传递多个参数");
List<Product> products = new ArrayList<>();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "恤");
paramMap.put("price", 200);
sqlSession = MybatisTool.getSqlSession();
productMapper = sqlSession.getMapper(ProductMapper.class);
products = productMapper.getByMap(paramMap);
printResult(products);
}

4⃣️查看结果

 使用map方式传递多个参数
T恤2的价格是230元
T恤3的价格是270元
T恤4的价格是270元

这种方式的缺点是:

1、map是一个键值对应的集合,使用者只有阅读了它的键才能知道其作用;

2、使用map不能限定其传递的数据类型,可读性差

所以一般不推荐使用这种方式。

第二种:使用注解传递

1⃣️创建接口

 // 使用注解传递多个参数进行查询
public List<Product> getByAnnotation(@Param("name") String name, @Param("price") int price);

2⃣️定义sql

 <!--第二种:通过注解传递 -->
<select id="getByAnnotation" resultType="product">
SELECT * FROM product
WHERE product_name LIKE concat('%',#{name},'%') AND CAST(product_price
AS INT) >
#{price}
</select>

这种方式不需要设置参数类型 ,参数名称为注解定义的名称

3⃣️查询

 /**
* 通过注解传递多个参数
*/
public void getProductByAnnotation() {
System.out.println("使用注解方式传递多个参数");
List<Product> products = new ArrayList<>();
sqlSession = MybatisTool.getSqlSession();
productMapper = sqlSession.getMapper(ProductMapper.class);
products = productMapper.getByAnnotation("恤", 200);
printResult(products);
}

4⃣️查看结果

 使用注解方式传递多个参数
T恤2的价格是230元
T恤3的价格是270元
T恤4的价格是270元

这种方式能够大大提高可读性,但是只适合参数较少的情况,一般是少于5个用此方法,5个以上九要用其他方式了。

第三种:使用javabean传递

此中方式需要将传递的参数封装成一个javabean,然后将此javabean当作参数传递即可,为了方便,我这里只有两个参数封装javabean。

1⃣️参数封装成javabean

 /**
* 定义一个Javabean用来传递参数
*/
public class ParamBean {
public String name;
public int price; public ParamBean(String name, int price) {
this.name = name;
this.price = price;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getPrice() {
return price;
} public void setPrice(int price) {
this.price = price;
}
}

2⃣️创建接口

 // 使用JavaBean传递多个参数进行查询
public List<Product> getByJavabean(ParamBean paramBean); 

3⃣️定义sql

 <!--第三种:通过javabean传递 -->
<select id="getByJavabean" resultType="product" parameterType="paramBean">
SELECT * FROM product
WHERE product_name LIKE concat('%',#{name},'%')
AND CAST(product_price AS INT) > #{price}
</select>

需要注意的是:

1、参数类型parameterType为前面定义的javabean的全限定名或别名;

2、sql中的参数名称是javabean中定义的属性;

4⃣️查询

 /**
* 通过javabean传递多个参数
*/
public void getProductByJavabean() {
System.out.println("使用javabean方式传递多个参数");
List<Product> products = new ArrayList<>();
sqlSession = MybatisTool.getSqlSession();
productMapper = sqlSession.getMapper(ProductMapper.class);
ParamBean paramBean = new ParamBean("恤", 200);
products = productMapper.getByJavabean(paramBean);
printResult(products);
}

5⃣️查看结果

 使用javabean方式传递多个参数
T恤2的价格是230元
T恤3的价格是270元
T恤4的价格是270元 

这种方式在参数多于5个的情况下比较实用。

第四种:使用混合方式传递

假设我要进行分页查询,那么我可以将分页参数单独封装成一个javabean进行传递,其他参数封装成上面的javabean,然后用注解传递这两个javabean,并在sql中获取。

1⃣️封装分页参数javabean

 /*
* 定义一个分页的javabean
*/
public class PageParamBean {
public int start;
public int limit; public PageParamBean(int start, int limit) {
super();
this.start = start;
this.limit = limit;
} public int getStart() {
return start;
} public void setStart(int start) {
this.start = start;
} public int getLimit() {
return limit;
} public void setLimit(int limit) {
this.limit = limit;
} }

2⃣️创建接口

 // 使用混合方式传递多个参数进行查询
public List<Product> getByMix(@Param("param") ParamBean paramBean, @Param("page") PageParamBean pageBean);

可以看出此处使用javabean+注解的方式传递参数

3⃣️定义sql

 <!--第四种:混合方式传递 -->
<select id="getByMix" resultType="product">
SELECT * FROM product WHERE
product_name LIKE concat('%',#{param.name},'%') AND CAST(product_price
AS INT) >
#{param.price} LIMIT #{page.limit} OFFSET #{page.start}
</select>

只要是注解方式,就不需要定义参数类型。

4⃣️查询

 /**
* 通过混合方式传递多个参数
*/
public void getProductByMix() {
System.out.println("使用混合方式传递多个参数");
List<Product> products = new ArrayList<>();
sqlSession = MybatisTool.getSqlSession();
productMapper = sqlSession.getMapper(ProductMapper.class);
ParamBean paramBean = new ParamBean("恤", 200);
PageParamBean pageBean = new PageParamBean(0, 5);
products = productMapper.getByMix(paramBean, pageBean);
printResult(products);

5⃣️查看结果

 使用混合方式传递多个参数
T恤2的价格是230元
T恤3的价格是270元
T恤4的价格是270元

以上就是四种方式传递多个参数的实例。

MyBatis映射器(一)--多参数传递方式的更多相关文章

  1. MyBatis映射器(转载)

    什么是MyBatis映射器? MyBatis框架包括两种类型的XML文件,一类是配置文件,即mybatis-config.xml,另外一类是映射文件,例如XXXMapper.xml等.在MyBatis ...

  2. MyBatis映射器元素

     映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具,映射器中主要有增删改查四大元素,来满足不同场景的需要: 下面是主要元素的介绍:         select:查询语句 ...

  3. mybatis映射器配置细则

    前面三篇博客我们已经多次涉及到映射器的使用了,增删查基本上都用过一遍了,但是之前我们只是介绍了基本用法,实际上mybatis中映射器可以配置的地方还是非常多,今天我们就先来看看映射器还有哪些需要配置的 ...

  4. mybatis 映射器

    1 映射器 Mapper 是由java接口和 XML 文件共同组成.它的作用如下 1)定义参数类型 2)描述缓存 3)描述 SQL 语句 4)定义查询结果和POJO的映射关系 2 SqlSession ...

  5. Mybatis映射器接口代理对象的方式 运行过程

    查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 1.pom.xml <?xml version="1.0" ...

  6. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

  7. mybatis 映射器(mappers) 配置说明 加载映射文件方式

    映射器(mappers) 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了.但是首先我们需要告诉 MyBatis 到哪里去找到这些语句. Java 在自动查找这 ...

  8. Mybatis 映射器接口实现类的方式 运行过程debug分析

    查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 <?xml version="1.0" encoding= ...

  9. MyBatis拦截器:给参数对象属性赋值

    该拦截器的作用:在进行增加.修改等操作时,给数据模型的一些通用操作属性(如:创建人.创建时间.修改人.修改时间等)自动赋值. 该实现是在DAO层拦截,即存入DB前最后一层.后经分析,不是很合理,改为在 ...

随机推荐

  1. 牛客多校第六场 J Upgrading Technology dp

    题意: 有n个技能,一开始都是0级,第i个技能从j-1级升到j级,花费$c_{i,j}$,但是花费不一定是正的 所有的技能升到j级时,奖励$d_j$但是奖励也不一定是正的 题解: 用sum[i][j] ...

  2. git撤销修改及版本回退

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...

  3. vue-router使用入门

    安装及基本配置 # 安装 npm install vue-router # 使用 import Vue from 'vue' import VueRouter from 'vue-router' Vu ...

  4. Python全栈开发:模块

    模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...

  5. LoadRunner中字符串的操作

    LoadRunner中字符串的操作 LoadRunner中常用的字符串操作函数有:                strcpy(destination_string, source_string); ...

  6. 2016.10.5初中部上午NOIP普及组比赛总结

    2016.10.5初中部上午NOIP普及组比赛总结 这次的题目出得挺有质量的.但我觉得我更应该努力了. 进度: 比赛:0+20+0+0=20 改题:AC+AC+AC+AC=AK kk的作业 这题我错得 ...

  7. crontab[计划任务],tar[压缩],grep[查找]

    计划任务:1.新建一个计划任务:crontab -e -----> 3*/1 * * * * date >> /tmp/data.txt查看计划任务:crontab -l.如果超过6 ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. 【Codeforces Round #424 (Div. 2) D】Office Keys

    [Link]:http://codeforces.com/contest/831/problem/D [Description] 有n个人,它们都要去一个终点,终点位于p; 但是,在去终点之前,他们都 ...

  10. LUOGU P1342 请柬(最短路)

    传送门 解题思路 又是一道语文题,弄清楚题意之后其实就能想出来了,从1跑一遍最短路,把$dis[n]$加入答案.在建个反图跑一遍最短路,把$dis[n]_$加入最短路就行了.第一遍是去的时候,第二遍是 ...