mybatis sql循环的使用
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指
定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔
符,
collection表示要循环的集合,
close表示以什么结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1.
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
4.如果传入的参数是实体类对象,该对象中有对应的要循环的集合或数组,则可以直接将collection的值写成该字段名称。
下面分别来看看上述四种情况的示例代码:
1.单参数List的类型:
<select id="dynamicForeach" resultType="Services">
select * from t_service where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach> </select>
若传入的是List<String>类型 在Mapper文件中处理过后,SQL如下:(直接引用注解中的参数名字,这样mybatis会忽略类型,按名字引入)
<select id="dynamicForeach" resultType="Services">
select * from t_services where id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);
若是传入的是的是List<String>类型的 可能会报出两个参数的异常,这时我们可以用Mybatis官方的注解@Param
public List dynamicForeach(@Param("ids")List<String> ids);
2.单参数array数组的类型:
<select id="dynamicForeach2" resultType="Services">
select * from t_service where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")"> #{item}
</foreach>
</select>
上述collection为array,对应的Mapper代码:
public List dynamicForeach2(int[] ids);
3.自己把参数封装成Map的类型:
<select id="dynamicForeach3" resultType="Services">
select * from t_service where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List dynamicForeach3(Map params);
4.传入的参数是实体类对象,该对象中有对应的要循环的集合或数组。
public List<T> findList(T entity) {
return dao.findList(entity);
}
对应的mapper可以这样使用:
<select id="findList" resultType="Services">
SELECT
<include refid="cmsServicesColumns"/>
FROM cms_Services a
<include refid="cmsServicesJoins"/>
<where> <if test="category.id != null and category.id != ''">
AND (a.category_id = #{category.id})
</if>
<if test="categoryList != null">
and
a.category_id in
<foreach item="category" collection="categoryList" open="(" separator="," close=")"> #{category.id} </foreach>
</if>
</where>
</select>
collection对应的categoryList是实体类中的List:
伪代码:
public class Services extends DataEntity<Services> { private List<Category> categoryList;// 分类编号(组)
}
另外要注意的是:foreach循环出来的实体,是可以当成实体在循环外面去调用的,即如果例4中代码写成如下这样:
<select id="findList" resultType="Services">
SELECT
<include refid="cmsServicesColumns"/>
FROM cms_Services a
<include refid="cmsServicesJoins"/>
<where> <if test="categoryList != null">
and
a.category_id in
<foreach item="category" collection="categoryList" open="(" separator="," close=")"> #{category.id} </foreach>
</if> <if test="category.id != null and category.id != ''">
AND (a.category_id = #{category.id})
</if>
</where>
</select>
则如果该实体没有传入category
依然会进入最后那一个循环中去,这点需要注意。
mybatis sql循环的使用的更多相关文章
- Mybatis sql映射文件浅析 Mybatis简介(三)
简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...
- Mybatis sql映射文件浅析 Mybatis简介(三) 简介
Mybatis sql映射文件浅析 Mybatis简介(三) 简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...
- ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>
ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...
- MyBatis SQL xml处理小于号与大于号
MyBatis SQL xml处理小于号与大于号 当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台 ...
- mybatis 参数为list时,校验list是否为空, mybatis ${}与#{}的区别,Mybatis sql in
1.mybatis 参数为list时,校验list是否为空 2. mybatis ${}与#{}的区别 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * fr ...
- SpringMVC4+MyBatis+SQL Server2014 基于SqlSession实现读写分离(也可以实现主从分离)
前言 上篇文章我觉的使用拦截器虽然方便快捷,但是在使用读串还是写串上你无法控制,我更希望我们像jdbc那样可以手动控制我使用读写串,那么这篇则在sqlsession的基础上实现读写分离, 这种方式则需 ...
- SQL循环语句 详解
SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+ ...
- mybatis sql参考
参考mybatis sql: <select id="xxx" resultType="com.xxxx.xxx.vo.xx.xx" parameterT ...
- mybatis foreach 循环 list(map)
直接上代码: 整体需求就是: 1.分页对象里面有map map里面又有数组对象 2.分页对象里面有list list里面有map map里面有数组对象. public class Page { pri ...
随机推荐
- 为什么要学ADO.NET。。。什么是ADO.NET。。。
之前学的 •只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据. •ADO.NET就是一组类库,这组类 ...
- Java 浮点型与双精度数值比较
对于双精度与浮点数之间的比较存在潜在的转化
- UWP 应用通知Notifications
之前说UWP 使用OneDrive云存储2.x api(二)[全网首发],微识别实现了上传下载的功能,那么为了给用户更上一层楼的体验,那就是在上传下载完成之后,弹出一通知Notifications. ...
- Webpack 2 视频教程 016 - Webpack 2 中生成 SourceMaps
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- java inputstream to string stack overflow
https://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string 过千赞的答案
- VS的使用插件
1. 插件安装: 1) productivity power tools:代码查看优化插件: 2) Visaul Studio Color Theme Editor 主题修改插件: 3) VS ...
- iOS学习——UI相关小结
1 StoryBoard: 在Info.plist中可以查看Main storyboard,即入口storyboard,默认为main.storyboard,可以修改为自己创建的storybo ...
- Node.js 蚕食计划(三)—— Express 启航
如果看过上一篇<Node.js 蚕食计划>,就会发现手动搭建一个 web 服务器还是比较繁琐 而 express 就是一个可以极大地提高开发效率的 web 开发框架 一.创建项目 在 ex ...
- Zabbix 监控数据库MSSqlServer
zabbix 通过ODBC连接sql server,并通过odbc 获取数据从数据库: 配置如下: 在zabbix-server端 执行下面命令: # yum -y install freetds ...
- Spring之设置Bean值
Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许通过如下几个元素为Bean实例的属性指定值: value ...