在上一篇if中我們已經把if和where標簽進行了學習,現在我們學習一些剩下的標簽。 一、set標簽 首先看官方文檔給出的說明: 用於動態更新語句的類似解決方案叫做 set。set 元素可以用於動態包含需要更新的列,忽略其它不更新的列。 set 元素會動態地在行首插入 SET 關鍵字,並會刪掉額外的 ...
在上一篇if中我們已經把if和where標簽進行了學習,現在我們學習一些剩下的標簽。
一、set標簽
首先看官方文檔給出的說明:
用於動態更新語句的類似解決方案叫做 set。set 元素可以用於動態包含需要更新的列,忽略其它不更新的列。
set 元素會動態地在行首插入 SET 關鍵字,並會刪掉額外的逗號(這些逗號是在使用條件語句給列賦值時引入的)。
我們不難明白set標簽是用在update語句用代替原來的set欄位,接下來我們看一下set標簽的具體應用。
1.在BlogMapper介面中聲明方法
void UpdateBySet(Map<Object, Object> map);
我這裡是通過map傳遞參數,其他傳參方式也都可以。
2.配置BlogMapper.xml文件
<update id="UpdateBySet" parameterType="map"> update mybaties.blog <set> <if test="id != null">id=#{id},</if> <if test="author != null">author=#{author},</if> <if test="views != null">views=#{views},</if> </set> where title=#{title} </update>
可以看到,這是一個動態更新的模式,會根據if語句判斷哪些更新哪些不更新。
但我們可以發現一個問題,如果我們沒有任何一個if語句成立,SQL語句就會有問題,所以我們要儘力避免這樣的事情發生。
3.測試
首先測試,只修改部分內容
@Test public void updateBySet() { 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("id", "sadafssdf42"); blogMapper.UpdateBySet(map); }
測試結果:
更新成功。
再測試更新所有內容
@Test public void updateBySet() { 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("id", "asdfgh456123"); map.put("author", "jms101"); map.put("views", 99999); blogMapper.UpdateBySet(map); }
結果如下:
二、choose (when, otherwise)標簽
官方文檔說明:有時候,我們不想使用所有的條件,而只是想從多個條件中選擇一個使用。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。
我們看一下這個標簽的具體應用
1.在BlogMapper介面中聲明方法
List<Blog> QueryBlogsByChoose(Map<Object, Object> map);
2.在BlogMapper.xml中配置
<select id="QueryBlogsByChoose" parameterType="map" resultType="Blog"> select * from mybaties.blog <where> <choose> <when test="title != null"> title=#{title} </when> <when test="author != null"> author=#{author} </when> <otherwise> views>#{views} </otherwise> </choose> </where> </select>
choose與java的switch語句類似,但又不完全相同,它是先依次判斷when標簽裡面的語句是否符合,符合就執行SQL並且不會繼續往下執行其他when或otherwise標簽,所以在前面的when標簽具有更高的優先順序,當所有when標簽都不符合時,才會執行otherwise中的SQL。
3.測試
(1)我們先測試所有when都不符合的情況:
@Test public void queryBlogsChoose() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); Map<Object, Object> map = new HashMap<>(); map.put("views", 0); List<Blog> blogList = blogMapper.QueryBlogsByChoose(map); for (Blog blog : blogList) { System.out.println(blog); } }
測試結果:
執行了otherwise中的SQL。
(2)測試滿足第二個when的情況
@Test public void queryBlogsChoose() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); Map<Object, Object> map = new HashMap<>(); map.put("views", 0); map.put("author", "jms"); List<Blog> blogList = blogMapper.QueryBlogsByChoose(map); for (Blog blog : blogList) { System.out.println(blog); } }
測試結果:
執行的是第二個when標簽中的SQL語句,沒有問題。
(3)測試所有when標簽都滿足的情況
@Test public void queryBlogsChoose() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); Map<Object, Object> map = new HashMap<>(); map.put("views", 0); map.put("author", "jms"); map.put("title", "learn mybatis day 5"); List<Blog> blogList = blogMapper.QueryBlogsByChoose(map); for (Blog blog : blogList) { System.out.println(blog); } }
測試結果:
執行的是第一個when標簽中的內容。
如此一來,結論很明確了。when標簽越往前優先順序越高,執行一個後就不會再執行其他的。
(本文僅作個人學習記錄用。如有紕漏敬請指正)