版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、動態(tài) SQLMyBatis的一個強大的特性之一通常是它的動態(tài)SQL能力。如果你有使用JDBC或其他相 似框架的經(jīng)驗,你就明白條件地串聯(lián)SQL字符串在一起是多么的痛苦,確保不能忘了空格或 在列表的最后省略逗號。動態(tài)SQL可以徹底處理這種痛苦。通常使用動態(tài)SQL不可能是獨立的一部分,MyBatis當然使用一種強大的動態(tài)SQL語言來 改進這種情形,這種語言可以被用在任意映射的SQL語句中。動態(tài)SQL元素和使用JSTL或其他相似的基于XML的文本處理器相似。在MyBatis之前 的版本中,有很多的元素需要來了解。MyBatis 3大大提升了它們,現(xiàn)在用不到原先一半的元 素就能工作了。MyBatis采用
2、功能強大的基于OGNL的表達式來消除其他元素。ifchoose (when, otherwise)trim (where, set)foreachif在動態(tài)SQL中所做的最通用的事情是包含部分where字句的條件。比如:html view plaincopySELECT * FROM BLOGWHERE state = ACTIVEAND title like #title這條語句會提供一個可選的文本查找功能。如果你沒有傳遞tit le,那么所有激活的博客都 會被返回。但是如果你傳遞了 title,那么就會查找相近的title(對于敏銳的檢索,這中情 況下你的參數(shù)值需要包含任意的遮掩或通配符)
3、的博客。假若我們想可選地搜索title和author呢?首先,要改變語句的名稱讓它有意義。然后簡 單加入另外的一個條件。html view plaincopySELECT * FROM BLOG WHERE state = ACTIVEAND title like #titleAND author_name like #choose, when, otherwise有時我們不想應用所有的條件,相反我們想選擇很多情況下的一種。Java中的switch和 語句相似,MyBatis提供choose元素。我們使用上面的示例 ,但是現(xiàn)在我們來搜索當 title 提供時僅有 title 條件 ,當 aut
4、hor 提供時僅有author條件。如果二者都沒提供,只返回featured blogs(也許是由管理員策 略地選擇的結(jié)果列表, 而不是返回大量沒有意義的隨機博客結(jié)果列表)。html view plaincopySELECT * FROM BLOG WHERE state = ACTIVEAND title like #titleAND author_name like #AND featured = 1trim, where, set前面的例子已經(jīng)方便地處理了一個臭名昭著的動態(tài)SQL問題。要考慮我們回到“if”示例 后會發(fā)生什么,但是這次我們將“ ACTIVE = 1”也設置成動態(tài)的條件。h
5、tml view plaincopySELECT * FROM BLOGWHEREstate = #stateAND title like #titleAND author_name like #如果這些條件都沒有匹配上將會發(fā)生什么?這條 SQL 結(jié)束時就會成這樣:html view plaincopySELECT * FROM BLOGWHERE這會導致查詢失敗。如果僅僅第二個條件匹配是什么樣的?這條 SQL 結(jié)束時就會是這樣: html view plaincopySELECT * FROM BLOGWHEREAND title like someTitle 這個查詢也會失敗。這個問題不能
6、簡單的用條件來解決,如果你從來沒有這樣寫過,那么你以 后也不會這樣來寫。MyBatis有一個簡單的處理,這在90%的情況下都會有用。而在不能使用的地方,你可以自定 義處理方式。加上一個簡單的改變,所有事情都會順利進行:html view plaincopySELECT * FROM BLOGstate = #stateAND title like #titleAND author_name like #where元素知道如果由被包含的標記返回任意內(nèi)容,就僅僅插入“WHERE”。而且,如果以“AND” 或“0R”開頭的內(nèi)容,那么就會跳過WHERE不插入。如果where元素沒有做出你想要的,你可以
7、使用trim元素來自定義。比如,和where元素 相等的trim元素是:html view plaincopyprefixOverrides屬性采用管道文本分隔符來覆蓋,這里的空白也是重要的。它的結(jié)果就是 移除在prefixOverrides屬性中指定的內(nèi)容,插入在with屬性中的內(nèi)容。和動態(tài)更新語句相似的解決方案是set。set元素可以被用于動態(tài)包含更新的列,而不包含 不需更新的。比如:html view plaincopy update Authorusername=#username,password=#password,email=#email,bio=#biowhere id=#id
8、這里,set元素會動態(tài)前置SET關(guān)鍵字,而且也會消除任意無關(guān)的逗號,那也許在應用條件 之后來跟蹤定義的值。如果你對和這相等的 trim 元素好奇, 它看起來就是這樣的:html view plaincopy注意這種情況下我們覆蓋一個后綴, 而同時也附加前綴。foreach另外一個動態(tài) SQL 通用的必要操作是迭代一個集合,通常是構(gòu)建在 IN 條件中的。比如: html view plaincopySELECT *FROM POST PWHERE ID in#itemforeach 元素是非常強大的,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在 元素體內(nèi)。它也允許你指定開放和關(guān)閉的字
9、符串,在迭代之間放置分隔符。這個元素是很智 能的,它不會偶然地附加多余的分隔符。注意你可以傳遞一個List實例或者數(shù)組作為參數(shù)對象傳給MyBatis。當你這么做的時 候,MyBatis會自動將它包裝在一個Map中,用名稱在作為鍵。List實例將會以“l(fā)ist”作 為鍵,而數(shù)組實例將會以“array”作為鍵。這個部分是對關(guān)于 XML 配置文件和 XML 映射文件的而討論的。下一部分將詳細討論 Java API, 所以你可以得到你已經(jīng)創(chuàng)建的最有效的映射。= 動態(tài) SQL = !一插入,參數(shù)是User對象,使用自動增長的ID insert id=insert parameterType=User u
10、seGeneratedKeys=true keyProperty=id!-就是普通的插入語句,這里使用#xxx的方式賦值,這里的xxx要和實 體類中的屬性對應 -insert into t_user(name , password , email , gender , age) values(#name , #password , #email , #gender , #age) update t_user setname=#name,password=#password,email=#email,gender=#gender,age=#age where id=#id!一根據(jù)用戶ID,刪除一
11、個用戶一delete from t_user where id=#id /delete!- 查詢所有用戶 -select id=selectUser resultType=User select * from t_user/select!-根據(jù)用戶ID,查詢用戶-select id=queryById parameterType=int resultType=User select * from t_user where id=#id/select!- 根據(jù)用戶名,查找用戶 -select id=queryByName parameterType=String resultType=User
12、select *from t_user where name=#name/select/mapper主要看一下,插入,和更新,可能會發(fā)現(xiàn)一些問題,例如:在插入的時候用戶信息可能并不 全,在更新的時候,我們并不像更新所有的信息。其實,如果用查詢來說明的話,會更好理解。那該怎么辦呢?MyBatis 提供了很方便的做法:MyBatis 的一個強大的特性之一通常是它的動態(tài) SQL 能力。如果你有使用 JDBC 或其他相似框架的經(jīng)驗,你就明白條件地串聯(lián) SQL 字符串在一起是多么的痛苦,確保不能忘 了空格或在列表的最后省略逗號。動態(tài) SQL 可以徹底處理這種痛苦。通常使用動態(tài) SQL 不可能是獨立的一部
13、分 ,MyBatis 當然使用一種強大的動態(tài) SQL 語言來改進這種情形,這種語言可以被用在任意映射的 SQL 語句中。動態(tài) SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本處理器相似。在MyBatis之前的版本中,有很多的元素需要來了解。MyBatis 3大大提升了它們,現(xiàn)在用不到 原先一半的元素就能工作了。MyBatis采用功能強大的基于OGNL的表達式來消除其他元素。ifchoose (when, otherwise)trim (where, set)foreach我們來修改一下 update:html view plaincopyupdate t_username=#na
14、me,password=#passwordemail=#emailage=#agegender=#genderwhere id=#idMyBatis批量插入(Oracle數(shù)據(jù)庫)SELEC T S_FORUM_USERID.NEXTVAL FROM DUAL INSERT INTO DEPT(DEPTNO , DNAME , LOC)SELECT S_FORUM_USERID.NEXTVAL , A.* FROM (SELECT #item.dname , #item.loc FROM DUAL)AMybatis 批量插入、存儲過程這篇博客介紹了批量插入的幾種方式:simple方式(基本數(shù)據(jù)庫
15、逐條訪問)、batch方式(批 量操作)、procedure方式(存儲過程)并且通過測試,說明了他們的效率MyBatis 的關(guān)于批量數(shù)據(jù)操作的體會這篇博客介紹了專門為批量操作準備的方法和普通方法的對比,session = sessionFactory.openSession(ExecutorType.BATCH, true);/用于批量 update簡單說明一下在Oracle中的批量插入和刪除teacher-mapper.xmlhtml view plaincopySELECT STUDENT.ID STUDENT_ID , STUDENT.NAMESTUDENT_NAME ,TEACHER.
16、ID TEACHER_ID,TEACHER.NAME TEACHER_NAME FROM T_YGY_DEMO_TEACHER TEACHERJOIN T_YGY_DEMO_STUDENT STUDENTON STUDENT.TEACHERID = TEACHER.IDINSERT INTO T_YGY_DEMO_TEACHER(ID , NAME)SELECT#teacher.id , # FROM DUALDELETE FROM T_YGY_DEMO_TEACHER WHERE ID IN#teacher.id這里主要使用了 foreach,下面會說一下他的用法java view plai
17、ncopypackage org.ygy.demo.batch.dao.impl;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.ygy.demo.batch.dao.ITeacherDao;import org.ygy.demo.batch.entity.TeacherEntity;import mon.util.MyBatisUtil;public class TeacherDao implements ITeacherDao privatestaticfinalStringNAMES
18、PACE=org.ygy.demo.batch.mapper.TeacherMapper;Overridepublic List queryAll() SqlSession session = MyBatisUtil.getSession();List teachers = session.selectList(NAMESPACE + .queryAll);session.close();return teachers;Overridepublic void batchInsert(List teachers) SqlSession session = MyBatisUtil.getSessi
19、on(); session.insert(NAMESPACE + .batchInsert , teachers);mit(); session.close();Overridepublic void batchDelete(List teachers) SqlSession session = MyBatisUtil.getSession();session.delete(NAMESPACE + .batchDelete , teachers); mit();session.close();在批量插入的時候,在Oracle如果使用了序列,讓主鍵ID自動增長,可以參考我之前的博 客:MyBat
20、is批量插入(Oracle數(shù)據(jù)庫)foreach 的用法:foreach的主要用在構(gòu)建in條件中,它可以在SQL語句中進行 迭代一個集合。foreach元 素的屬性主要有 item, index, collection, open, separator, close。 item 表示集合中 每一個元素進行迭代時的別名, index 指 定一個名字,用于表示在迭代過程中,每次迭代 到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作 為分隔符,close表示以什么結(jié)束,在使用foreach的時候最關(guān)鍵的也是最容易出錯的就 是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的, 主要有一下3 種情況:如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array 3如果傳入的參數(shù)是多個的時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版小型餐飲員工勞務簡單的合同
- 2025其它貿(mào)易合同銷售確認書
- 二零二五年度雙贏合作:股權(quán)轉(zhuǎn)讓與投資框架協(xié)議2篇
- 2024版全新業(yè)務外包承包合同下載
- 2024年金融機構(gòu)居間協(xié)議存款服務合同3篇
- 九年級歷史《殖民地人民的反抗與資本主義制度的擴展》作業(yè)設計
- 二零二五年度水電工程變更承包協(xié)議3篇
- 2025年不銹鋼棒材項目立項申請報告模板
- 二零二五年度影視制作合伙集資協(xié)議書3篇
- 2025年水泥混凝土制品項目申請報告
- 8.臺球助教速成培訓手冊0.9萬字
- 無縫鋼管焊接作業(yè)指導書(1)
- 零缺陷與質(zhì)量成本
- 網(wǎng)吧企業(yè)章程范本
- 安徽省書法家協(xié)會會員登記表
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 五格數(shù)理解釋及吉兇對照
- 婚姻狀況聲明書
- 新課程理念下的班主任工作藝術(shù)
- 領(lǐng)導激勵藝術(shù)教材
- 水泥罐抗傾覆驗算7頁
評論
0/150
提交評論