SQL片段
将一些功能的部分抽取出来,方便复用!
- 使用SQL标签抽取公共的部分
- 在需要使用的地方使用include标签引用即可
<sql id="if-title-author">
<if test="title != null">
and title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</sql>
<select id="queryBlogIf" parameterType="Map" resultType="Blog">
select * from mybatis.blog
<where>
<include refid="if-title-author"></include>
</where>
</select>
注意点:
- 最好基于单表来定义SQL片段
- 不要存在where标签
Foreach
动态SQL的另一个常用操作需求是对一个集合进行遍历,通常是在构建IN条件语句的时候
<!--示例-->
select * from user where 1=1 and
<foreach item="id" collection="ids"
open="(" separator="or" close=")">
</foreach>
<!--
select * from mybatis.blog where 1=1 and (id=1 or id=2 or id=3)
我们现在传递一个万能的map,这map种可以存在一个集合
-->
<select id="queryBlogForeach" parameterType="Map" resultType="Blog">
select * from mybatis.blog
<where>
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id=#{id}
</foreach>
</where>
</select>
//测试
@Test
public void queryBlogForeach(){
SqlSession sqlSession = MybatisUtils.getsqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap map = new HashMap();
ArrayList<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
map.put("ids",ids);
List<Blog> blogs = mapper.queryBlogForeach(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
动态SQL语句就是在拼接sql语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就好了
建议:
- 现在Mysql中写出完整的SQL,再对应的去修改成为我们动态SQL实现即可!