MyBatis中用于实现动态SQL的元素主要有:
if
select * from tb_emp where 1=1
and deptno=#{deptno}
and ename=#{ename}
代码含义:如果提供了deptno参数,那么就满足条件deptno=#{deptno};如果提供了ename参数,那么就满足条件ename=#{ename},最终返回的就是满足这些条件的所有的Emp。
choosechoose通常都是与when和otherwise搭配使用:when元素表示当when中的条件满足的时候执行的内容。当所有的条件都不满足的时候就输出otherwise中的内容。
select * from tb_emp where 1=1
and deptno=#{deptno}
and ename=#{ename}
and hiredate>#{hiredate}
代码含义:当deptno!=null的时候就输出and deptno=#{deptno},不再执行下面的条件判断;当deptno为空且ename!=null的时候,就输出and ename=#{ename};当所有条件都不满足的时候就输出and hiredate>#{hiredate}中的内容。
示例:模拟if-else结构
update tb_city
set `name`=#{name,jdbcType=VARCHAR},
priority=#{priority,jdbcType=INTEGER},
province_id=#{provinceId,jdbcType=BIGINT},
`state`=#{state,jdbcType=INTEGER}
where id = #{id,jdbcType=BIGINT}
insert into tb_city (`name`, priority, province_id, `state`)
values (#{name,jdbcType=VARCHAR}, #{priority,jdbcType=INTEGER}, #{provinceId,jdbcType=BIGINT}, #{state,jdbcType=INTEGER})
where
用来简化SQL语句中where的条件判断。如果所有的条件都不满足,那么MyBatis就会查出所有的记录;如果输出后是and 开头的,MyBatis会把第一个and忽略;当然如果是or开头的,MyBatis也会把它忽略;此外,对于where元素中的空格问题,MyBatis也会智能的帮我们加上。
select * from tb_emp
and deptno=#{deptno}
and ename=#{ename}
说明: 如果deptno=null且ename!=null,那么输出的整个语句会是select * from tb_emp where ename= #{ename},而不是select * from tb_emp where and ename= #{ename},因为MyBatis会智能的把第一个and或or给忽略掉。
trim可以在它自己包含的内容前加上某些前缀或后缀,对应的属性是prefixOverrides和suffixOverrides。
select * from tb_emp
and deptno=#{deptno}
and ename=#{ename}
上面代码中的prefixoverride是去掉第一个and。属性说明 :
- prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容
- 如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。
- 如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。
在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。
update tb_emp
ename=#{ename},
sal=#{sal}
where empno=#{empno}
foreach
它可以在SQL语句中迭代一个集合,主要用于构建in条件。foreach元素的属性主要有item、index、collection、open、separator、close,其中:
- item:指对集合迭代时,当前迭代到的元素的别名。
- index:用于表示在迭代过程中,每次迭代到的位置。
- open:表示该语句以什么开始。
- separator:被迭代的元素之间以什么符号作为分隔符。
- close表示以什么结束。
- collection:该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
-
如果传入的是单参数且参数类型是一个List的时候,其值为list;
select * from tb_emp where empno in #{item}
-
如果传入的是单参数且参数类型是一个array数组的时候,其值为array;
select * from tb_emp where empno in #{item}
-
如果传入的参数是多个的时候,我们需要将这些封装成一个Map
select * from tb_emp where empno in #{item}
-