最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年09月27日 08:43:33   作者:kenx  
這篇文章主要介紹了mybatis if else if 條件判斷SQL片段表達式取值和拼接,文章通過自己真實使用的例子給大家詳細介紹,需要的朋友可以參考下

前言

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

快速使用

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

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

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

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

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

根據(jù)動態(tài)條件篩選查詢用戶信息

<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條件一但不成立,就會執(zhí)行otherwise標簽中的條件,判斷語句,也就是我下面包含的sql片段條件

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

SQL片段拼接

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

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

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

lang:設(shè)置字符編碼;

databaseId:指定執(zhí)行該 SQL 語句的數(shù)據(jù)庫ID,數(shù)據(jù)庫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片段,如下:

<!-- 定義基礎(chǔ)列 -->
<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">
   <!-- 映射結(jié)果 -->
   <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參數(shù)取值和OGNL表達式

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

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

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

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

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

MyBatis常用OGNL表達式如下:

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

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

  • 動態(tài)SQL表達式中
  • ${param}參數(shù)中

如下例子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計算結(jié)果。

例二,通用 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參數(shù)的調(diào)用可以通過#{}或 ${} 方式獲取,#{}可以防止注入。

在通用Mapper中支持一種UUID的主鍵,在通用Mapper中的實現(xiàn)就是使用了標簽,這個標簽調(diào)用了一個靜態(tài)方法,大概方法如下:

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

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

${params}中的參數(shù)

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

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

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

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

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

例子,條件判斷入?yún)傩灾凳欠癜幼址梢灾苯邮褂?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>

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

相關(guān)文章

  • Java實現(xiàn)用位運算維護狀態(tài)碼

    Java實現(xiàn)用位運算維護狀態(tài)碼

    位運算是一種非常高效的運算方式,在算法考察中比較常見,那么業(yè)務代碼中我們?nèi)绾问褂梦贿\算呢,感興趣的小伙伴快跟隨小編一起學習一下吧
    2024-03-03
  • springboot layui hutool Excel導入的實現(xiàn)

    springboot layui hutool Excel導入的實現(xiàn)

    本文主要介紹了springboot layui hutool Excel導入的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • java中實現(xiàn)對象排序的兩種方法(Comparable,Comparator)

    java中實現(xiàn)對象排序的兩種方法(Comparable,Comparator)

    這篇文章主要給大家介紹了關(guān)于java中實現(xiàn)對象排序的兩種方法,一種是實現(xiàn)Comparable進行排序,另一種是實現(xiàn)Comparator進行排序,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • java二叉樹的幾種遍歷遞歸與非遞歸實現(xiàn)代碼

    java二叉樹的幾種遍歷遞歸與非遞歸實現(xiàn)代碼

    這篇文章主要介紹了java二叉樹的幾種遍歷遞歸與非遞歸實現(xiàn)代碼,需要的朋友可以參考下
    2020-12-12
  • Java利用正則取標簽之間的數(shù)據(jù)

    Java利用正則取標簽之間的數(shù)據(jù)

    這篇文章主要介紹了Java利用正則取標簽之間的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java對double數(shù)組排序示例分享

    java對double數(shù)組排序示例分享

    這篇文章主要介紹了java對double數(shù)組排序示例,代碼簡單,下面我們直接上代碼,需要的朋友可以參考下
    2014-03-03
  • Java實現(xiàn)聯(lián)系人管理系統(tǒng)

    Java實現(xiàn)聯(lián)系人管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)聯(lián)系人管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JAVA正則表達式校驗qq號碼的方法

    JAVA正則表達式校驗qq號碼的方法

    Java作為一種開發(fā)語言,有許多值得推薦的地方,但是它一直以來沒有自帶對正則表達式的支持。下面小編給大家?guī)砹薐AVA正則表達式校驗qq號碼的方法,需要的朋友參考下吧
    2018-04-04
  • Java 實用工具類Spring 的 AnnotationUtils詳解

    Java 實用工具類Spring 的 AnnotationUtils詳解

    Spring 框架提供了一個強大的注解工具類 org.springframework.core.annotation.AnnotationUtils,用于簡化注解的獲取、合成與解析過程,本文給大家介紹Java 實用工具類:Spring 的 AnnotationUtils,感興趣的朋友一起看看吧
    2025-04-04
  • 簡單總結(jié)Java IO中stream流的使用方法

    簡單總結(jié)Java IO中stream流的使用方法

    這篇文章主要介紹了Java IO中stream流的使用方法的簡單總結(jié),包括數(shù)據(jù)流和打印流等Java入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-03-03

最新評論

沅陵县| 富顺县| 太保市| 监利县| 历史| 祁门县| 海晏县| 昂仁县| 平凉市| 陆河县| 陆川县| 稻城县| 广州市| 阳新县| 西乌珠穆沁旗| 苍山县| 宁阳县| 二连浩特市| 资阳市| 汝南县| 桦川县| 神木县| 新乡市| 山东| 西华县| 吴江市| 广西| 拉孜县| 孟州市| 虎林市| 江华| 阿克苏市| 精河县| 汶川县| 阿荣旗| 岳阳县| 巴林右旗| 肇庆市| 柳林县| 邻水| 临漳县|