為了熟練掌握動態SQL你必須要知道Mybatis中的OGNL表達式

      網友投稿 1510 2022-05-30

      前言

      OGNL是個什么東西?很多剛入門Java的同學會有點陌生。但是在Structs流行的時代OGNL可是必會的數據渲染技術。它全稱Object Graph Navigation Language,作用是降低對數據層訪問的難度,它擁有類型轉換、訪問對象方法、操作集合對象等功能。目前已經很少通過OGNL來訪問數據層了,寫這篇文章主要是因為目前國內大部分的ORM框架是Mybatis,而Mybatis中的動態SQL技術運用了OGNL。

      Mybatis中的OGNL

      不少人在Mybatis的Mapper文件中寫過這樣的判斷:

      and?some_col?=?#{field}

      當field不為空字符并且不為null的情況下增加一個查詢條件。其中 test就是一個OGNL表達式。Mybatis中的OGNL表達式主要有兩種用途。

      條件斷言

      這種是我們最常用的。執行動態SQL的條件斷言,常用的有這些表達式:

      b1 or b2 ?條件 或

      b1 and b2 ?條件 與

      !b1 取反,也可以寫作not b1

      b1 == b2,b1 eq b2 ?判斷兩個值相等

      b1 != b2,b1 neq b2 判斷兩個值不想等

      b1 lt b2 ?判斷b1小于(less than)b2

      b1 gt b2 ?判斷b1小于(greater than)b2

      b1 lte b2:判斷b1小于等于b2

      b1 gte b2:判斷b1大于等于b2

      b1 in b2 判斷b2包含b1

      b1 not in b2 ?判斷b2不包含b1

      這些表達式經常和test配合。

      四則運算賦值

      還有一些表達式用來賦值或者增強屬性。經常用來做模糊搜索的 bind標簽:

      這里的value也屬于OGNL表達式 e1+e2,字符串是拼接,數字的話就是加法運算,我們可以引申出肯定還有:

      e1*e2 乘法

      e1/e2 除法

      e1-e2 減法

      e1%e2 取模

      類的內置方法

      其實Mybatis的Mapper.xml中還可以使用對象的內置方法,比如我們需要判斷一個java.util.Collection集合是否為空,可以這么寫:

      ?0">

      and?some_col?=?#{some_val}

      這里就使用了對象的內置方法Collection.size()。

      我們還可以調用自定義對象CollectionUtils的靜態方法來判斷集合是否為空:

      為了熟練掌握動態SQL你必須要知道Mybatis中的OGNL表達式

      package?cn.felord.util;

      public?final?class?CollectionUtils?{

      public?static?boolean?isNotEmpty(?Collection?collection)?{

      return?(collection?!=?null?&&?!collection.isEmpty());

      }

      }

      那么上面的判斷改為:

      and?some_col?=?#{some_val}

      不要忘了這里要帶上類的全限定名。

      取值操作

      取值操作的話,如果是對象直接e.property,如果是集合或者Map可以e[index|key],通過索引或者鍵名來取值。分別舉個例子:

      #?對象取屬性

      user.username

      #?集合取元素

      array[1]

      #?map?取值

      map['username']

      其實靜態屬性也能取值調用,跟上面的靜態方法類似:

      @cn.felord.Cache@user

      對應Java代碼:

      package?cn.felord;

      public?final?class?Cache?{

      public?static?User?user?=?new?User?("felord.cn")?;

      }

      賦值操作

      上面的取值除了可以做判斷還可以用來SQL參數賦值:

      username?=?#{username}

      and?user_id?=${userId}

      and?id?=?${user.id}

      and?age?=?${@@abs(-12345678)}

      and?gender?=${@cn.felord.GenderEnum@MALE.ordinal()}

      and?id=${@cn.felord.Cache@user.userId}

      通過${}符號可以用OGNL表達式給SQL參數賦值,不過感覺平常比較少用。還有一些OGNL的 玩法可以去看官方文檔。

      總結

      今天對Mybatis中的OGNL表達式進行了總結和分組,對常用的和不常用的用法進行了歸納,希望能夠幫助你掌握Mybatis動態SQL的深度運用。不過請盡量將復雜的操作簡單化,不要寫過于復雜的OGNL表達式,無論是從性能上還是并發安全上都是很重要的因素。好了今天的分享就到這里,請多多關注:碼農小胖哥,獲取日常開發中有用的干貨知識。如果你對OGNL的用法有自己的心得體會,歡迎留言討論。

      厲害了!Spring Boot 2.5正式發布

      2021-05-21

      Spring Security5.5發布,正式實裝OAuth2.0的第五種授權模式

      2021-05-19

      MyBatis SQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:gitbook插件如何安裝,以及定制化插
      下一篇:Nacos集群搭建和mysql持久化配置
      相關文章
      jlzzjlzz亚洲乱熟在线播放| 精品亚洲视频在线观看| 亚洲va无码专区国产乱码| 国产成人亚洲影院在线观看| 亚洲AV无码一区二区三区网址| 国产亚洲精aa在线看| 亚洲偷自精品三十六区| 亚洲人成伊人成综合网久久| 亚洲欧洲在线播放| 亚洲黄色网址大全| 亚洲欧洲日韩在线电影| 亚洲特级aaaaaa毛片| 亚洲毛片一级带毛片基地| 亚洲伊人久久大香线蕉苏妲己| 亚洲国产精品久久久久婷婷老年| 亚洲成AV人片在WWW色猫咪| 亚洲av不卡一区二区三区| 亚洲第一福利视频| 亚洲成a人片在线网站| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲AV无码一区二区三区人| 亚洲国产成人精品电影| 亚洲ts人妖网站| 亚洲砖码砖专无区2023| 亚洲AV无码专区在线电影成人 | 久久亚洲精品无码aⅴ大香 | 亚洲av日韩av欧v在线天堂| 亚洲国产精品人人做人人爱| 国产精品亚洲精品日韩已方 | 国产精品亚洲自在线播放页码| 中文有码亚洲制服av片| 亚洲av永久无码精品秋霞电影秋 | 午夜亚洲福利在线老司机| 亚洲精品无码久久久久AV麻豆| 亚洲最大av无码网址| 亚洲AV无码国产精品色午友在线| 久久亚洲精品人成综合网| 亚洲国产品综合人成综合网站| 亚洲人成www在线播放| 国产AV无码专区亚洲AV琪琪| 国产亚洲欧洲Aⅴ综合一区 |