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 ...
随机推荐
- template package (godoc 翻译)
template 包 概述(Overview) template 包实现了数据驱动模板用于生成文本输出. 要生成HTML输出,请参阅html/template包,它具有与此包相同的接口,但会自动保护H ...
- tornado 学习笔记
import tornado.ioloop import tornado.web class MainHanlwe(tornado.web.RequestHandler): def get(self) ...
- Java自己动手写连接池一
自己动手写连接池,废话不多说,直接上代码,读取配置文件 package com.kama.cn; import java.io.IOException;import java.io.InputStre ...
- java inputstream to string stack overflow
https://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string 过千赞的答案
- Scrum And Teamwork
Scrum Learning 概念 Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scrum主管 ...
- leetcode — linked-list-cycle-ii
/** * Source : https://oj.leetcode.com/problems/linked-list-cycle-ii/ * * Given a linked list, retur ...
- Python day 6(3) Python 函数式编程1
一:函数式编程概念 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...
- Nginx: http 跳转 https
参考:博文 参考:HTTP 状态码解读 Nginx - rewrite 方式 Nginx Server 配置 server { listen ; server_name www.test.com te ...
- python正则详解
正则表达式概述 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的 ...
- JQuery.lazyload 图片延迟加载
1.引入 jquery.lazyload.js 2. 延时加载的方式 <script type="text/javascript"> $(function() { ...