mybatis标签之——<trim>及 <foreach collection>
https://www.cnblogs.com/zjfjava/p/8882614.html
trim标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能。
trim属性主要有以下四个
- prefix:前缀覆盖并增加其内容
- suffix:后缀覆盖并增加其内容
- prefixOverrides:前缀判断的条件
- suffixOverrides:后缀判断的条件
例如在update中

<update id="updateByPrimaryKey" parameterType="Object">
update student set
<trim suffixOverrides="," >
<if test="name != null ">
NAME=#{name},
</if>
<if test="hobby != null ">
HOBBY=#{hobby},
</if>
</trim> where id=#{id}
</update>

如果name和hobby的值都不为空的话,会执行如下语句
update student set NAME='XX',HOBBY='XX' /*,*/ where id='XX'
会忽略最后一个“,” ;
在select中

<select id="selectByNameOrHobby" resultMap="BaseResultMap">
select * from student
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="name != null and name.length()>0"> AND name=#{name}
</if>
<if test="hobby != null and hobby.length()>0"> AND hobby=#{hobby}
</if>
</trim>
</select>

如果name和hobby的值都不为空的话,会执行如下语句
select * from user WHERE /*and*/ name = ‘xx’ and hobby= ‘xx’
会为<trim>片段添加 "WHERE" 前缀,并忽略第一个 “and” ;
当然,避免出现“WHERE AND”还有其他方法,如下

<!--将where提取出来,并加上“1=1”的查询条件 -->
select * from student
where 1=1
<trim suffixOverrides=",">
<if test="name != null and name != ''">
and NAME = #{name}
</if>
<if test="hobby != null and hobby != ''">
and HOBBY = #{hobby}
</if>
</trim>

用在insert中

<insert id="insert" parameterType="Object">
insert into student <trim prefix="(" suffix=")" suffixOverrides="," >
<if test="name != null ">
NAME,
</if>
<if test="hobby != null ">
HOBBY,
</if>
</trim> <trim prefix="values(" suffix=")" suffixOverrides="," >
<if test="name != null ">
#{name},
</if>
<if test="hobby != null ">
#{hobby},
</if>
</trim>
</insert>

可以为生成格式正确的insert语句。
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
1 <select id="dynamicForeachTest" parameterType="java.util.List" resultType="Blog">
2 select * from t_blog where id in
3 <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
4 #{item}
5 </foreach>
6 </select>
上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);
测试代码:

1 @Test
2 public void dynamicForeachTest() {
3 SqlSession session = Util.getSqlSessionFactory().openSession();
4 BlogMapper blogMapper = session.getMapper(BlogMapper.class);
5 List ids = new ArrayList();
6 ids.add(1);
7 ids.add(3);
8 ids.add(6);
9 List blogs = blogMapper.dynamicForeachTest(ids);
10 for (Blog blog : blogs)
11 System.out.println(blog);
12 session.close();
13 }

2.单参数array数组的类型:
1 <select id="dynamicForeach2Test" parameterType="java.util.ArrayList" resultType="Blog">
2 select * from t_blog where id in
3 <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
4 #{item}
5 </foreach>
6 </select>
上述collection为array,对应的Mapper代码:
public List dynamicForeach2Test(int[] ids);
对应的测试代码:

1 @Test
2 public void dynamicForeach2Test() {
3 SqlSession session = Util.getSqlSessionFactory().openSession();
4 BlogMapper blogMapper = session.getMapper(BlogMapper.class);
5 int[] ids = new int[] {1,3,6,9};
6 List blogs = blogMapper.dynamicForeach2Test(ids);
7 for (Blog blog : blogs)
8 System.out.println(blog);
9 session.close();
10 }

3.自己把参数封装成Map的类型
1 <select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
2 select * from t_blog where title like "%"#{title}"%" and id in
3 <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
4 #{item}
5 </foreach>
6 </select>
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List dynamicForeach3Test(Map params);
对应测试代码:
@Test
public void dynamicForeach3Test() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
final List ids = new ArrayList();
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(6);
ids.add(7);
ids.add(9);
Map params = new HashMap();
params.put("ids", ids);
params.put("title", "中国");
List blogs = blogMapper.dynamicForeach3Test(params);
for (Blog blog : blogs)
System.out.println(blog);
session.close();
}
<insert id="insert" parameterType="model.AttachmentTable">
insert into attachment_table (id, name, logID,url)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{logid,jdbcType=INTEGER},#{url,jdbcType=LONGVARCHAR})
</insert>
<insert id="insertByBatch" parameterType="java.util.List">
insert into attachment_table (name, logID,url)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.name,jdbcType=VARCHAR}, #{item.logid,jdbcType=INTEGER},#{item.url,jdbcType=LONGVARCHAR})
</foreach>
</insert>
Mybatis多参数批量删除示例
package com.vrv.linkdood.app.workreport.demomodule.mapper;import org.apache.ibatis.annotations.Param;public interface AttachmentTableMapper {
void deleteByLogIdAndNames(@Param("logid") Integer logID, @Param("names") String[] names);
}

<delete id="deleteByLogIdAndNames">
delete from attachment_table
where logid = #{logid,jdbcType=INTEGER} AND NAME IN
<foreach collection="names" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>

Mybatis批量更新数据
<!-- 批量更新第一种方法,通过接收传进来的参数list进行循环着组装sql -->
<update id="batchUpdate" parameterType="java.util.Map">
<!-- 接收list参数,循环着组装sql语句,注意for循环的写法
separator=";" 代表着每次循环完,在sql后面放一个分号
item="cus" 循环List的每条的结果集
collection="list" list 即为 map传过来的参数key -->
<foreach collection="list" separator=";" item="cus">
update t_customer set
c_name = #{cus.name},
c_age = #{cus.age},
c_sex = #{cus.sex},
c_ceroNo = #{cus.ceroNo},
c_ceroType = #{cus.ceroType}
where id = #{cus.id}
</foreach>
</update>
属性 | 描述 |
item | 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。 |
collection |
要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。 |
separator | 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 |
open | foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。 |
close | foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 |
index | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。 |
mybatis标签之——<trim>及 <foreach collection>的更多相关文章
- mybatis标签之——<trim>
trim标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能. trim属性主要有以下四个 prefix:前缀覆盖并增加其内容 ...
- MyBatis的Mapper文件的foreach标签详解
MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据.如:使用foreach来拼接in子语句. 在学习MyBatis M ...
- 谈一下思考,关于mybatis中<foreach collection="list">中list得来的原因 没看到官方说明
<foreach> 是在sql语句中进行多个id查询 时用到的,因为mybatis代替jdbc和hibernate, 使用 在xml文件中编写sql语句,这是一个标签文件.然后在 dao层 ...
- mybatis 中 foreach collection的三种用法(转)
文章转自 https://blog.csdn.net/qq_24084925/article/details/53790287 oreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集 ...
- MyBatis之ResultMap的association和collection标签(一)
1.先说resultMap比较容易混淆的点, 2. Map结尾是映射,Type是类型 resultType 和restltMap restulyType: 1.对应的是java对象中的属性,大小写不 ...
- mybatis foreach collection
原文传递:https://blog.csdn.net/qq_24084925/article/details/53790287 foreach元素的属性主要有 item,index,collectio ...
- mybatis 中 foreach collection的三种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- MyBatis:SQL语句中的foreach标签的详细介绍
foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面 foreach元素的属性主要有 item,index,collection,open,separator,close. 分别 ...
- Mybatis 中 foreach collection 的三种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
随机推荐
- 新加坡金融科技节 | 蚂蚁金服CTO程立:面向全球开放,与合作伙伴共赢
小蚂蚁说: 11月13日,在新加坡金融科技节上,蚂蚁金服CTO程立分别从TechFin.BASIC战略.SOFAStack全栈分布式体系以及全面开放等方面讲述蚂蚁金融科技. TechFin是一种“倒立 ...
- NET Core 指令启动
ASP.NET Core 是新一代的 ASP.NET,早期称为 ASP.NET vNext,并且在推出初期命名为ASP.NET 5,但随着 .NET Core 的成熟,以及 ASP.NET 5的命名会 ...
- springmvc处理过程理解(一)
DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以通过xml配置方式,注解方式) H ...
- linux 环境下如何完全卸载postgres
完全删除postgres 小笔记: 1.查看版本号和系统类别:cat /etc/redhat-realease; 2.如果是redhat:(yum install) a.yum 删除软件包: yum ...
- redux与redux-react使用示例
redux使用 <script type="text/babel"> var Counter=React.createClass({ incrementIfOdd:fu ...
- Codeforces E - Connected Components?
E - Connected Components? 思路: 补图bfs,将未访问的点存进set里 代码: #include<bits/stdc++.h> using namespace s ...
- Python Selenium 文件上传之Autoit
今天补充一种文件上传的方法 主要是因为工作中使用SendKeys方法不稳定,具体方法见: Python Selenium 文件上传之SendKeys 这种方法直接通过命令行执行脚本时没有问题,可以成功 ...
- python中的异常处理tryexcept
1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 2.异常种类 names = ['张三','李四 ...
- WmiPrvSe.exe 的 cpu 占用
经常会看到这个进程cpu升上去,然后播放视频卡顿,鼠标移动卡顿. 1) 首先怀疑公司的Mcafee, 然后竟然检索除了一篇文章,MCafee表示不背锅. 2)找到这篇文章,微软表示,不能看表面,你得查 ...
- ROC曲线(receiver-operating-characteristic curve)-阈值评价标准(转)
转自:http://blog.csdn.net/abcjennifer/article/details/7359370 ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver ope ...