成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

mybatis 動態sql

數據庫 Oracle
OGNL,全稱為Object-Graph Navigation Language,它是一個功能強大的表達式語言,用來獲取和設置Java對象的屬性,它旨在提供一個更高的更抽象的層次來對Java對象圖進行導航。

   名詞解析

  OGNL表達式

  OGNL,全稱為Object-Graph Navigation Language,它是一個功能強大的表達式語言,用來獲取和設置Java對象的屬性,它旨在提供一個更高的更抽象的層次來對Java對象圖進行導航。

  OGNL表達式的基本單位是"導航鏈",一般導航鏈由如下幾個部分組成:

  屬性名稱(property)

  方法調用(method invoke)

  數組元素

  所有的OGNL表達式都基于當前對象的上下文來完成求值運算,鏈的前面部分的結果將作為后面求值的上下文。例如:names[0].length()。

  mybatis 的動態sql語句是基于OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類:

  1. if 語句 (簡單的條件判斷)

  2. choose (when,otherwize) ,相當于java 語言中的 switch ,與 jstl 中的choose 很類似.

  3. trim (對包含的內容加上 prefix,或者 suffix 等,前綴,后綴)

  4. where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or ,不必擔心多余導致語法錯誤)

  5. set (主要用于更新時)

  6. foreach (在實現 mybatis in 語句查詢時特別有用)

  下面分別介紹這幾種處理方式

  1. mybaits if 語句處理 

  1. <select id="dynamicIfTest" parameterType="Blog" resultType="Blog"
  2.         select * from t_blog where 1 = 1 
  3.         <if test="title != null"
  4.             and title = #{title} 
  5.         </if> 
  6.         <if test="content != null"
  7.             and content = #{content} 
  8.         </if> 
  9.         <if test="owner != null"
  10.             and owner = #{owner} 
  11.         </if> 
  12.     </select

 

  解析:

  如果你提供了title參數,那么就要滿足title=#{title},同樣如果你提供了Content和Owner的時候,它們也需要滿足相應的條件,之后就是返回滿足這些條件的所有Blog,這是非常有用的一個功能。

  以往我們使用其他類型框架或者直接使用JDBC的時候, 如果我們要達到同樣的選擇效果的時候,我們就需要拼SQL語句,這是極其麻煩的,比起來,上述的動態SQL就要簡單多了。

  2. choose (when,otherwize) ,相當于java 語言中的 switch ,與 jstl 中的choose 很類似

  1. <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog"
  2.         select * from t_blog where 1 = 1  
  3.         <choose> 
  4.             <when test="title != null"
  5.                 and title = #{title} 
  6.             </when
  7.             <when test="content != null"
  8.                 and content = #{content} 
  9.             </when
  10.             <otherwise> 
  11.                 and owner = "owner1" 
  12.             </otherwise> 
  13.         </choose> 
  14.     </select

 

  when元素表示當when中的條件滿足的時候就輸出其中的內容,跟JAVA中的switch效果差不多的是按照條件的順序,當when中有條件滿足的時候,就會跳出choose,即所有的when和otherwise條件中,只有一個會輸出,當所有的我很條件都不滿足的時候就輸出otherwise中的內容。所以上述語句的意思非常簡單, 當title!=null的時候就輸出and titlte = #{title},不再往下判斷條件,當title為空且content!=null的時候就輸出and content = #{content},當所有條件都不滿足的時候就輸出otherwise中的內容。

  3.trim (對包含的內容加上 prefix,或者 suffix 等,前綴,后綴) 

  1. <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog"
  2.         select * from t_blog  
  3.         <trim prefix="where" prefixOverrides="and |or"
  4.             <if test="title != null"
  5.                 title = #{title} 
  6.             </if> 
  7.             <if test="content != null"
  8.                 and content = #{content} 
  9.             </if> 
  10.             <if test="owner != null"
  11.                 or owner = #{owner} 
  12.             </if> 
  13.         </trim> 
  14.     </select

 

  trim元素的主要功能是可以在自己包含的內容前加上某些前綴,也可以在其后加上某些后綴,與之對應的屬性是prefix和suffix;可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為trim有這樣的功能,所以我們也可以非常簡單的利用trim來代替where元素的功能

  4. where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or 條件

  1. <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog"
  2.         select * from t_blog  
  3.         <where
  4.             <if test="title != null"
  5.                 title = #{title} 
  6.             </if> 
  7.             <if test="content != null"
  8.                 and content = #{content} 
  9.             </if> 
  10.             <if test="owner != null"
  11.                 and owner = #{owner} 
  12.             </if> 
  13.         </where
  14.     </select

 

  where元素的作用是會在寫入where元素的地方輸出一個where,另外一個好處是你不需要考慮where元素里面的條件輸出是什么樣子的,MyBatis會智能的幫你處理,如果所有的條件都不滿足那么MyBatis就會查出所有的記錄,如果輸出后是and 開頭的,MyBatis會把***個and忽略,當然如果是or開頭的,MyBatis也會把它忽略;此外,在where元素中你不需要考慮空格的問題,MyBatis會智能的幫你加上。像上述例子中,如果title=null, 而content != null,那么輸出的整個語句會是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因為MyBatis會智能的把***and 或 or 給忽略。

  5.set (主要用于更新時)

 

  1. <update id="dynamicSetTest" parameterType="Blog"
  2.         update t_blog 
  3.         <set
  4.             <if test="title != null"
  5.                 title = #{title}, 
  6.             </if> 
  7.             <if test="content != null"
  8.                 content = #{content}, 
  9.             </if> 
  10.             <if test="owner != null"
  11.                 owner = #{owner} 
  12.             </if> 
  13.         </set
  14.         where id = #{id} 
  15.     </update

 

  set元素主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語句前輸出一個set,然后如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的字段

  6. foreach (在實現 mybatis in 語句查詢時特別有用)

  foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。

  item表示集合中每一個元素進行迭代時的別名,

  index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,

  open表示該語句以什么開始,

  separator表示在每次進行迭代之間以什么符號作為分隔符,

  close表示以什么結束,

  在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:

  如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list

  如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array

  如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key

  6.1.單參數List的類型 

  1. <select id="dynamicForeachTest" resultType="Blog"
  2.         select * from t_blog where id in 
  3.         <foreach collection="list" index="index" item="item" open="(" separator="," close=")"
  4.             #{item} 
  5.         </foreach> 
  6.     </select

 

  上述collection的值為list,對應的Mapper是這樣的

  1. public List<Blog> dynamicForeachTest(List<Integer> ids);  

  測試代碼

  1. @Test 
  2.     public void dynamicForeachTest() { 
  3.         SqlSession session = Util.getSqlSessionFactory().openSession(); 
  4.         BlogMapper blogMapper = session.getMapper(BlogMapper.class); 
  5.         List<Integer> ids = new ArrayList<Integer>(); 
  6.         ids.add(1); 
  7.         ids.add(3); 
  8.         ids.add(6); 
  9.         List<Blog> blogs = blogMapper.dynamicForeachTest(ids); 
  10.         for (Blog blog : blogs) 
  11.             System.out.println(blog); 
  12.         session.close(); 
  13.     } 

 

  6.2.數組類型的參數

  1. <select id="dynamicForeach2Test" resultType="Blog"
  2.         select * from t_blog where id in 
  3.         <foreach collection="array" index="index" item="item" open="(" separator="," close=")"
  4.             #{item} 
  5.         </foreach> 
  6.     </select

 

  對應mapper

  1. public List<Blog> dynamicForeach2Test(int[] ids);   

  6.3. Map 類型的參數

  1. <select id="dynamicForeach3Test" resultType="Blog"
  2.         select * from t_blog where title like "%"#{title}"%" and id in 
  3.         <foreach collection="ids" index="index" item="item" open="(" separator="," close=")"
  4.             #{item} 
  5.         </foreach> 
  6.     </select

 

  mapper 應該是這樣的接口:

  public List dynamicForeach3Test(Map

  通過以上方法,就能完成一般的mybatis 的 動態SQL 語句.最常用的就是 if where foreach這幾個,一定要重點掌握.

  致謝:感謝您的耐心閱讀!

責任編輯:honglu 來源: 博客園
相關推薦

2021-03-02 09:15:24

MyBatisSQL數據庫

2019-11-21 10:45:22

MyBatisSQL標簽

2024-06-12 08:36:25

2024-02-04 09:24:45

MyBatisSQL語句Spring

2025-01-07 09:07:36

接口屬性路徑

2021-01-14 05:16:09

MyBatis動態代理

2020-09-28 09:30:13

mybatis

2021-11-07 14:36:01

SQLJDBCMyBatis

2009-09-17 16:46:34

Linq to sql

2009-09-18 15:15:12

LINQ to SQL

2011-04-07 14:04:28

SQL動態交叉表

2010-09-25 16:37:33

SQL動態查詢

2010-09-25 16:00:38

sql存儲過程

2010-08-05 09:07:24

2010-11-12 13:08:36

動態sql語句

2021-08-27 07:47:06

SQL靜態程序

2010-11-12 12:01:08

Oracle存儲過程

2009-09-17 16:20:43

Linq to sql

2010-11-12 13:40:38

動態sql語句

2023-01-30 08:41:07

MyBatisSQL語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本欧美在线视频 | 久久99久久 | 国产精品久久久久aaaa九色 | 国产一区999| 亚洲一区二区中文字幕在线观看 | 欧美激情综合色综合啪啪五月 | 九色 在线| 一区二区三区精品视频 | 99在线免费观看视频 | 精品国产乱码久久久久久老虎 | 不卡一区二区在线观看 | 成人午夜毛片 | 欧美一区二区在线观看视频 | 91麻豆精品国产91久久久久久久久 | 精品欧美激情在线观看 | 欧美精品在线一区 | 毛片一区二区 | 久久精品视频在线观看 | 亚洲免费观看视频网站 | 成人一区二 | 精品久久久久久亚洲国产800 | 国产在线观看一区二区 | 亚洲成人av一区二区 | 欧美专区日韩专区 | www.中文字幕.com | 九九精品在线 | 国产精品永久久久久 | 美女一级毛片 | 日韩国产一区二区三区 | 久久久久久国产精品 | а√中文在线8 | 一区二区在线不卡 | 欧美不卡网站 | 亚洲精品视频久久 | 看毛片的网站 | 亚洲精品1区 | 久久高清 | 黄免费看| 日本三级全黄三级三级三级口周 | 国产免费拔擦拔擦8x高清 | 国产精品一区二区久久精品爱微奶 |