MyBatis 中传递多个参数的 4 种方式
方式 1 :封装成对象入参 #{对应实体类的属性}
//UserMapper.java 接口 /**
* 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参)
* @param user 对象入参
* @return
*/
public List<User> getUserListByUserNameAndUserRole(User user); //UserMapper.xml SQL 映射文件 <!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表 (参数:对象入参); 参数传递:#{属性名}(参数对象中的属性名) -->
<select id="getUserListByUserNameAndUserRole" resultType="user" parameterType="user">
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{userName},'%') AND userRole=#{userRole}
</select> //单元测试类 UserMapperTest.java
@Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参)
public void testGetUserListByUserNameAndUserRole() {
List<User> userList = null;
User user = new User();
user.setUserName("孙");
user.setUserRole(3);
userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(user);
for (User u : userList) {
System.out.println(u);
}
}
说明:1、parameterType 使用了复杂数据类型,把条件参数封装成 User 对象进行入参。 2、#{属性名}里面的名称对应的是 User 实体类里面的成员属性。
方式 2 :封装成 Map 对象入参 #{对应的是 Map 里面的 key 名称}
//UserMapper.java 接口
/**
* 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:Map 对象入参)
* @param userMap Map 对象入参
* @return
*/
public List<User> getUserListByUserNameAndUserRole(Map<String, Object> userMap);
//UserMapper.xml SQL 映射文件
<!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表 (参数:Map 对象入参); 参数传递:#{Map 的 key} -->
<select id="getUserListByUserNameAndUserRole" resultType="user" parameterType="map">
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{uName},'%') AND userRole=#{uRole}
</select>
//单元测试类 UserMapperTest.java
@Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:Map 对象入参)
public void testGetUserListByUserNameAndUserRole() {
List<User> userList = null; Map<String, Object> userMap=new HashMap<String, Object>();
userMap.put("uName", "孙");
userMap.put("uRole", 3);
userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userMap);
for (User u : userList) {
System.out.println(u);
}
}
说明:Map 传参比较灵活,不管什么类型参数,或者多少个参数,都可以吧它封装成 Map 数据结构进行入参,通过 Map 的 key 即可获取传入的值。
方式 3 :使用 @Param 注解实现多参数入参 #{对应 @param 注解里面的值}
//UserMapper.java 接口
/**
* 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参)
* @param userName 用户名称
* @param userRole 用户角色
* @return
*/
public List<User> getUserListByUserNameAndUserRole(@Param("name")String userName,@Param("role")int userRole);
//UserMapper.xml SQL 映射文件
<!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参); 参数传递:#{对应 @param 注解里面的值}-->
<select id="getUserListByUserNameAndUserRole" resultType="user" >
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{name},'%') AND userRole=#{role}
</select>
//单元测试类 UserMapperTest.java
@Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:@Param 注解入参)
public void testGetUserListByUserNameAndUserRole() {
List<User> userList = null;
String userName="孙";
int userRole=3;
userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userName, userRole);
for (User u : userList) {
System.out.println(u);
}
}
说明:
1、使用 @param 注解直接实现多参数入参,代码可读性高,可以清晰地看出这个接口方法所需的参数是什么。
2、使用 @param 注解直接实现多参数入参,相当于将参数重命名为注解名称,在映射的 SQL 中需要使用 #{注解名称} 。
3、在 MyBatis 中参数入参,何时需要封装成对象入参,何时又需要使用多参数入参(即 @param 注解入参)?
答:一般情况下,超过 4 个以上的参数最好封装成对象入参(特别是在常规的增加和修改操作时,字段较多,封装成对象比较方便)。
对于参数固定的业务方法,最好使用多参数入参,原因是这种方法比较灵活,代码的可读性高,可以清晰地看出接口方法中所需的参数是什么。并且对于固定的接口方法,参数一般是固定的,所以直接多参数入参即可,无须封装对象。
需要注意的是,当参数为基础数据类型时,不管是多参数入参,还是单独的一个参数入参,都需要使用 @Param 注解来进行参数的传递。
方式 4 :使用下标传参 #{对应传入参数的顺序,下标从 0 开始}
//UserMapper.java 接口
/**
* 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参)
* @param userName 用户名称
* @param userRole 用户角色
* @return
*/
public List<User> getUserListByUserNameAndUserRole(String userName,int userRole);
//UserMapper.xml SQL 映射文件
<!--多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参); 参数传递:#{对应传入参数的顺序,下标从 0 开始}-->
<select id="getUserListByUserNameAndUserRole" resultType="user" >
SELECT * FROM smbms_user WHERE userName LIKE CONCAT('%',#{0},'%') AND userRole=#{1}
</select>
//单元测试类 UserMapperTest.java
@Test // 测试多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:使用下标传参)
public void testGetUserListByUserNameAndUserRole() {
List<User> userList = null;
String userName="孙";
int userRole=3;
userList = session.getMapper(UserMapper.class).getUserListByUserNameAndUserRole(userName, userRole);
for (User u : userList) {
System.out.println(u);
}
}
说明:#{ }里面的数字代表你传入参数的顺序,下标从 0 开始。
MyBatis 中传递多个参数的 4 种方式的更多相关文章
- Mybatis传递多个参数的4种方式(干货)
Mybatis传递多个参数的4种方式(干货)-----https://blog.csdn.net/youanyyou/article/details/79406486
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- Mybatis中传递多个参数的方法总结
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- Mybatis传递多个参数的几种方式
顺序传参法 public User selectUser(String name, int deptId); <select id="selectUser" resultMa ...
- mybatis中mapper接口的参数设置几种方法
方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...
- MyBatis 示例-传递多个参数
映射器的主要元素: 本章介绍 select 元素中传递多个参数的处理方式. 测试类:com.yjw.demo.MulParametersTest 使用 Map 传递参数(不建议使用) 使用 MyBat ...
- Delphi过程函数传递参数的几种方式
Delphi过程函数传递参数的几种方式 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out. 另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 proced ...
- asp传递参数的几种方式
把下列代码分别加入a.asp和b.asp的<body></body>中,点提交,就可以将a.asp文本框的内容传给b.asp并显示出来 a.ASP <form actio ...
- Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)
Dojo中想要加载自定义的AMD模块,需要先设置好这个模块对应的路径,模块的路径就是这个模块的唯一标识符. 一.dojoConfig参数设置详解 var dojoConfig = { baseUrl: ...
随机推荐
- 第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
Leetcode315 题意很简单,给定一个序列,求每一个数的右边有多少小于它的数. O(n^2)的算法是显而易见的. 用普通的线段树可以优化到O(nlogn) 我们可以直接套用主席树的模板. 主席树 ...
- 【单独编译使用WebRTC的音频处理模块 - android】
更新 [2015年2月15日] Bill 这段时间没有再关注 WebRTC 以及音频处理的相关信息,且我个人早已不再推荐单独编译 WebRTC 中的各个模块出来使用.实际上本文的参考价值已经很小了,甚 ...
- CI CD系统整合
转载_CI 系统搭建:Git.Gerrit与Jenkins 2014-08-11 20:55 15678人阅读 评论(1) 收藏 举报 分类: 软件集成和项目管理(3) 目录(?)[+] 去年写的这五 ...
- Java方式 MySQL数据库连接
JDBC-ODBC : 桥连就是将对JDBC API的调用转换为对另一组数据库连接(即 ODBC) API 的调用 JDBC-ODBC桥连方式驱动类是: sun.jdbc.odbc.JdbcOdbcD ...
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】
bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即 ...
- python实现对某招聘网接口测试获取平台信息
"""通过接口测试的技术获取某招聘网平台的资料"""url = "https://www.lagou.com/jobs/posit ...
- 计算几何值平面扫面poj2932 Coneology
Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4097 Accepted: 859 Descript ...
- ACM_物品分堆(01背包)
物品分堆 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个物品,物品i的重量为Wi,现在想要把这个n个物品分类两堆,求最小的 ...
- jQuery学习笔记(2)-选择器的使用
一.选择器是什么 有了jQuery的选择器,我们几乎可以获取页面上任意一个或一组对象 二.Dom对象和jQuery包装集 1.Dom对象 JavaScript中获取Dom对象的方式 <div i ...
- HTML空格占位
它叫不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的 ...