中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何正確的使用Mybatis模糊查詢

發布時間:2021-01-18 15:47:08 來源:億速云 閱讀:260 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關如何正確的使用Mybatis模糊查詢,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Mybatis 模糊查詢和動態sql語句

模糊查詢

對數據庫最常用的操作就是查詢了,但是如何使用Mybatis進行模糊查詢呢?下面先看一個簡單的模糊查詢

  <select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE #{asd} 
  </select>

這是一條偽模糊查詢, 因為沒有實現真正的模糊 “%”。參數為字符串,所以#{}中內容不被限制。但是應該如何插入 % 字符呢。 我們首先想到的是傳遞字符串參數時將%插入到字符串中 “張%”,但是這種方法操作略微繁瑣了一些。 下面提供了使用sql方法的策略

 <select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE CONCAT( #{asd} ,'%')
  </select>

另外一種不推薦的寫法給大家

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE '${emp_name}%'
  </select>

#{} 是采用預編譯的寫法,也就是JDBC中的PerpareStatement,這種寫法可以防止sql注入,但${}這種寫法是不采用預編譯,其中的參數寫成類中的屬性或者map的key值或者為接口中注解的參數名。

mybatis 提供了bind 標簽。下面舉個例子

 <select id="select01" resultMap="BasicResultMap">
  <bind name="emp_name" value="'%'+ _parameter.getEmp_name() +'%'"/>
   SELECT 
   * 
  FROM
   oa_employee 
  WHERE emp_name LIKE #{emp_name}
  </select>

他是在#{}表達式自動填入value值,值得注意的是“_parameter.getEmp_name()” 調用的方法是對象中作為查詢參數的屬性的get方法

多條件查詢

多種條件查詢的要點是判斷查詢條件是否為空,拼接sql語句。在mybatis中提供了if標簽和where 標簽。 下面來介紹兩種標簽的用法。

if標簽

<select id="select01" resultMap="BasicResultMap"> 
SELECT 
* 
FROM 
oa_employee 
WHERE 1=1 
<if test="emp_name != null and emp_name != ''"> 
and emp_name = #{emp_name } 
</if> 
<if test="emp_sex != null and emp_sex != ''"> 
and sex = #{emp_sex} 
</if> 
</select>

mybatis 中的if標簽有些類似于EL表達式的使用,test中可以直接寫入類中的屬性或者key值。

where標簽

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
   <where>
   <if test="emp_name != null and emp_name != ''">
    and emp_name = #{emp_name }
   </if>
   <if test="emp_sex != null and emp_sex != ''">
    and sex = #{emp_sex}
   </if>
   </where>
  </select>

這里的where標簽 替換了前一段代碼的 where 1=1 。 mybatis中的where 標簽會判斷標簽內是否有內容, 如果有內容就自動生成where 并把 where 后面的第一個and +一個空格,or+一個空格 去掉。

choose , when 和 otherwise 標簽

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
   <where>
   <choose>
    <when test="emp_name != null and emp_name != ''">
       and emp_name = #{emp_name }
    </when>
     <when test="emp_sex != null and emp_sex != ''">
       and sex = #{emp_sex}
    </when>
    <otherwise>
      emp_id = 50
    </otherwise>
   </choose>
   </where>
  </select>

當所有條件不滿足時,執行otherwise標簽的內容。

trim標簽

<select id="select01" resultMap="BasicResultMap">
   SELECT 
   * 
   FROM
   oa_employee 
    <trim prefix="where" prefixOverrides="and |or ">
    <if test="emp_name != null and emp_name != ''">
      and emp_name = #{emp_name }
    </if>
    <if test="emp_sex != null and emp_sex != ''">
       and sex = #{emp_sex}
    </if>
  </trim>

trim標簽的屬性及其含義

  • - prefix : 標簽之間有內容在最前面加入

  • - prefixOverrides: 檢查內容的最前面是否匹配,匹配就刪除

  • - suffix: 標簽之間有內容在最后面加入

  • - suffixOverrides:檢查內容的最后面是否匹配,匹配就刪除

set標簽

set標簽常用于update操作,并且會自動抹掉無關的,

 <update id="update01" >
  UPDATE 
   oa_employee 
  <set>
    <if test="emp_name != null and emp_name != ''">
       emp_name = #{emp_name}
    </if>
    <if test="emp_sex != null and emp_sex != ''">
      ,sex = #{emp_sex}
    </if>
  </set>
  WHERE emp_id = 50 
  </update>

foreach標簽

foreach 用于處理數組或者list集合,下面是一個批量添加的例子

 <insert id="insert01">
  INSERT INTO 
  oa_employee 
  ( emp_name, sex, fk_dept_id) 
  VALUES
  <foreach collection="list" item="employee" separator=","> 
   (#{employee.emp_name},#{employee.emp_sex},#{employee.fk_dept_id})
  </foreach>
  </insert>

其中 如果參數為數組 則collection只能為“array” 參數為List集合則collection只能為 “list” item類似JSTL 中的var的作用, 指代容器中的每一個對象。separator=”,”的含義是每條數據以 , 分割。 未注明的屬性有 open 和 close 他們的含義是在遍歷開始和結束時分別添加其內容。

上述就是小編為大家分享的如何正確的使用Mybatis模糊查詢了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭锦旗| 吴江市| 屏东市| 会理县| 西乌珠穆沁旗| 灌云县| 汪清县| 调兵山市| 大港区| 玛多县| 兰考县| 中阳县| 九龙坡区| 原平市| 衡阳县| 宜良县| 湘乡市| 临沧市| 定兴县| 赣州市| 苍南县| 长乐市| 柘荣县| 芜湖市| 宁波市| 乌拉特前旗| 内江市| 罗源县| 宣化县| 海南省| 南川市| 肥东县| 汾阳市| 澎湖县| 凤台县| 曲周县| 中山市| 淮安市| 万山特区| 桐柏县| 吐鲁番市|