Mybatis使用IN语句查询

 

https://blog.csdn.net/u011781521/article/details/79669180

 

 

Mybatis使用IN语句查询

lfendo 2018-03-23 16:45:03  201525  收藏 140

分类专栏: MyBatis 文章标签: mybatis JAVA sql

版权

一、简介

 

在SQL语法中如果我们想使用in的话直接可以像如下一样使用:

select * from HealthCoupon where useType in ( '4' , '3' )

但是如果在MyBatis中的使用in的话,像如下去做的话,肯定会报错:

 

    Map<String, Object> selectByUserId(@Param("useType") String useType)<select id="selectByUserId" resultMap="BaseResultMap" parameterType="java.lang.String">select * from HealthCoupon where useType in (#{useType,jdbcType=VARCHAR})</select>
  1.  

其中useType="2,3";这样的写法,看似很简单,但是MyBatis不支持。。但是MyBatis中提供了foreach语句实现IN查询,foreach语法如下:

foreach语句中, collection属性的参数类型可以使:List、数组、map集合
​     collection: 必须跟mapper.java中@Param标签指定的元素名一样
​     item: 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样。index:表示在迭代过程中每次迭代到的位置(下标)open:前缀, sql语句中集合都必须用小括号()括起来
​     close:后缀separator:分隔符,表示迭代时每个元素之间以什么分隔
  1.  

正确的写法有以下几种写法:

 

(一)、selectByIdSet(List idList)

 

如果参数的类型是List, 则在使用时,collection属性要必须指定为 list

 

List<User> selectByIdSet(List idList);<select id="selectByIdSet" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List" />from t_userWHERE id IN<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</select>
  1.  


(二)、List<User> selectByIdSet(String[] idList)

 

如果参数的类型是Array,则在使用时,collection属性要必须指定为 array

List<User> selectByIdSet(String[] idList);<select id="selectByIdSet" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List" />from t_userWHERE id IN<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</select>
  1.  


(三)、参数有多个时

 

当查询的参数有多个时,有两种方式可以实现,一种是使用@Param("xxx")进行参数绑定,另一种可以通过Map来传参数。

 

3.1 @Param("xxx")方式

List<User> selectByIdSet(@Param("name")String name, @Param("ids")String[] idList);<select id="selectByIdSet" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List" />from t_userWHERE  name=#{name,jdbcType=VARCHAR} and id IN<foreach collection="idList" item="id" index="index"open="(" close=")" separator=",">#{id}</foreach>
</select>
  1.  

 

3.2 Map方式

Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("idList", ids);
mapper.selectByIdSet(params);<select id="selectByIdSet" resultMap="BaseResultMap">  select  <include refid="Base_Column_List" />  from t_user where name = #{name}and ID in  <foreach item="item" index="index" collection="idList" open="(" separator="," close=")">  #{item}  </foreach>  
</select>
  1.  

  • 点赞43
  • 评论

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

关于 OAuth 2.0 的相关内容&#xff0c;点击查看&#xff1a;ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统。对于支持 OpenID 的网站&#xff0c;用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是&#xff0c;他们只需要预先在一…

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

转载自 Java动态代理机制详解&#xff08;JDK 和CGLIB&#xff0c;Javassist&#xff0c;ASM&#xff09; class文件简介及加载 Java编译器编译好Java文件之后&#xff0c;产生.class 文件在磁盘中。这种class文件是二进制文件&#xff0c;内容是只有JVM虚拟机能够识别的机器码…

Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)

这两个接口进行放置emp和dept单独接口 /*** */ package org.dao;import org.entity.Dept;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;IDeptDao * 类描述&#xff1a; 部门的私有接口&#xff0c;此接口专属于部门独立的功能公共的都在IBaseDaoUt…

彻底理解JAVA动态代理

转载自 彻底理解JAVA动态代理 代理设计模式 定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构如下图所示。 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 public interface Subject { pu…

docker 安装redis 挂载到宿主机

1.首先去redis获取对应版本的配置文件redis.conf&#xff1a; http://download.redis.io/releases/ 我选择的是 6.0.9 解压以后 有一个redis.conf 2.将 bind 127.0.0.1注释&#xff0c;daemonize yes注释掉&#xff0c;如果需要redis密码则找到 requirepass 并填上你的密码 …

Servlet使用适配器模式进行增删改查案例(BaseDaoUtilImpl.java)

/*** */ package org.dao.impl;import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import org.dao.BaseDao; import org.entity.Dept; import org.entity.Emp;/*** * * 项目名称&#xff1a;test_BaseDao …

搭建consul 集群

上图是官网提供的一个事例系统图&#xff0c;图中的Server是consul服务端高可用集群&#xff0c;Client是consul客户端。consul客户端不保存数据&#xff0c;客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都…

Java类加载的那些事

转载自 Java类加载的那些事 前言 Java源代码被编译成class字节码&#xff0c;最终需要加载到虚拟机中才能运行。整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载7个阶段。 加载 1、通过一个类的全限定名获取描述此类的二进制字节流&#xff1b; …

JAVA集合(笔记)

集合简介 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进项操作的的常用方法。可实现数组的功能。和数组的区别&#xff1a; 数组长度固定&#xff0c;集合长度不固定。数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型。 位置&#xff1a; jav…

部署kafka kafka的service容器和zookeeper kafka客户端 Elasticsearch的客户端

创建network docker network create -d overlay --attachable loc_net docker stack up -c kafka.yml kafka docker stack up -c kafdrop.yml kafdrop docker stack up -c els.yml els docker stack ls docker service ls 查看service的启动错误原因 docker service ps d…

Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)

/*** */ package org.dao.impl;import java.util.List;import org.dao.IDeptDao; import org.entity.Dept;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;DeptDaoImpl * 类描述&#xff1a; 部门的实现类* 创建人&#xff1a;Mu Xiongxiong * 创建…

公司技术需求备忘录

业务现状领导要求 1) 部署环境要求: 公有云&#xff0c;私有云&#xff0c;原有院内系统。三套环境&#xff0c;兼容部署&#xff0c;一套代码多环境支持。2) 数据库要求&#xff1a;sqlserver&#xff0c;orcale&#xff0c;mysql要兼容&#xff0c;一套代码多库运行。3) 性能…

equals 和 hashCode 到底有什么联系?一文告诉你

转载自 equals 和 hashCode 到底有什么联系&#xff1f;一文告诉你 写在前面 Java的基类Object提供了一些方法&#xff0c;其中equals()方法用于判断两个对象是否相等&#xff0c;hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法&#xff0c;都可…

如何将Excel的单元格设置成下拉选项?-excel设置下拉菜单

https://www.qiaoshan022.cn/excel/excel14169.html 如何将Excel的单元格设置成下拉选项&#xff1f;-excel设置下拉菜单 作者&#xff1a;乔山办公网日期&#xff1a;2019-09-24 21:13:23 返回目录&#xff1a;excel表格制作 在用Excel表录入数据时&#xff0c;有时需要限制…

Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)

/** * Title: EmpDaoImpl.java * Package org.dao.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-10 下午8:29:32 * version V1.0 */ package org.dao.impl;import java.util.List;import org.dao.IEmpDao; i…

写一个高性能的敏感词检测组件

最近写了一个高性能的敏感词检测组件【ToolGood.Words】。 一、高性能&#xff0c;它的效率到底有多快&#xff1f; 如果将正则表达式的算法效率设为1&#xff0c;高性能可达到正则表达式的1.5万倍。 二、选一个巧妙的算法&#xff1a; AC自动机&#xff08;Aho-Corasick Autom…

JAVA正则表达式 Pattern和Matcher

转载自 JAVA正则表达式 Pattern和Matcher java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 1.简介&#xff1a; java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类&#xff1a;Pattern和Match…

win10系统excel2019单元格显示完整的年月日时分秒设置方法

https://www.pianshen.com/article/88671983757/ win10系统excel2019单元格显示完整的年月日时分秒设置方法 技术标签&#xff1a; Windows excel显示年月日时分秒 excel显示完整的详细时间 excel2019显示完整时间 excel2019显示具体时间 excel显示具体的时间 描述&#…

字符VS字节

什么是字节 字节是指一小组相邻的二进制数码。通常是8位作为一个字节。它是构成信息的一个小单位&#xff0c;并作为一个整体来参加操作&#xff0c;比字小&#xff0c;是构成字的单位。 字节(Byte) 是一种计量单位&#xff0c;表示数据量的多少&#xff0c;它是计算机信息技术…