一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 關于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題

關于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題

2022-01-19 10:58kenx Java教程

這篇文章主要介紹了mybatis if else if 條件判斷SQL片段表達式取值和拼接,文章通過自己真實使用的例子給大家詳細介紹,需要的朋友可以參考下

前言

最近在開發項目的時候涉及到復雜的動態條件查詢,但是mybaits本身不支持if elseif類似的判斷但是我們可以間接通過 chose when otherwise 去實現其中choose為一個整體 when是if otherwise是else

 

快速使用

以前我們進行條件判斷時候使用if標簽進行判斷,條件并列存在

<if test="seat_no != null and seat_no != '' ">  
		        AND seat_no = #{seat_no}  
		    </if>   

現在 使用chose when otherwise條件只要有一個成立,其他的就不會再判斷了。如果沒有成立的條件則默認執行otherwise中的內容

<choose>
		    <when test="……">
		    	……
		    </when>
		    <otherwise>
		    	……
		    </otherwise>
	    </choose>

以下是我自己真實使用的例子,并且經過了測試,僅供參考:

根據動態條件篩選查詢用戶信息

<select id="findUsersByUser" resultType="cn.soboys.kmall.sys.entity.User">
      select tu.USER_ID,tu.USERNAME,tu.SSEX,td.DEPT_NAME,tu.MOBILE,tu.EMAIL,tu.STATUS,tu.CREATE_TIME,
      td.DEPT_ID
      from t_user tu left join t_dept td on tu.DEPT_ID = td.DEPT_ID

      <where>
          <choose>
              <when test="userParams.adminType==4">
                  and tu.ADMIN_TYPE_ID in(2,3)
              </when>
              <otherwise>
                     <include refid="search"></include> 
              </otherwise>
          </choose>
          
      </where>

  </select>
<sql id="search">
       <if test="userParams.adminType==null or userParams.adminType==''">
           and tu.ADMIN_TYPE_ID in(0,1)
       </if>

       <if test="userParams.adminType != null and userParams.adminType != ''">
           and tu.ADMIN_TYPE_ID=#{userParams.adminType}
       </if>


       <if test="userParams.roleId != null and userParams.roleId != ''">
           and (select group_concat(ur.ROLE_ID)
           from t_user u
           right join t_user_role ur on ur.USER_ID = u.USER_ID,
           t_role r
           where r.ROLE_ID = ur.ROLE_ID
           and u.USER_ID = tu.USER_ID and r.ROLE_ID=#{userParams.roleId})
       </if>


       <if test="userParams.mobile != null and userParams.mobile != ''">
           AND tu.MOBILE =#{userParams.mobile}
       </if>
       <if test="userParams.username != null and userParams.username != ''">
           AND tu.USERNAME   like CONCAT('%',#{userParams.username},'%')
       </if>
       <if test="userParams.ssex != null and userParams.ssex != ''">
           AND tu.SSEX  =#{userParams.ssex}
       </if>
       <if test="userParams.status != null and userParams.status != ''">
           AND tu.STATUS =#{userParams.status}
       </if>
       <if test="userParams.deptId != null and userParams.deptId != ''">
           AND td.DEPT_ID =#{userParams.deptId}
       </if>
       <if test="userParams.createTime != null and userParams.createTime != ''">
           AND DATE_FORMAT(tu.CREATE_TIME,'%Y%m%d') BETWEEN substring_index(#{userParams.createTime},'#',1) and substring_index(#{userParams.createTime},'#',-1)
       </if>
   </sql>

這里就用到啦 if else if 判斷。 choose標簽中when條件一但不成立,就會執行otherwise標簽中的條件,判斷語句,也就是我下面包含的sql片段條件

更詳細的條件標簽使用參考我這一篇文章點擊進入

 

SQL片段拼接

我們再寫sql語句的時候往往會有這樣一些要求,一些重復的sql語句片段,我們不想重復去寫,那么可以通過sql片段方式去抽離,公共sql然后在需要的地方去引用

MyBatis<sql> 元素用于定義一個 SQL 片段,用于分離一些公共的 SQL 語句,例如:SELECT 關鍵字和 WHERE 關鍵字之間的部分。其中:

id:唯一標識符,用于在其他地方使用 <include> 標簽引用;

lang:設置字符編碼;

databaseId:指定執行該 SQL 語句的數據庫ID,數據庫ID在 mybatis-cfg.xml 中的 中配置。

同時,你也能夠看見 <sql> 標簽中可以使用<include>、<trim>、<where>、<set>、<foreach>、<choose>、<if>、<bind>等標簽定義復雜的 SQL 片段

簡單使用定義sql片段如下:

<sql id="user_columns">
  `user_id`, `name`, `sex`, `age`
</sql>

<sql> 標簽中使用 <include> 標簽引入定義的sql片段,如下:

<!-- 定義基礎列 -->
<sql id="user_base_columns">
  `user_id`, `name`
</sql>

<!-- 定義一個SQL片段 -->
<sql id="user_columns">
  <include refid="user_base_columns"/>, `sex`, `age`
</sql>

場景使用案例如:查詢用戶信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxstrive.mybatis.sql.demo1.UserMapper">
 <!-- 映射結果 -->
 <resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.sql.demo1.UserBean">
    <id column="user_id" jdbcType="INTEGER" property="userId" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="sex" jdbcType="VARCHAR" property="sex" />
    <result column="age" jdbcType="INTEGER" property="age" />
 </resultMap>

 <!-- 定義一個SQL片段 -->
 <sql id="user_columns">
    `user_id`, `name`, `sex`, `age`
 </sql>

 <!-- 查詢所有用戶信息 -->
 <select id="findAll" resultMap="RESULT_MAP">
    select <include refid="user_columns" /> from `user`
 </select>

</mapper>

 

SQL參數取值和OGNL表達式

看到我們上面去值參數通過#{params}這種方式來去值的其中傳進來的參數 #{xx} 就是使用的 OGNL 表達式。

Mybatis 官方文檔中「XML 映射文件」模塊里邊,有解析到:

說當我們使用 #{} 類型參數符號的時候,其實就是告訴 Mybatis 創建一個預處理語句參數,通過 JDBC,這樣的一個參數在 SQL 中會由一個 "?" 來標識,并傳遞到一個新的預處理語句中。

關于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題

也就是說當我們使用 #{XX} OGNL 表達式的時候, 它會先幫我們生成一條帶占位符的 SQL 語句,然后在底層幫我們設置這個參數:ps.setInt(1, id);

OGNL 是 Object-Graph Navigation Language 的縮寫,對象-圖行導航語言,語法為:#{ }。
是不是有點懵,不知道這是個啥?
OGNL 作用是在對象和視圖之間做數據的交互,可以存取對象的屬性和調用對象的方法,通過表達式可以迭代出整個對象的結構圖

MyBatis常用OGNL表達式如下:

關于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題

上述內容只是合適在MyBatis中使用的OGNL表達式,完整的表達式點擊這里

MyBatis中可以使用OGNL的地方有兩處:

  • 動態SQL表達式中
  • ${param}參數中

如下例子MySql like 查詢:

<select id="xxx" ...>
  select id,name,... from country
  <where>
      <if test="name != null and name != ''">
          name like concat('%', #{name}, '%')
      </if>
  </where>
</select>

上面代碼中test的值會使用OGNL計算結果。

例二,通用 like 查詢:

<select id="xxx" ...>
  select id,name,... from country
  <bind name="nameLike" value="'%' + name + '%'"/>
  <where>
      <if test="name != null and name != ''">
          name like #{nameLike}
      </if>
  </where>
</select>

這里的value值會使用OGNL計算。

注:對<bind參數的調用可以通過#{}或 ${} 方式獲取,#{}可以防止注入。

在通用Mapper中支持一種UUID的主鍵,在通用Mapper中的實現就是使用了標簽,這個標簽調用了一個靜態方法,大概方法如下:

<bind name="username_bind" 
    value='@java.util.UUID@randomUUID().toString().replace("-", "")' />

這種方式雖然能自動調用靜態方法,但是沒法回寫對應的屬性值,因此使用時需要注意。

${params}中的參數

上面like的例子中使用下面這種方式最簡單

<select id="xxx" ...>
  select id,name,... from country
  <where>
      <if test="name != null and name != ''">
          name like '${'%' + name + '%'}'
      </if>
  </where>
</select>

這里注意寫的是${'%' + name + '%'},而不是%${name}%,這兩種方式的結果一樣,但是處理過程不一樣。

MyBatis中處理${}的時候,只是使用OGNL計算這個結果值,然后替換SQL中對應的${xxx},OGNL處理的只是${這里的表達式}。

這里表達式可以是OGNL支持的所有表達式,可以寫的很復雜,可以調用靜態方法返回值,也可以調用靜態的屬性值。

例子,條件判斷入參屬性值是否包含子字符串可以直接使用 contains判斷

<foreach collection="list" item="item" index="index" separator="AND" open="(" close=")">

  <choose>
      <when test='item.cname.contains("select") or item.cname.contains("checkbox") or item.cname.contains("date")'>
          <if test='item.cname.contains("select") or item.cname.contains("checkbox")'>
              find_in_set(#{item.value},base.${item.cname})
          </if>

          <if test='item.cname.contains("date")'>
              DATE_FORMAT(base.${item.cname},'%Y-%m-%d') = DATE_FORMAT(#{item.value},'%Y-%m-%d')
          </if>
      </when>
      <otherwise>
          base.${item.cname} = #{item.value}
      </otherwise>
  </choose>
</foreach>

到此這篇關于mybatis if else if 條件判斷SQL片段表達式取值和拼接的文章就介紹到這了,更多相關mybatis if else if 條件判斷內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/kenx/p/15336949.html

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 欧美2区 | 欧美另类老女人 | 日韩精品免费一区二区三区 | 亚洲精品国产成人 | 51国产午夜精品免费视频 | 亚洲精品免费视频 | 性欧美高清强烈性视频 | 福利久草 | 亚洲国产精品无圣光一区二区 | 婷婷草| 俄罗斯美女尿尿 | 成在线人免费视频一区二区三区 | 黄瓜视频黄版 | 手机看片1024国产 | 欧美一级欧美三级在线 | 久久免费黄色 | 免费网站看v片在线成人国产系列 | heyzo在线观看 | 国产二区三区 | mm在线 | 国内精品一区视频在线播放 | 成全动漫视频在线观看 | 性做久久久久久久 | 九色PORNY真实丨国产大胸 | 国产黄频在线观看 | 欧美日韩在线观看一区二区 | 天天综合亚洲 | 摸咪网在线影院在线观看 | 国产成人久视频免费 | 男女乱淫真视频播放网站 | 国产欧美精品一区二区三区 | 九九大香尹人视频免费 | 日韩精品亚洲专区在线影视 | 无限在线观看视频大全免费高清 | 日本中文字幕在线观看视频 | 动漫美女人物被黄漫小说 | 晚上禁用的十大黄台视频 | 三级无删减高清在线影院 | bt天堂午夜国产精品 | 欧美激烈精交gif动态图18p | 性欧美hd|