成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Edg !動態(tài) SQL!牛 !

運維 數(shù)據(jù)庫運維
“開發(fā)人員在使用JDBC或其他類似的框架進行數(shù)據(jù)庫開發(fā)時,通常都要根據(jù)需求去手動拼裝SQL,這是一個非常麻煩且痛苦的工作,而MyBatis提供的對SQL語句動態(tài)組裝的功能,恰能很好的解決這一麻煩工作。

[[433687]]

1. 動態(tài)SQL中的元素

動態(tài)SQL有什么作用?

“開發(fā)人員在使用JDBC或其他類似的框架進行數(shù)據(jù)庫開發(fā)時,通常都要根據(jù)需求去手動拼裝SQL,這是一個非常麻煩且痛苦的工作,而MyBatis提供的對SQL語句動態(tài)組裝的功能,恰能很好的解決這一麻煩工作。

動態(tài)SQL是MyBatis的強大特性之一,MyBatis3采用了功能強大的基于OGNL的表達式來完成動態(tài)SQL。動態(tài)SQL主要元素如下表所示:

2. < if >元素

“在MyBatis中,< if >元素是最常用的判斷語句,它類似于Java中的if語句,主要用于實現(xiàn)某些簡單的條件選擇。其基本使用示例如下:

  1. select * from t_customer where 1=1  
  2.      <if test="username !=null and username !=''"
  3.   and username like concat('%',#{username}, '%'
  4.      </if> 
  5.      <if test="jobs !=null and jobs !=''"
  6.   and jobs= #{jobs} 
  7.      </if> 

使用< if >元素對username和jobs進行非空判斷,并動態(tài)組裝SQL

“在實際應(yīng)用中,我們可能會通過多個條件來精確的查詢某個數(shù)據(jù)。例如,要查找某個客戶的信息,可以通過姓名和職業(yè)來查找客戶,也可以不填寫職業(yè)直接通過姓名來查找客戶,還可以都不填寫而查詢出所有客戶,此時姓名和職業(yè)就是非必須條件。

3. < choose >及其子元素

  1. <!--<choose>(<when>、<otherwise>)元素使用 --> 
  2.     <select id="findCustomerByNameOrJobs" parameterType="com.nateshao.po.Customer" 
  3.             resultType="com.nateshao.po.Customer"
  4.         select * from t_customer where 1=1 
  5.         <choose> 
  6.             <when test="username !=null and username !=''"
  7.                 and username like concat('%',#{username}, '%'
  8.             </when
  9.             <when test="jobs !=null and jobs !=''"
  10.                 and jobs= #{jobs} 
  11.             </when
  12.             <otherwise> 
  13.                 and phone is not null 
  14.             </otherwise> 
  15.         </choose> 
  16.     </select

使用< choose >及其子元素依次對條件進行非空判斷,并動態(tài)組裝SQL。

4. < when >、< trim >元素

在前面中,映射文件中編寫的SQL后面都加入了“where 1=1”的條件,那么到底為什么要這么寫呢?如果將where后“1=1”的條件去掉,那么MyBatis所拼接出來的SQL將會如下所示:

  1. select * from t_customer where and username like concat('%',?, '%'

可以看出上面SQL語句明顯存在SQL語法錯誤,而加入了條件“1=1”后,既保證了where后面的條件成立,又避免了where后面第一個詞是and或者or之類的關(guān)鍵詞。不過“where 1=1”這種寫法對于初學者來將不容易理解,并且也不夠雅觀。

針對上述情況中“where 1=1”,在MyBatis的SQL中就可以使用< where >或< trim >元素進行動態(tài)處理。

動態(tài)SQL處理

  1. select * from t_customer 
  2.       <where
  3.            <if test="username !=null and username !=''"
  4.                  and username like concat('%',#{username}, '%'
  5.            </if> 
  6.            <if test="jobs !=null and jobs !=''"
  7.                  and jobs= #{jobs} 
  8.            </if> 
  9.       </where

< where >元素處理

< where >會自動判斷SQL語句,只有< where >內(nèi)的條件成立時,才會在拼接SQL中加入where關(guān)鍵字,否則將不會添加;還會去除多余的“AND”或“OR”。

  1. select * from t_customer 
  2.      <trim prefix="where" prefixOverrides="and"
  3.             <if test="username !=null and username !=''"
  4.                   and username like concat('%',#{username}, '%'
  5.             </if> 
  6.             <if test="jobs !=null and jobs !=''"
  7.                   and jobs= #{jobs} 
  8.             </if> 
  9.      </trim> 

5. < set >元素

“在Hibernate中,想要更新某個對象,就需要發(fā)送所有的字段給持久化對象,這種想更新的每一條數(shù)據(jù)都要將其所有的屬性都更新一遍的方法,其執(zhí)行效率是非常差的。為此,在MyBatis中可以使用動態(tài)SQL中的< set >元素進行處理:

  1. <!-- <set>元素 --> 
  2.     <update id="updateCustomer" parameterType="com.nateshao.po.Customer"
  3.         update t_customer 
  4.         <set
  5.             <if test="username !=null and username !=''"
  6.                 username=#{username}, 
  7.             </if> 
  8.             <if test="jobs !=null and jobs !=''"
  9.                 jobs=#{jobs}, 
  10.             </if> 
  11.             <if test="phone !=null and phone !=''"
  12.                 phone=#{phone}, 
  13.             </if> 
  14.         </set
  15.         where id=#{id} 
  16.     </update

使用< set >和< if >元素對username和jobs進行更新判斷,并動態(tài)組裝SQL。這樣就只需要傳入想要更新的字段即可

代碼實現(xiàn):

6. < foreach >元素

假設(shè)如下需求:在一個客戶表中有1000條數(shù)據(jù),現(xiàn)在需要將id值小于100的客戶信息全部查詢出來,這要怎么做呢?

一條一條的查詢 :那如果要查詢1000條數(shù)據(jù)呢,豈不是很累?

在Java中用for循環(huán)查詢 :考慮過N條查詢語句時的查詢效率了嗎?

針對上述需求,理想的解決方法就是使用MyBatis中動態(tài)SQL的< foreach >元素進行處理。其基本使用示例如下所示:

  1. <!--<foreach>元素使用 --> 
  2.     <select id="findCustomerByIds" parameterType="List" 
  3.             resultType="com.nateshao.po.Customer"
  4.         select * from t_customer where id in 
  5.         <foreach item="id" index="index" collection="list" open="(" 
  6.                  separator="," close=")"
  7.             #{id} 
  8.         </foreach> 
  9.     </select

關(guān)于上述示例中< foreach >元素中使用的幾種屬性的描述具體如下:

  • item:配置的是循環(huán)中當前的元素。
  • index:配置的是當前元素在集合的位置下標。
  • collection:配置的list是傳遞過來的參數(shù)類型(首字母小寫),它可以是一個array、list(或collection)、Map集合的鍵、POJO包裝類中數(shù)組或集合類型的屬性名等。
  • open和close:配置的是以什么符號將這些集合元素包裝起來。
  • separator:配置的是各個元素的間隔符。

在使用< foreach >時最關(guān)鍵也是最容易出錯的就是collection屬性,該屬性是必須指定的,而且在不同情況下,該屬性的值是不一樣的。主要有以下3種情況:

  • 如果傳入的是單參數(shù)且參數(shù)類型是一個數(shù)組或者List的時候,collection屬性值分別為array和list(或collection)。
  • 如果傳入的參數(shù)是多個的時候,就需要把它們封裝成一個Map了,當然單參數(shù)也可以封裝成Map集合,這時候collection屬性值就為Map的鍵。
  • 如果傳入的參數(shù)是POJO包裝類的時候,collection屬性值就為該包裝類中需要進行遍歷的數(shù)組或集合的屬性名。

7. < bind >元素

在入門案例中模糊查詢的SQL語句中?

  1. select * from t_customer where username like '%${value}%' 

上述SQL語句有什么不妥?

  • 如果使用“${}”進行字符串拼接,則無法防止SQL注入問題;
  • 如果改用concat函數(shù)進行拼接,則只針對MySQL數(shù)據(jù)庫有效;
  • 如果改用“||”進行字符串拼接,則只針對Oracle數(shù)據(jù)庫有效。

小提示:這樣,映射文件中的SQL就要根據(jù)不同的情況提供不同形式的實現(xiàn),這顯然是比較麻煩的,且不利于項目的移植。為了減少這種麻煩,就可以使用MyBatis的< bind >元素來解決這一問題。

MyBatis的< bind >元素可以通過OGNL表達式來創(chuàng)建一個上下文變量,其使用方式如下:

  1. <!--<bind>元素的使用:根據(jù)客戶名模糊查詢客戶信息 --> 
  2.     <select id="findCustomerByName" parameterType="com.nateshao.po.Customer" 
  3.             resultType="com.nateshao.po.Customer"
  4.         <!--_parameter.getUsername()也可直接寫成傳入的字段屬性名,即username --> 
  5.         <bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'"/> 
  6.         select * from t_customer 
  7.         where 
  8.         username like #{pattern_username} 
  9.     </select

_parameter.getUsername()表示傳遞進來的參數(shù)(也可以直接寫成對應(yīng)的參數(shù)變量名,如username)。

總結(jié) 

好了,最后我們可以了解常用動態(tài)SQL元素的主要作用,并能夠掌握這些元素在實際開發(fā)中如何使用。因為千羽在實際開發(fā)MyBatis框架中,這些動態(tài)SQL元素的使用十分重要,熟練的掌握它們能夠極大的提高開發(fā)效率。

責任編輯:武曉燕 來源: 程序員千羽
相關(guān)推薦

2017-07-26 13:00:34

EDG 戰(zhàn)旗

2015-08-26 16:38:37

mybatissql

2021-11-09 17:37:27

華為云

2021-03-02 09:15:24

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

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

2010-09-25 16:37:33

SQL動態(tài)查詢

2010-09-25 16:00:38

sql存儲過程

2010-08-05 09:07:24

2010-11-12 13:08:36

動態(tài)sql語句

2021-08-27 07:47:06

SQL靜態(tài)程序

2010-11-12 12:01:08

Oracle存儲過程

2009-09-17 16:20:43

Linq to sql

2010-11-12 13:40:38

動態(tài)sql語句

2015-10-28 10:37:13

動態(tài)數(shù)據(jù)屏蔽Dynamic datSQL Server

2010-11-12 13:20:31

SQL Server

2011-03-29 15:27:26

SQL Server 動態(tài)管理

2010-11-08 09:59:22

SQL Server動

2010-09-30 16:00:40

DB2動態(tài)SQL
點贊
收藏

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

主站蜘蛛池模板: 日韩一区二区不卡 | 91精品国产一区 | 天天摸天天看 | 女女百合av大片一区二区三区九县 | 久久99久久99久久 | 国产精品久久久久久久久久久免费看 | 色综合色综合色综合 | 久久久久网站 | 日韩最新网址 | 一级黄色在线 | 中文字幕在线第一页 | 精品无码三级在线观看视频 | 欧美a级成人淫片免费看 | av网站免费 | 国产成年人小视频 | 久久亚| 亚洲精品九九 | 丁香婷婷在线视频 | 国产成人综合亚洲欧美94在线 | 国产精品大片在线观看 | 日韩欧美一区二区三区免费看 | 视频一区二区三区中文字幕 | 日韩看片| 九九热视频这里只有精品 | av天天看| 国产美女在线播放 | 亚洲一区二区三区免费视频 | 成人av大全 | 亚洲精品大片 | 先锋资源网站 | 亚洲精品一区中文字幕 | 精品久久久久久亚洲精品 | 一a一片一级一片啪啪 | 网站黄色在线 | 国产精品av久久久久久久久久 | 可以在线看的黄色网址 | 国产日韩欧美一区二区在线播放 | 成人精品一区二区三区中文字幕 | 久久久久资源 | 亚洲人a | 中文字幕加勒比 |