mybatis动态sql
一,mybatis 动态sql
1) mybatis 的动态sql可以对查询条件进行预编译,生成比较灵活的sql语句
二,常用标签
1)if :判断传入参数
<if test="oIp != null"> <!--test里面是判断条件, oIp 是传入对象中的成员变量 -->
o_ip, <!-- 这里是条件成立要添加的内容 -->
</if>
2)where :
select * from
sys_inf_user
<where>
<if test="oId != null">
o_id = #{oId}
</if>
<if test="oIp != null">
and o_ip = #{oIp}
</if>
</where>
<!--
用于where处,当其中只有部分条件满足时,会去除条件前面的 and 或者 or
(例如下面的第一个条件不满足,那么sql语句就变成select * from sys_inf_user
where o_ip = #{oIp}),当全部
条件都不满足的时候,会查出全部结果,就相当于select * from sys_inf_user
where 1=1
-->
3)set :
update sys_inf_user
<set>
<if test="uName != null">
u_name =#{uName},
</if>
<if test="">
u_pwd =#{uPwd},
</if>
where u_id = #{uId}
</set>
<!--
一般用于set位置 ,当全部条件不满时,会报错,当部分条件满足时
会去除条件后面的 ',' 符号;例如下面条件都满足时:sql是: (
update sys_inf_user u_name =#{uName},u_pwd =#{uPwd}
where u_id = #{uId}); 可以看出已经去掉了#{uPwd}后面的,符号;
当下面条件只满足一个时,也会去除尾部的,符号;
-->
4)trim :
<!-- trim 可以定义规则
prefixOverrides :表示要去除的前置内容
prefix : 表示要添加的开始内容
suffix : 表示要添加的结束内容
suffixOverrides :表示要去除的后置内容
-->
<trim prefixOverrides="and | or" prefix="(" suffix=")" suffixOverrides=",">
</trim>
<!-- trim 的经典实现
set 标签 :
set标签等效于:
<trim prefix ="set " suffixOverrides=",">
</trim>
where 标签:
<trim prefixOverrides="and | or" prefix="where ">
</trim>
-->
5)foreach :
<!--
collection :传入参数名, List类型写:list 数组类型写:array map类型写 : 具体key(参考下面foeach遍历map)
item : 表示在迭代过程中每一个元素的别名
index :表示在迭代过程中每次迭代到的位置(下标)
open :前缀
close :后缀
separator :分隔符,表示迭代时每个元素之间以什么分隔
-->
<foreach collection="list" open="(" index="index" item="item" close=")" separator=",">
#{item}
</foreach>
三,foreach 使用
1)批量添加(传入list,list里包含对象)
1.准备数据:
命名不规范,只为示例;
ArrayList<Object> list = new ArrayList<>();
Test test = new Test();
test.setName("wangwu");
test.setPwd("123");
test.setDizhi("北京");
test.setDianhua("123456789");
Test test2 = new Test();
test2.setName("lisi");
test2.setPwd("123456");
test2.setDizhi("北京,shanghi");
test2.setDianhua("123456789");
list.add(test);
list.add(test2);
int i=testMapper.addTestLists(list);
2.接口
int addTestLists(ArrayList<Object> list);
3.sql
<insert id="addTestLists" parameterType="java.util.List">
insert into
sys_test
(name,pwd,dianhua,dizhi)
values
<foreach collection="list" separator="," index="index" item="item">
(#{item.name},#{item.pwd},#{item.dianhua},#{item.dizhi})
</foreach>
</insert>
2)批量删除
1.准备数据:
List<Integer> list = new ArrayList<Integer>();
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
int i=testMapper.deleteTest(list);
2.接口:
int deleteTest(List<Integer> list);
3.sql :
<delete id="deleteTest" parameterType="java.util.List">
delete from
sys_test
where id in
<foreach collection="list" open="(" close=")" separator="," index="index" item="item">
#{item}
</foreach>
</delete>
3)foreach遍历map
1)数据准备
Map<Object, Object> hashMap = new HashMap<>(); hashMap.put("id1", 2); hashMap.put("id2", 10); int i=testMapper.deleteTests(hashMap);
2)接口
int deleteTests(@Param(value="maps")Map<Object, Object> hashMap);
3)sql
<delete id="deleteTests" parameterType="java.util.Map"> delete from sys_test where id in <foreach collection="maps.values" open="(" close=")" separator="," index="index" item="item"> #{item} </foreach> </delete>