在上一篇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標簽越往前優先級越高,執行一個后就不會再執行其他的,
(本文僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508929.html
標籤:其他
上一篇:裝飾器的使用
