Mybatis之if语句
以一个Demo 来方便大家理解
需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询
1.编写接口类
//需求1
List<Blog> queryBlogIf(Map map);
2.编写SQL语句
<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>
**注意:**这里的refid是引用的意思,< sql ></ sql>标签内可以写sql语句,用refid可以引用上面的sql语句,就像调用函数一样。
有时候,我们可能会将一些功能抽取出来,方便公 共调用
- 使用SQL标签抽取公共部分
- 在需要使用的地方 使用include标签引用即可
3.测试
@Test
public void queryBlogIf(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap hashMap = new HashMap();
hashMap.put("author","冷丁");
List<Blog> blogs = mapper.queryBlogIf(hashMap);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession.close();
}
这样写我们可以看到,如果 author 等于 null,那么查询语句为 select * from user where title=#{title},但是如果title为空呢?那么查询语句为 select * from user where and author=#{author},这是错误的SQL 语句,如何解决呢?请看下面的 where 语句!
Mybatis where标签
修改上面的SQL语句
<select id="queryBlogIf" parameterType="map" resultType="blog">
select * from blog
<where>
<if test="title != null">
title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</where>
</select>
如果匹配的第一个sql语句前面有and 则会where标签会智能的把and去掉