一、什麼是動態SQL之if語句 if很簡單了,就是滿足條件就執行,不滿足條件不執行。 那麼動態SQL中的if語句是怎麼樣的呢? 首先我們來看一張表blog: 如果我們執行下麵的SQL語句: select * from blog 肯定會將所有的數據都查出來。那麼我們可以在後面加上where條件進行篩選 ...
一、什麼是動態SQL之if語句
if很簡單了,就是滿足條件就執行,不滿足條件不執行。
那麼動態SQL中的if語句是怎麼樣的呢?
首先我們來看一張表blog:
如果我們執行下麵的SQL語句:
select * from blog
肯定會將所有的數據都查出來。那麼我們可以在後面加上where條件進行篩選,那麼如果我們想不同的情況下執行不同的where甚至有時候多種情況一起發生怎麼辦,這時候我們就需要用到if進行判斷併進行SQL語句的拼接了,就類似於下麵這句SQL:
select * from blog where title="" and author =""
但是若果我們把tilte和author都作為if判斷中的內容,where後面豈不是什麼也沒有了,這時候我們就需要這樣來寫SQL語句:
select * from blog where 1=1 and title="" and author =""
明白了動態SQLif的基本原理,我們就去具體的實現。
二、動態SQLif語句的實現
這裡我會用四種方法來進行實現:
這四個方法的不同都是Mapper介面中的方法不同。
1.函數重載
BlogMapper介面中的方法有以下幾個:
List<Blog> QueryBlogsByIf();
List<Blog> QueryBlogsByIf(@Param("title") String title, @Param("author") String author);
BlogMapper.xml:
<select id="QueryBlogsByIf" resultType="Blog"> select * from mybaties.blog where 1=1 <if test="author != null"> and author=#{author} </if> <if test="title != null"> and title=#{title} </if> </select>
if標簽中的test就是判斷語句。
我們進行測試:
@Test public void queryBlogIf() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); List<Blog> blogList = blogMapper.QueryBlogsByIf(); for (Blog blog : blogList) { System.out.println(blog); } }
調用不傳任何參數的方法應該是查詢所有數據:
沒有問題。
接下來我們讓auto不為空:
@Test public void queryBlogIf() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); List<Blog> blogList = blogMapper.QueryBlogsByIf(null, "jms"); for (Blog blog : blogList) { System.out.println(blog); } }
結果如下:
沒有問題。
接下來我們讓auther和title都不為空
@Test public void queryBlogIf() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); List<Blog> blogList = blogMapper.QueryBlogsByIf("learn mybatis day 5", "jms"); for (Blog blog : blogList) { System.out.println(blog); } }
結果如下:
沒有問題。
到這裡我們可以發現一個問題,我們完全可以不進行函數的重構,就只用一個函數
List<Blog> QueryBlogsByIf(@Param("title") String title, @Param("author") String author);
來進行傳參,調用時只需要設定參數是否為null即可。這也就是我們講的第二個方法,單一函數通過@Param註解傳參。
2.單一函數通過@Param註解傳參
這就是對方法1的簡化與改進,在此就不多講述。
3.利用Map傳參
首先在BlogMapper介面中聲明方法:
List<Blog> QueryBlogsByIf2(Map<Object, Object> map);
在BlogMapper.xml中實現介面的方法:
<select id="QueryBlogsByIf2" parameterType="map" resultType="Blog"> select * from mybaties.blog where 1=1 <if test="author != null"> and author=#{author} </if> <if test="title != null"> and title=#{title} </if> </select>
測試:
@Test public void queryBlogIf2() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); Map<Object, Object> map = new HashMap<>(); map.put("title", "learn mybatis day 5"); map.put("author", "jms"); List<Blog> blogList = blogMapper.QueryBlogsByIf2(map); for (Blog blog : blogList) { System.out.println(blog); } }
測試結果:
沒有問題。
4.利用JavaBean
首先在BlogMapper介面中聲明方法:
List<Blog> QueryBlogsByIf3(Blog blog);
在BlogMapper.xml中實現介面的方法:
<select id="QueryBlogsByIf3" parameterType="Blog" resultType="Blog">
select * from mybaties.blog where 1=1
<if test="author != null">
and author=#{author}
</if>
<if test="title != null">
and title=#{title}
</if>
</select>
測試:
@Test public void queryBlogIf3() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); Blog blog = new Blog(); blog.setTitle("learn mybatis day 5"); blog.setAuthor("jms"); List<Blog> blogList = blogMapper.QueryBlogsByIf3(blog); for (Blog blog1 : blogList) { System.out.println(blog1); } }
測試結果:
沒有問題。
(本文僅作個人學習記錄用,如有紕漏敬請指正)