自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

mybatis 動(dòng)態(tài)sql

數(shù)據(jù)庫(kù) Oracle
OGNL,全稱為Object-Graph Navigation Language,它是一個(gè)功能強(qiáng)大的表達(dá)式語(yǔ)言,用來(lái)獲取和設(shè)置Java對(duì)象的屬性,它旨在提供一個(gè)更高的更抽象的層次來(lái)對(duì)Java對(duì)象圖進(jìn)行導(dǎo)航。

   名詞解析

  OGNL表達(dá)式

  OGNL,全稱為Object-Graph Navigation Language,它是一個(gè)功能強(qiáng)大的表達(dá)式語(yǔ)言,用來(lái)獲取和設(shè)置Java對(duì)象的屬性,它旨在提供一個(gè)更高的更抽象的層次來(lái)對(duì)Java對(duì)象圖進(jìn)行導(dǎo)航。

  OGNL表達(dá)式的基本單位是"導(dǎo)航鏈",一般導(dǎo)航鏈由如下幾個(gè)部分組成:

  屬性名稱(property)

  方法調(diào)用(method invoke)

  數(shù)組元素

  所有的OGNL表達(dá)式都基于當(dāng)前對(duì)象的上下文來(lái)完成求值運(yùn)算,鏈的前面部分的結(jié)果將作為后面求值的上下文。例如:names[0].length()。

  mybatis 的動(dòng)態(tài)sql語(yǔ)句是基于OGNL表達(dá)式的??梢苑奖愕脑?sql 語(yǔ)句中實(shí)現(xiàn)某些邏輯. 總體說(shuō)來(lái)mybatis 動(dòng)態(tài)SQL 語(yǔ)句主要有以下幾類:

  1. if 語(yǔ)句 (簡(jiǎn)單的條件判斷)

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

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

  4. where (主要是用來(lái)簡(jiǎn)化sql語(yǔ)句中where條件判斷的,能智能的處理 and or ,不必?fù)?dān)心多余導(dǎo)致語(yǔ)法錯(cuò)誤)

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

  6. foreach (在實(shí)現(xiàn) mybatis in 語(yǔ)句查詢時(shí)特別有用)

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

  1. mybaits if 語(yǔ)句處理 

  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參數(shù),那么就要滿足title=#{title},同樣如果你提供了Content和Owner的時(shí)候,它們也需要滿足相應(yīng)的條件,之后就是返回滿足這些條件的所有Blog,這是非常有用的一個(gè)功能。

  以往我們使用其他類型框架或者直接使用JDBC的時(shí)候, 如果我們要達(dá)到同樣的選擇效果的時(shí)候,我們就需要拼SQL語(yǔ)句,這是極其麻煩的,比起來(lái),上述的動(dòng)態(tài)SQL就要簡(jiǎn)單多了。

  2. choose (when,otherwize) ,相當(dāng)于java 語(yǔ)言中的 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元素表示當(dāng)when中的條件滿足的時(shí)候就輸出其中的內(nèi)容,跟JAVA中的switch效果差不多的是按照條件的順序,當(dāng)when中有條件滿足的時(shí)候,就會(huì)跳出choose,即所有的when和otherwise條件中,只有一個(gè)會(huì)輸出,當(dāng)所有的我很條件都不滿足的時(shí)候就輸出otherwise中的內(nèi)容。所以上述語(yǔ)句的意思非常簡(jiǎn)單, 當(dāng)title!=null的時(shí)候就輸出and titlte = #{title},不再往下判斷條件,當(dāng)title為空且content!=null的時(shí)候就輸出and content = #{content},當(dāng)所有條件都不滿足的時(shí)候就輸出otherwise中的內(nèi)容。

  3.trim (對(duì)包含的內(nèi)容加上 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元素的主要功能是可以在自己包含的內(nèi)容前加上某些前綴,也可以在其后加上某些后綴,與之對(duì)應(yīng)的屬性是prefix和suffix;可以把包含內(nèi)容的首部某些內(nèi)容覆蓋,即忽略,也可以把尾部的某些內(nèi)容覆蓋,對(duì)應(yīng)的屬性是prefixOverrides和suffixOverrides;正因?yàn)閠rim有這樣的功能,所以我們也可以非常簡(jiǎn)單的利用trim來(lái)代替where元素的功能

  4. where (主要是用來(lái)簡(jiǎn)化sql語(yǔ)句中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元素的作用是會(huì)在寫(xiě)入where元素的地方輸出一個(gè)where,另外一個(gè)好處是你不需要考慮where元素里面的條件輸出是什么樣子的,MyBatis會(huì)智能的幫你處理,如果所有的條件都不滿足那么MyBatis就會(huì)查出所有的記錄,如果輸出后是and 開(kāi)頭的,MyBatis會(huì)把***個(gè)and忽略,當(dāng)然如果是or開(kāi)頭的,MyBatis也會(huì)把它忽略;此外,在where元素中你不需要考慮空格的問(wèn)題,MyBatis會(huì)智能的幫你加上。像上述例子中,如果title=null, 而content != null,那么輸出的整個(gè)語(yǔ)句會(huì)是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因?yàn)镸yBatis會(huì)智能的把***and 或 or 給忽略。

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

 

  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元素主要是用在更新操作的時(shí)候,它的主要功能和where元素其實(shí)是差不多的,主要是在包含的語(yǔ)句前輸出一個(gè)set,然后如果包含的語(yǔ)句是以逗號(hào)結(jié)束的話將會(huì)把該逗號(hào)忽略,如果set包含的內(nèi)容為空的話則會(huì)出錯(cuò)。有了set元素我們就可以動(dòng)態(tài)的更新那些修改了的字段

  6. foreach (在實(shí)現(xiàn) mybatis in 語(yǔ)句查詢時(shí)特別有用)

  foreach的主要用在構(gòu)建in條件中,它可以在SQL語(yǔ)句中進(jìn)行迭代一個(gè)集合。foreach元素的屬性主要有item,index,collection,open,separator,close。

  item表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名,

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

  open表示該語(yǔ)句以什么開(kāi)始,

  separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符,

  close表示以什么結(jié)束,

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

  如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list

  如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array

  如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map,實(shí)際上如果你在傳入?yún)?shù)的時(shí)候,在MyBatis里面也是會(huì)把它封裝成一個(gè)Map的,map的key就是參數(shù)名,所以這個(gè)時(shí)候collection屬性值就是傳入的List或array對(duì)象在自己封裝的map里面的key

  6.1.單參數(shù)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,對(duì)應(yīng)的Mapper是這樣的

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

  測(cè)試代碼

  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.數(shù)組類型的參數(shù)

  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

 

  對(duì)應(yīng)mapper

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

  6.3. Map 類型的參數(shù)

  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 應(yīng)該是這樣的接口:

  public List dynamicForeach3Test(Map

  通過(guò)以上方法,就能完成一般的mybatis 的 動(dòng)態(tài)SQL 語(yǔ)句.最常用的就是 if where foreach這幾個(gè),一定要重點(diǎn)掌握.

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

責(zé)任編輯:honglu 來(lái)源: 博客園
相關(guān)推薦

2021-03-02 09:15:24

MyBatisSQL數(shù)據(jù)庫(kù)

2019-11-21 10:45:22

MyBatisSQL標(biāo)簽

2024-06-12 08:36:25

2025-01-07 09:07:36

接口屬性路徑

2024-02-04 09:24:45

MyBatisSQL語(yǔ)句Spring

2021-01-14 05:16:09

MyBatis動(dòng)態(tài)代理

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動(dòng)態(tài)交叉表

2010-09-25 16:37:33

SQL動(dòng)態(tài)查詢

2010-09-25 16:00:38

sql存儲(chǔ)過(guò)程

2010-08-05 09:07:24

2010-11-12 13:08:36

動(dòng)態(tài)sql語(yǔ)句

2021-08-27 07:47:06

SQL靜態(tài)程序

2010-11-12 12:01:08

Oracle存儲(chǔ)過(guò)程

2009-09-17 16:20:43

Linq to sql

2010-11-12 13:40:38

動(dòng)態(tài)sql語(yǔ)句

2023-01-30 08:41:07

MyBatisSQL語(yǔ)句
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)