二、SQL語句映射文件(2)增刪改查、參數(shù)、緩存概要_第1頁
二、SQL語句映射文件(2)增刪改查、參數(shù)、緩存概要_第2頁
二、SQL語句映射文件(2)增刪改查、參數(shù)、緩存概要_第3頁
二、SQL語句映射文件(2)增刪改查、參數(shù)、緩存概要_第4頁
二、SQL語句映射文件(2)增刪改查、參數(shù)、緩存概要_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、2.2 select一個select元素非常簡單。例如:Xml代碼冏<!-查詢學生,根據(jù)id ->vselect id="getStude nt" parameterType="Stri ng" resultMap="stude ntResultMap">SELECT ST.STUDENT_ID,ST.STUDENT_NAME,ST.STUDENT_SEX,ST.STUDENT_BIRTHDAY ,ST.CLASS_IDFROM STUDENT_TBL STWHERE ST.STUDENT_ID = #stude n

2、tID</select>這條語句就叫做getStudnt,有一個String參數(shù),并返回一個StudentEntity類型的對象。注意參數(shù)的標識是:#studentID。select語句屬性配置細節(jié):屬性描述取值默認id在這個模式下唯一的標識符,可被其它語句引用paramet erType傳給此語句的參數(shù)的完整類名或別名resultTy pe語句返回值類型的整類名或別名。注意,如果是集合,那么這里填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType與result Map不能并用)resultM ap引用的外部resultMap名。結(jié)果集映射是 MyBatis

3、中最強 大的特性。許多復雜的映射都可以輕松解決。(resultType與resultMap不能并用)flushCa che如果設(shè)為true,則會在每次語句調(diào)用的時候就會清空緩 存。select語句默認設(shè)為falsetrue|falsefalseuseCach e如果設(shè)為true,則語句的結(jié)果集將被緩存。select語句默認設(shè)為 false true|false falsetimeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間, 默認為不設(shè)值,由驅(qū)動器自己決定true|falsefalsetimeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默認為不設(shè)值,由驅(qū)動器自己決定正整數(shù)未設(shè)置fetch

4、Siz e設(shè)置一個值后,驅(qū)動器會在結(jié)果集數(shù)目達到此數(shù)值后,激發(fā)返回,默認為不設(shè)值,由驅(qū)動器自己決定正整數(shù)驅(qū)動器決定stateme n tTypestatement,preparedstatement, callablestatement。 預準備語句、可調(diào)用語句STATEMENTPREPAREDCALLABLEPREPAREDresultSe tTypeforward_only , scroll_sensitive , scroll_insensitive 只轉(zhuǎn)發(fā),滾動敏感,不區(qū)分大小寫的滾動FORWARD_O NLY SCROLL_SE NSITIVE SCROLL_INS ENSITIVE

5、驅(qū)動器決定2.3 insert一個簡單的insert語句:Xml代碼頂<!-插入學生 -><in sert id="i nsertStude nt" parameterType="Stude ntEn tity">INSERT INTO STUDENT_TBL (STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY CLASS_ID)VALUES (#stude ntID,#studen tName,#studen tSex,#studen tBirthday,#class

6、En tity.classID)</in sert>insert可以使用數(shù)據(jù)庫支持的自動生成主鍵策略,設(shè)置useGeneratedKeys= ” tru然后把keyProperty設(shè)成對應(yīng)的列,就搞定了。比如說上面的StudentEntity使用auto-generated為id列生成主鍵.還可以使用selectKey元素。下面例子,使用mysql數(shù)據(jù)庫nextval('student')為自定義函數(shù),用來生成一個key。Xml代碼芮<!-插入學生自動主鍵->vinsert id="i nsertStude ntAutoKey" pa

7、rameterType="Stude ntEn tity"><selectKey keyProperty="stude ntID" resultType="Stri ng" order="BEFORE"> select n extval('stude nt')</selectKey>INSERT INTO STUDENT_TBL (STUDENT_ID,STUDENT_NAME,STUDENT_SEX,STUDENT_BIRTHDAY ,CLASS_ID) VALUES

8、(#stude ntID,#stude ntName, #stude ntSex, #stude ntBirthday, #classE ntity.classID) </in sert>insert語句屬性配置細節(jié):屬性描述取值默認id在這個模式下唯一的標識符,可被其它語句引用parameterT ype傳給此語句的參數(shù)的完整類名或別名flushCache如果設(shè)為true,則會在每次語句調(diào)用的時候就會清空緩存。 select語句默認設(shè)為falsetrue|falsefalseuseCache如果設(shè)為true,則語句的結(jié)果集將被緩存。select語句默認設(shè)為 false true|

9、false falsetimeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默 認為不設(shè)值,由驅(qū)動器自己決定true|falsefalsetimeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默認為不設(shè) 值,由驅(qū)動器自己決定正整數(shù)未設(shè)置fetchSize設(shè)置一個值后,驅(qū)動器會在結(jié)果集數(shù)目達到此數(shù)值后,激發(fā) 返回,默認為不設(shè)值,由驅(qū)動器自己決定正整數(shù)驅(qū)動器決定stateme ntT ypestatement, preparedstatement, callablestatement。 預準備語句、可調(diào)用語句STATE MENT PREPA RED CALL ABLEPREPAREDuseGe

10、 nerat edKeys告訴 MyBatis 使用JDBC的getGeneratedKeys方法來獲取 數(shù)據(jù)庫自己生成的主鍵(MySQL、SQLSERVER 等 關(guān)系型數(shù)據(jù)庫會有自動生成的字段)。默認:falsetrue|falsefalsekeyPropert y標識一個將要被MyBatis設(shè)置進 getGeneratedKeys的key所返回的值,或者為insert語句使用一個 selectKey 子元素。selectKey語句屬性配置細節(jié):屬性描述取值keyProper tyselectKey語句生成結(jié)果需要設(shè)置的屬性。resultType生成結(jié)果類型,MyBatis允許使用基本的數(shù)據(jù)

11、類型,包括String、int類型。order可以設(shè)成BEFORE或者AFTER,如果設(shè)為BEFORE,那它會先選擇 主鍵,然后設(shè)置 keyProperty,再執(zhí)行insert語句;如果設(shè)為 AFTER, 它就先運行insert語句再運行 selectKey語句,通常是insert語句中 內(nèi)部調(diào)用數(shù)據(jù)庫(像 Oracle)內(nèi)嵌的序列機制。BEFOREAFTERstateme ntType像上面 的那樣,MyBatis 支持 STATEMENT, PREPARED 和CALLABLE 的語句形式,對應(yīng) Statement , PreparedStatement 和CallableStatemen

12、t 響應(yīng)STATE MENT PREPAR ED CALLA BLE2.4 update、delete一個簡單的update:Xml代碼茜<!-更新學生信息 -><update id="updateStude nt" parameterType="Stude ntEn tity">UPDATE STUDENT_TBLSET STUDENT_TBL.STUDENT_NAME = #stude ntName, STUDENT_TBL.STUDENT_SEX = #stude ntSex, STUDENT_TBL.STUDENT_BIR

13、THDAY = #stude ntBirthday, STUDENT_TBL.CLASS_ID = #classE ntity.classID WHERE STUDENT_TBL.STUDENT_ID = #stude ntID;</update>一個簡單的delete:Xml代碼罰<!-刪除學生-><delete id="deleteStudent" parameterType="StudentEntity">DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #stude ntID

14、 </delete>update> delete語句屬性配置細節(jié):屬性描述取值默認id:在這個模式下唯一的標識符,可被其它語句引用paramete rType傳給此語句的參數(shù)的完整類名或別名flushCac he如果設(shè)為true,則會在每次語句調(diào)用的時候就會清空緩存。select語句默認設(shè)為falsetrue|fals efalseuseCach如果設(shè)為true,則語句的結(jié)果集將被緩存。select語句默認設(shè)true|falsfalsee為 false true|false falsetimeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默認 為不設(shè)值,由驅(qū)動器自己決定et

15、imeout設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默認為不設(shè) 值,由驅(qū)動器自己決定正整數(shù)未設(shè)置fetchSize設(shè)置一個值后,驅(qū)動器會在結(jié)果集數(shù)目達到此數(shù)值后,激發(fā)返回,默認為不設(shè)值,由驅(qū)動器自己決定正整數(shù)驅(qū)動器決定stateme n tTypestatement, preparedstatement, callablestatement。 預準備語句、可調(diào)用語句STATE MENT PREPA RED CALL ABLEPREPARED2.5 sqlSql元素用來定義一個可以復用的SQL語句段,供其它語句調(diào)用。比如:Xml代碼苗<!-復用sql語句 查詢student表所有字段 -

16、><sql id="selectStude ntAll">SELECT ST.STUDENT_ID,ST.STUDENT_NAME,ST.STUDENT_SEX,ST.STUDENT_BIRTHDAY ,ST.CLASS_IDFROM STUDENT_TBL ST</sql>這樣,在select的語句中就可以直接引用使用了,將上面select語句改成:Xml代碼冏<!-查詢學生,根據(jù)id -><select id="getStude nt" parameterType="Stri ng"

17、 resultMap="stude ntResultMap"><i nclude refid="selectStude ntAII"/>WHERE ST.STUDENT_ID = #stude ntID</select>2.6parameters上面很多地方已經(jīng)用到了參數(shù),比如查詢、修改、刪除的條件,插入,修改的數(shù)據(jù) 等,MyBatis可以使用的基本數(shù)據(jù)類型和Java的復雜數(shù)據(jù)類型?;緮?shù)據(jù)類型,String , int,date等。Java實體類,或 Map但是使用基本數(shù)據(jù)類型,只能提供一個參數(shù),所以需要使用類型做參數(shù)類型

18、。通過 #可以直接得到其屬性。2.6.1基本類型參數(shù)根據(jù)入學時間,檢索學生列表:Xml代碼parameterType="Date"<!-查詢學生list,根據(jù)入學時間 -> vselectid="getStude ntListByDate"resultMap="stude ntResultMap">SELECT *FROM STUDENT_TBL ST LEFT JOIN CLASS_TBL CT ON ST.CLASS_ID = CT.CLASS_IDWHERE CT.CLASS_YEAR = #classYear

19、;</select>Java代碼已List<Stude ntEn tity>stude ntListstude ntMapper.getStude ntListByClassYear(Stri ngUtil.parse("2007-9-1"); for (StudentEntity entityTemp : studentList) System.out.pri ntln(en tityTemp.toStri ng();2.6.2Java實體類型參數(shù)根據(jù)姓名和性別,檢索學生列表。使用實體類做參數(shù):Xml代碼芮<!-查詢學生list, like姓

20、名、=性別,參數(shù) entity類型->vselectid="getStude ntListWhereE ntity"parameterType="Stude ntEn tity"resultMap="stude ntResultMap">SELECT * from STUDENT_TBL STWHERE ST.STUDENT_NAMELIKE CONCAT(CONCA T('%',#stude ntName),'%')AND ST.STUDENT_SEX = #stude ntSex<

21、/select>Java代碼冏Stude ntE ntity en tity = new Stude ntEn tity();en tity.setStude ntName("李");entity.setStudentSex("男");ListvStude ntEn tity> stude ntList = stude ntMapper.getStude ntListWhereE ntity(e ntity);for (StudentEntity entityTemp : studentList) System.out.pri ntln(en

22、 tityTemp.toStri ng();2.6.3Map 參數(shù)根據(jù)姓名和性別,檢索學生列表。使用Map做參數(shù):Xml代碼parameterType="Map"<!-查詢學生list,=性別,參數(shù) map類型-> vselectid="getStude ntListWhereMap"resultMap="stude ntResultMap">SELECT * from STUDENT_TBL STWHERE ST.STUDENT_SEX = #sexAND ST.STUDENT_SEX = #sex</sel

23、ect>Java代碼曲Map<Stri ng. Stringmap = new HashMap<Stri ng. Strin g>(); map.put("sex","女”);map.put(”name","李");List<Stude ntEn tity> stude ntList = stude ntMapper.getStude ntListWhereMap(map); for (StudentEntity entityTemp : studentList) System.out.pri nt

24、ln(en tityTemp.toStri ng();2.6.4多參數(shù)的實現(xiàn)如果想傳入多個參數(shù),則需要在接口的參數(shù)上添加Param注解。給出一個實例:接口寫法:Java代碼題public List<Stude ntEn tity> getStude ntListWhereParam(Param(value = "n ame") Stri ng name, Param(value = "sex") String sex, Param(value = "birthday") Date birthdar, Param(value

25、 = "classE ntity") ClassE ntity classE ntity);SQL寫法:Xml代碼甸<!-查詢學生list, like姓名、=性別、=生日、=班級,多參數(shù)方式 ->vselect id="getStude ntListWhereParam" resultMap="stude ntResult Map ">SELECT * from STUDENT_TBL ST<where><if test="name!=null and name!=""

26、>ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #n ame),'%')</if><if test="sex!= null and sex!= ” ">AND ST.STUDENT_SEX = #sex</if><if test="birthday!=null"AND ST.STUDENT_BIRTHDAY = #birthday</if><iftest="classE ntity!=n ullandclassE

27、ntity.classID!=n ullandclassE ntity.classlD!="">AND ST.CLASS_ID = #classE ntity.classID</if></where></select>進行查詢:Java代碼"由List<Stude ntEn tity>stude ntList=stude ntMapper.getStude ntListWhereParam("","”,Stri ngUtil.parse("1985-05-28"

28、), classM apper.getClassBylD("20000002");for (StudentEntity entityTemp : studentList) System.out.pri ntln(en tityTemp.toStri ng();2.6.5字符串代入法默認的情況下,使用#語法會促使 MyBatis生成PreparedStatement屬性并且使用 PreparedStatement的參數(shù)(=?)來安全的設(shè)置值。 盡量這些是快捷安全,也是經(jīng)常使用的。但有時候你可能想直接未更改的字符串代入到SQL語句中。比如說,對于ORDER BY,你可能會這樣使用:ORDER BY $columnName但MyBatis不會修改和規(guī)避掉這個字符串。注意:這樣地接收和應(yīng)用一個用戶輸入到未更改的語句中, 讓用戶能植入破壞代碼, 所以,要么要求字段不要允許客戶輸入, 法性。是非常不安全的。這會 要么你直接來檢測他的合2.7 cache 緩存MyBatis包含一個強在的、可配置、可定制的緩存機制。MyBatis 3的緩存實現(xiàn)有了許多改進,既強勁也更容易配置。默認的情況,緩存是沒有開啟,除了會話緩存以外,它 可以提高性能,且能解決全局依賴。開啟二級緩存,你只需要在SQL映射文件中加入簡單的一行:&l

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論