动态Sql:查询功能,比如5个查询条件,我们不可能要求用户把5个条件全部输入才给人家查询,用户输入几个我们就应该按照几个条件进行查询,就涉及到sql语句的拼接,以往我们在拼接sql语句的时候很容易出错,稍不注意就多/少逗号、引号、and、or等等,Mybatis的动态sql机制就是为了让我们更优雅更方便的去拼接sql语句。主要是几个标签的使用
需求:根据用户性别和用户名称查询用户列表
if标签/where标签
sql片段
引用sql片段使用include标签,refid指向sql片段的id,如果共享其他mapper文件当中的sql片段,只需要refid前面加上另外一个mapper映射文件的namespace即可
foreach标签
delete from user where id in(1,2,3)
String sql = "delete from user where id in("
for(String s: list) {
sql += s + ","
}
substring
sql += ")"
需求:根据多个id来查询用户列表
select * from user where id in(1,2,3)
形式一:直接传入list集合给mybatis
形式二:直接传入数组给Mybatis
Mybatis底层别名定义类
<!--
foreach直接传入Array数组
-->
<select id="queryUserByIdsArray" parameterType="int[]" resultType="user">
select id,username,sex,birthday,address from user
<!--
foreach:遍历拼接sql语句
collection:遍历的集合,注意当直接传数组,除了知道是数组外没有别的名字,所以collection固定配置为array
open:遍历拼接前干点啥(拼接点什么字符串)
close:遍历结束后干点啥(拼接点什么字符串)
separator:遍历拼接时候使用的分隔符
item:遍历到的具体元素值,等同于下面for循环中的s
for(String s : list) {
s
}
-->
<foreach collection="array" open=" where id in(" close=")" separator="," item="item">
#{item}
</foreach>
</select>
形式三:传入一个pojo,pojo中有list或者数组
<!--
foreach直接传入pojo,pojo中封装list或者数组
-->
<select id="queryUserByIdsQueryVo" parameterType="queryvo" resultType="user">
select id,username,sex,birthday,address from user
<!--
foreach:遍历拼接sql语句
collection:遍历的集合,当传入pojo的时候,collection配置为pojo当中集合的属性名
如果不指定具体属性名,那么mybatis是不知道要取pojo哪个属性的
open:遍历拼接前干点啥(拼接点什么字符串)
close:遍历结束后干点啥(拼接点什么字符串)
separator:遍历拼接时候使用的分隔符
item:遍历到的具体元素值,等同于下面for循环中的s
for(String s : list) {
s
}
-->
<foreach collection="idsList" open=" where id in(" close=")" separator="," item="item">
#{item}
</foreach>
</select>